zhamao-framework/src/ZM/Command/BuildCommand.php

99 lines
3.7 KiB
PHP
Raw Normal View History

2020-08-31 10:11:06 +08:00
<?php
namespace ZM\Command;
use Phar;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use ZM\Console\TermColor;
2021-06-16 00:17:30 +08:00
use ZM\Utils\DataProvider;
2020-08-31 10:11:06 +08:00
class BuildCommand extends Command
{
// the name of the command (the part after "bin/console")
protected static $defaultName = 'build';
/**
* @var OutputInterface
*/
private $output = null;
protected function configure() {
$this->setDescription("Build an \".phar\" file | 将项目构建一个phar包");
2021-06-16 00:17:30 +08:00
$this->setHelp("此功能将会把整个项目打包为phar");
2020-08-31 10:11:06 +08:00
$this->addOption("target", "D", InputOption::VALUE_REQUIRED, "Output Directory | 指定输出目录");
// ...
}
protected function execute(InputInterface $input, OutputInterface $output): int {
2020-08-31 10:11:06 +08:00
$this->output = $output;
2021-06-16 00:17:30 +08:00
$target_dir = $input->getOption("target") ?? (WORKING_DIR);
2020-08-31 10:11:06 +08:00
if (mb_strpos($target_dir, "../")) $target_dir = realpath($target_dir);
if ($target_dir === false) {
2021-06-16 00:17:30 +08:00
$output->writeln(TermColor::color8(31) . zm_internal_errcode("E00039") . "Error: No such file or directory (" . $target_dir . ")" . TermColor::RESET);
2021-04-06 01:19:56 +08:00
return 1;
2020-08-31 10:11:06 +08:00
}
2021-06-16 00:17:30 +08:00
$output->writeln("Target: " . $target_dir);
2020-08-31 10:11:06 +08:00
if (mb_substr($target_dir, -1, 1) !== '/') $target_dir .= "/";
if (ini_get('phar.readonly') == 1) {
2021-06-16 00:17:30 +08:00
$output->writeln(TermColor::color8(31) . zm_internal_errcode("E00040") . "You need to set \"phar.readonly\" to \"Off\"!");
2020-08-31 10:11:06 +08:00
$output->writeln(TermColor::color8(31) . "See: https://stackoverflow.com/questions/34667606/cant-enable-phar-writing");
2021-04-06 01:19:56 +08:00
return 1;
2020-08-31 10:11:06 +08:00
}
if (!is_dir($target_dir)) {
2021-06-16 00:17:30 +08:00
$output->writeln(TermColor::color8(31) . zm_internal_errcode("E00039") . "Error: No such file or directory ($target_dir)" . TermColor::RESET);
2021-04-06 01:19:56 +08:00
return 1;
2020-08-31 10:11:06 +08:00
}
$filename = "server.phar";
$this->build($target_dir, $filename);
2021-04-06 01:19:56 +08:00
return 0;
2020-08-31 10:11:06 +08:00
}
2021-02-09 17:09:09 +08:00
private function build($target_dir, $filename) {
2020-08-31 10:11:06 +08:00
@unlink($target_dir . $filename);
$phar = new Phar($target_dir . $filename);
$phar->startBuffering();
2021-06-16 00:17:30 +08:00
$allow_dir = ["bin", "config", "resources", "src", "vendor", "composer.json", "README.md", "zhamao"];
$archive_dir = DataProvider::getSourceRootDir();
$scan = scandir($archive_dir);
if ($scan[0] == ".") {
unset($scan[0], $scan[1]);
}
foreach ($scan as $v) {
if (in_array($v, $allow_dir)) {
if (is_dir($archive_dir . "/" . $v)) {
$this->addDirectory($phar, $archive_dir . "/" . $v, $v);
} elseif (is_file($archive_dir . "/" . $v)) {
$phar->addFile($archive_dir . "/" . $v, $v);
}
}
}
$phar->setStub(
"#!/usr/bin/env php\n" .
$phar->createDefaultStub(LOAD_MODE == 0 ? "src/entry.php" : "vendor/zhamao/framework/src/entry.php")
);
2020-08-31 10:11:06 +08:00
$phar->stopBuffering();
$this->output->writeln("Successfully built. Location: " . $target_dir . "$filename");
}
2021-06-16 00:17:30 +08:00
private function addDirectory(Phar $phar, $dir, $local_dir) {
$o = scandir($dir);
if ($o[0] == ".") {
unset($o[0], $o[1]);
}
foreach ($o as $v) {
if (is_dir($dir . "/" . $v)) {
$this->addDirectory($phar, $dir . "/" . $v, $local_dir . "/" . $v);
} elseif (is_file($dir . "/" . $v)) {
$phar->addFile($dir . "/" . $v, $local_dir . "/" . $v);
}
}
}
2020-08-31 10:11:06 +08:00
}