From dd2bb032ddb8d37661f3f2b6d9e5f560e51e6f64 Mon Sep 17 00:00:00 2001 From: Christopher Vagnetoft Date: Tue, 10 Jan 2017 01:34:08 +0100 Subject: [PATCH] Added minification and manifest generation (-n) --- src/MakePhar/Application.php | 46 ++++++++++++++++++++++++++++++++++-- src/MakePhar/PharBuilder.php | 24 +++++++++++++++++-- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/MakePhar/Application.php b/src/MakePhar/Application.php index e1b655d..5b7978e 100644 --- a/src/MakePhar/Application.php +++ b/src/MakePhar/Application.php @@ -9,11 +9,12 @@ class Application private function parseCommandLine() { - $opts = "h"; - $long = [ 'help' ]; + $opts = "hn"; + $long = [ 'help', 'new' ]; $parsed = getopt($opts, $long); $config = [ + 'init' => false, 'help' => false, 'manifest' => getcwd()."/makephar.sdl", 'output' => null, @@ -25,6 +26,10 @@ class Application case 'help': $config['help'] = true; break; + case 'n': + case 'new': + $config['init'] = true; + break; } $this->config = (object)$config; @@ -34,6 +39,7 @@ class Application { printf("Usage: makephar [opts]\n"); printf("Options: -h,--help Show this help\n"); + printf(" -n,--new Create a new configuration file\n"); } public function run() @@ -44,6 +50,42 @@ class Application $this->printHelp(); return; } + if ($this->config->init) { + if (!file_exists("composer.json")) { + log_error("No composer.json in current directory"); + return 1; + } + $proj = json_decode(file_get_contents("composer.json")); + $proj_name = basename(getcwd()).".phar"; + $proj_files = []; + $proj_dirs = []; + if (!empty($proj->autoload)) { + foreach ((array)$proj->autoload as $type=>$loaders) { + if ($type == 'files') { + $proj_files = array_merge($proj_files, $loaders); + } else { + foreach ($loaders as $ns=>$path) { + $dir = rtrim($path," /"); + if (!in_array($dir,$proj_dirs)) { + $proj_dirs[] = $dir; + } + } + } + } + printf("phar \"%s\" {\n", $proj_name); + printf(" include {\n"); + foreach ($proj_files as $file) + printf(" file \"%s\";\n", $file); + foreach ($proj_dirs as $dir) + printf(" dir \"%s\";\n", $dir); + printf(" dir \"vendor\";\n"); + printf(" }\n"); + printf(" // stub \"src/path-to-stub.php\";\n"); + printf("}\n"); + } + + return; + } $this->buildManifest(); } diff --git a/src/MakePhar/PharBuilder.php b/src/MakePhar/PharBuilder.php index 7ed3989..4cf5070 100644 --- a/src/MakePhar/PharBuilder.php +++ b/src/MakePhar/PharBuilder.php @@ -27,20 +27,37 @@ class PharBuilder { // Create the phar $phar = new \Phar("/tmp/output.phar"); + $vo = posix_isatty(STDOUT); // Add files log_debug("Adding files to phar archive..."); + $t = count($this->files); $i = 0; $lp = null; + $phar->startBuffering(); foreach ($this->files as $file) { - $phar->addFile($file->dest?:$file->src, $file->src); + $i++; + $tp = dirname($file->src); + if ($tp!=$lp) { + $lp=$tp; + printf("\r\e[K%d/%d %s", $i, $t, $tp); + } + if (fnmatch("*.php",$file->src)) { + $phar->addFromString($file->dest?:$file->src, php_strip_whitespace($file->src)); + } else { + $phar->addFile($file->dest?:$file->src, $file->src); + } } + ($vo) && printf("\r\e[K"); + $phar->stopBuffering(); // Create stub if ($this->manifest->getIsLibrary()) { log_debug("Creating library stub..."); // Create library stub $stub = 'manifest->getStubFile())) { + $stub.= 'require_once __DIR__."/'.ltrim($stubfile,'/').'";'; + } $phar->addFromString("index.php", $stub); } else { log_debug("Creating application stub..."); @@ -50,6 +67,9 @@ class PharBuilder $phar->addFromString("index.php", $stub); // Make the phar stub executable $mainstub = $phar->createDefaultStub("index.php"); + $tmp = "/tmp/".uniqid("stub"); file_put_contents($tmp, $mainstub); + $mainstub = php_strip_whitespace($tmp); + unlink($tmp); $mainstub = "#!/usr/bin/env php\n{$mainstub}"; $phar->setStub($mainstub); }