#!/usr/bin/env php?php define("PHAR_BUILDER_VERSION", "0.1.0"); function usage($self, $ln = PHP_EOL) { echo "Usage: {$self} phar [options]{$ln}"; echo "phar Path to an existing Phar archive or to-be-created archive.{$ln}"; echo " The file n
#!/usr/bin/env php
<?php
define("PHAR_BUILDER_VERSION", "0.1.0");
function usage($self, $ln = PHP_EOL) {
echo "Usage: {$self} phar [options]{$ln}";
echo "phar Path to an existing Phar archive or to-be-created archive.{$ln}";
echo " The file name's extension must contain .phar.{$ln}";
echo "options:{$ln}";
echo " --alias Alias with which this Phar archive{$ln}";
echo " should be referred to in calls to stream functionality.{$ln}";
echo " default value is basename(path).{$ln}";
echo " --path The full or relative path to the directory{$ln}";
echo " that contains all files to add to the archive.{$ln}";
echo " --filter An optional pcre regular expression that is used to filter the list of files.{$ln}";
echo " Only file paths matching the regular expression will be included in the archive.{$ln}";
echo " --files files that add to the archive, seperator is ','{$ln}";
echo " --compress gz or bz2{$ln}";
echo " --index Relative path within the phar archive to run if accessed on the command-line{$ln}";
echo " --webindex Relative path within the phar archive to run if accessed through a web browser{$ln}";
echo " --stub A string or file path handle to use as the executable stub for this phar archive.{$ln}";
echo "{$ln}";
exit(1);
}
function error($message, $ln = PHP_EOL) {
echo "Error: {$message}{$ln}";
exit(1);
}
function info($message, $ln = PHP_EOL) {
echo "{$message}{$ln}";
}
/**
* 解释参数,可以解释以下类型:
* -p
* -pVALUE
* -p value
* --param value
* -p=value
* --param=value
* param=value
* @param array $argv
* @return array
*/
function args_parse($argv) {
if (!is_array($argv) || empty($argv)) {
return array();
}
$argc = count($argv);
$ret = array();
for ($i = 0; $i < $argc; ++$i) {
$arg = $argv[$i];
if (strpos($arg, '=') > 0) { // -p=value --param=value param=value
list($arg_name, $arg_value) = explode('=', ltrim($arg, '-'), 2);
$ret[$arg_name] = $arg_value;
continue;
}
if ($arg{0} !== '-') {
continue;
}
if (($arg{1} !== '-') && isset($arg{2})) {// -pVALUE
$ret[$arg{1}] = substr($arg, 2);
continue;
} else if (isset($argv[$i + 1]) && ($argv[$i + 1]{0} !== '-') && (false === strpos($arg, '='))) {
$ret[ltrim($arg, '-')] = $argv[$i + 1];
++$i;
} else {
$ret[ltrim($arg, '-')] = true;
}
}
return $ret;
}
info("Phar Builder " . PHAR_BUILDER_VERSION);
if ('cli' !== PHP_SAPI) {
error("Run for command line only.");
}
if (false === Phar::canWrite()) {
error("Phar can not write, Set \\"phar.readonly = Off\\" in php.ini.");
}
$self = array_shift($argv);
if (empty($argv[0])) {
usage($self);
}
$path = array_shift($argv);
$args = args_parse($argv);
$stub = empty($args['stub']) ? '' : $args['stub'];
$flags = 0;
$files = empty($args['files']) ? '' : $args['files'];
$alias = empty($args['alias']) ? basename($path) : $args['alias'];
$regex = empty($args['filter']) ? null : $args['filter'];
$base_dir = empty($args['path']) ? '' : $args['path'];
$arg_compress = empty($args['compress']) ? '' : $args['compress'];
$index = empty($args['index']) ? '' : $args['index'];
$webindex = empty($args['webindex']) ? '' : $args['webindex'];
switch ($arg_compress) {
case 'gz':
$compress = Phar::GZ;
$compress_type = 'gz';
break;
case 'bz2':
$compress = Phar::BZ2;
$compress_type = 'bz2';
break;
default :
$compress = Phar::NONE;
$compress_type = 'none';
break;
}
if (!empty($base_dir) && !is_dir($base_dir)) {
error("Dir not Exists!");
}
try {
$p = new Phar($path, $flags, $alias);
$p->startBuffering();
$p->compress($compress);
info("API Version: " . Phar::apiVersion());
info("File: {$path}");
info("Alias: {$alias}");
info("Compress: {$compress_type}");
if (!empty($base_dir)) {
info("Build From: {$base_dir}");
if ($regex) {
info("Filter: {$regex}");
}
$p->buildFromDirectory($base_dir, $regex);
}
if (!empty($files)) {
foreach (explode(',', $files) as $file) {
info("Add File: {$file}");
$p->addFile($file, basename($file));
}
}
if ($index && $webindex) {
info("Index: {$index}");
info("Web Index: {$webindex}");
$p->setDefaultStub($index, $webindex);
} else if ($index) {
info("Index: {$index}");
$p->setDefaultStub($index);
} else if ($webindex) {
info("Web Index: {$webindex}");
$p->setDefaultStub(null, $webindex);
}
if ($stub) {
info("Stub: {$stub}");
if (is_file($stub)) {
$stub = file_get_contents($stub);
}
$p->setStub($stub);
}
$p->stopBuffering();
info("Files: {$p->count()}");
} catch (\\Exception $e) {
error($e->getMessage());
}
