Added support for phar metadata
This commit is contained in:
parent
7ccdb99836
commit
4873ffdf02
24
README.md
24
README.md
@ -83,6 +83,28 @@ You can follow the same approach when excluding files with the `exclude` block:
|
|||||||
The `dir` rules match against `*/<dirname>/*` while the `file` rule will match
|
The `dir` rules match against `*/<dirname>/*` while the `file` rule will match
|
||||||
against `*/<filename>`.
|
against `*/<filename>`.
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
|
||||||
|
As PHAR archives support metadata, you can insert your own custom data using
|
||||||
|
the `metadata` block:
|
||||||
|
|
||||||
|
library; // build a library (plugin)
|
||||||
|
metadata {
|
||||||
|
plugin_type "myapp.plugin";
|
||||||
|
plugin_name "myapp.plugin.awesomeplugin";
|
||||||
|
plugin_version "1.0.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
You can also map props to metadata. The advantage to this is that you can scan
|
||||||
|
the metadata before including the .phar letting you pick the most recent versions
|
||||||
|
etc.
|
||||||
|
|
||||||
|
metadata {
|
||||||
|
plugin_version prop="MYPLUGIN_VERSION";
|
||||||
|
}
|
||||||
|
|
||||||
|
The order is important! Make sure you have defined the props you want to reference
|
||||||
|
before referencing them!
|
||||||
|
|
||||||
## Props
|
## Props
|
||||||
|
|
||||||
@ -142,6 +164,8 @@ If set, no minification will take place. Generally, the minification should not
|
|||||||
cause any problems but lead to a file that can be up to half a megabyte smaller
|
cause any problems but lead to a file that can be up to half a megabyte smaller
|
||||||
as whitespace and comments are removed.
|
as whitespace and comments are removed.
|
||||||
|
|
||||||
|
It is also possible to mark specific directories or files as verbatim on the
|
||||||
|
`dir` and `file` tags in an `include` block.
|
||||||
|
|
||||||
### compress (bool)
|
### compress (bool)
|
||||||
|
|
||||||
|
@ -11,7 +11,8 @@
|
|||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"noccylabs/sdl": "^2.0",
|
"noccylabs/sdl": "^2.0",
|
||||||
"symfony/finder": "^3.2"
|
"symfony/finder": "^3.2",
|
||||||
|
"noccylabs/tinyphar": "^0.1.1"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"files": [ "src/global.php" ],
|
"files": [ "src/global.php" ],
|
||||||
|
10
makephar.sdl
10
makephar.sdl
@ -4,14 +4,22 @@ phar "makephar.phar" {
|
|||||||
// Set stub
|
// Set stub
|
||||||
stub "src/bootstrap.php";
|
stub "src/bootstrap.php";
|
||||||
|
|
||||||
|
props exec="props.php";
|
||||||
|
|
||||||
|
metadata {
|
||||||
|
package_name "makephar.application";
|
||||||
|
package_version prop="APP_VERSION";
|
||||||
|
update_channel "https://packages.noccylabs.info/channel/makephar/testing.json";
|
||||||
|
}
|
||||||
|
|
||||||
// Select files/dirs to include
|
// Select files/dirs to include
|
||||||
include {
|
include {
|
||||||
dir "vendor";
|
dir "vendor";
|
||||||
dir "src";
|
dir "src";
|
||||||
}
|
}
|
||||||
|
|
||||||
exclude {
|
exclude {
|
||||||
dir ".git";
|
dir ".git";
|
||||||
|
dir "Tests";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -10,10 +10,17 @@ phar "output.phar" {
|
|||||||
// Define the stub called when the phar is executed
|
// Define the stub called when the phar is executed
|
||||||
stub "src/bootstrap.php";
|
stub "src/bootstrap.php";
|
||||||
|
|
||||||
|
// Phar metadata
|
||||||
|
metadata {
|
||||||
|
generator "MakePhar/2.0";
|
||||||
|
channel_stable "http://dist.noccylabs.info/channels/makephar/stable.json";
|
||||||
|
channel_beta "http://dist.noccylabs.info/channels/makephar/beta.json";
|
||||||
|
}
|
||||||
|
|
||||||
// Select files/dirs to include
|
// Select files/dirs to include
|
||||||
include {
|
include {
|
||||||
dir "vendor";
|
dir "vendor";
|
||||||
dir "src";
|
dir "src" verbatim=true; /* directories and files can be marked verbatim */
|
||||||
}
|
}
|
||||||
|
|
||||||
// Patterns to exclude
|
// Patterns to exclude
|
||||||
|
12
props.php
Normal file
12
props.php
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function app_version() {
|
||||||
|
$ver = exec("git describe --tags");
|
||||||
|
$ver = explode("-",$ver);
|
||||||
|
if (count($ver)>1) {
|
||||||
|
$ver = array_slice($ver,0,2);
|
||||||
|
}
|
||||||
|
return join(".",$ver);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s=%s\n", "APP_VERSION", app_version());
|
@ -9,7 +9,7 @@ class Application
|
|||||||
|
|
||||||
private function parseCommandLine()
|
private function parseCommandLine()
|
||||||
{
|
{
|
||||||
$opts = "hn";
|
$opts = "hnq";
|
||||||
$long = [ 'help', 'new' ];
|
$long = [ 'help', 'new' ];
|
||||||
|
|
||||||
$parsed = getopt($opts, $long);
|
$parsed = getopt($opts, $long);
|
||||||
@ -19,6 +19,7 @@ class Application
|
|||||||
'manifest' => getcwd()."/makephar.sdl",
|
'manifest' => getcwd()."/makephar.sdl",
|
||||||
'output' => null,
|
'output' => null,
|
||||||
'compress' => false,
|
'compress' => false,
|
||||||
|
'quiet' => false,
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($parsed as $k=>$v) switch ($k) {
|
foreach ($parsed as $k=>$v) switch ($k) {
|
||||||
@ -30,6 +31,9 @@ class Application
|
|||||||
case 'new':
|
case 'new':
|
||||||
$config['init'] = true;
|
$config['init'] = true;
|
||||||
break;
|
break;
|
||||||
|
case 'q':
|
||||||
|
$config['quiet'] = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->config = (object)$config;
|
$this->config = (object)$config;
|
||||||
@ -40,19 +44,22 @@ class Application
|
|||||||
printf("Usage: makephar [opts]\n");
|
printf("Usage: makephar [opts]\n");
|
||||||
printf("Options: -h,--help Show this help\n");
|
printf("Options: -h,--help Show this help\n");
|
||||||
printf(" -n,--new Create a new configuration file\n");
|
printf(" -n,--new Create a new configuration file\n");
|
||||||
|
printf(" -q Quiet operation\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
public function run()
|
public function run()
|
||||||
{
|
{
|
||||||
$this->parseCommandLine();
|
$this->parseCommandLine();
|
||||||
|
|
||||||
|
if ($this->config->quiet) {
|
||||||
|
define("QUIET",true);
|
||||||
|
}
|
||||||
|
|
||||||
if ($this->config->help) {
|
if ($this->config->help) {
|
||||||
$this->printHelp();
|
$this->printHelp();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info("MakePhar 2.0 - (c) 2016-2017, NoccyLabs");
|
|
||||||
|
|
||||||
if ($this->config->init) {
|
if ($this->config->init) {
|
||||||
if (!file_exists("composer.json")) {
|
if (!file_exists("composer.json")) {
|
||||||
error_log("No composer.json in current directory");
|
error_log("No composer.json in current directory");
|
||||||
@ -62,6 +69,9 @@ class Application
|
|||||||
$proj_name = basename(getcwd()).".phar";
|
$proj_name = basename(getcwd()).".phar";
|
||||||
$proj_files = [];
|
$proj_files = [];
|
||||||
$proj_dirs = [];
|
$proj_dirs = [];
|
||||||
|
printf("// makephar.sdl generated for %s\n", basename(getcwd()));
|
||||||
|
printf("phar \"%s\" {\n", $proj_name);
|
||||||
|
printf(" include {\n");
|
||||||
if (!empty($proj->autoload)) {
|
if (!empty($proj->autoload)) {
|
||||||
foreach ((array)$proj->autoload as $type=>$loaders) {
|
foreach ((array)$proj->autoload as $type=>$loaders) {
|
||||||
if ($type == 'files') {
|
if ($type == 'files') {
|
||||||
@ -75,20 +85,22 @@ class Application
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("phar \"%s\" {\n", $proj_name);
|
|
||||||
printf(" include {\n");
|
|
||||||
foreach ($proj_files as $file)
|
foreach ($proj_files as $file)
|
||||||
printf(" file \"%s\";\n", $file);
|
printf(" file \"%s\";\n", $file);
|
||||||
foreach ($proj_dirs as $dir)
|
foreach ($proj_dirs as $dir)
|
||||||
printf(" dir \"%s\";\n", $dir);
|
printf(" dir \"%s\";\n", $dir);
|
||||||
printf(" dir \"vendor\";\n");
|
printf(" dir \"vendor\";\n");
|
||||||
printf(" }\n");
|
} else {
|
||||||
printf(" // stub \"src/path-to-stub.php\";\n");
|
printf(" // file \"filename.php\" src=\"path/file.php\";\n");
|
||||||
printf("}\n");
|
printf(" // dir \"path\";\n");
|
||||||
}
|
}
|
||||||
|
printf(" }\n");
|
||||||
|
printf(" // stub \"src/path-to-stub.php\";\n");
|
||||||
|
printf("}\n");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
log_info("MakePhar 2.0 - (c) 2016-2017, NoccyLabs");
|
||||||
|
|
||||||
$this->buildManifest();
|
$this->buildManifest();
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,8 @@ class Manifest
|
|||||||
protected $props = [];
|
protected $props = [];
|
||||||
/** @var array Patterns to exclude */
|
/** @var array Patterns to exclude */
|
||||||
protected $excludes = [];
|
protected $excludes = [];
|
||||||
|
/** @var array Phar metadata */
|
||||||
|
protected $metadata = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read manifests from a makephar.sdl file and return all the build targets
|
* Read manifests from a makephar.sdl file and return all the build targets
|
||||||
@ -94,6 +96,21 @@ class Manifest
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'metadata':
|
||||||
|
foreach ($child->getChildren() as $meta) {
|
||||||
|
if (($prop = $meta->getAttribute("prop"))) {
|
||||||
|
if (array_key_exists($prop,$mf->props)) {
|
||||||
|
$value = $mf->props[$prop];
|
||||||
|
} else {
|
||||||
|
log_warn("Property %s is not defined", $prop);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$value = $meta->getValue();
|
||||||
|
}
|
||||||
|
$mf->setMetadata($meta->getTagName(), $value);
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 'props':
|
case 'props':
|
||||||
$props = [];
|
$props = [];
|
||||||
if ($src = (string)$child->getValue()) {
|
if ($src = (string)$child->getValue()) {
|
||||||
@ -166,6 +183,20 @@ class Manifest
|
|||||||
return $this->stub;
|
return $this->stub;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setMetadata($key,$value)
|
||||||
|
{
|
||||||
|
$this->metadata[$key] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMetadata($key=null)
|
||||||
|
{
|
||||||
|
if ($key===null)
|
||||||
|
return $this->metadata;
|
||||||
|
if (!array_key_exists($key, $this->metadata))
|
||||||
|
return null;
|
||||||
|
return $this->metadata[$key];
|
||||||
|
}
|
||||||
|
|
||||||
public function setCompression($value)
|
public function setCompression($value)
|
||||||
{
|
{
|
||||||
$this->compress = $value;
|
$this->compress = $value;
|
||||||
@ -207,14 +238,19 @@ class Manifest
|
|||||||
{
|
{
|
||||||
$items = [];
|
$items = [];
|
||||||
foreach ($this->sources as $source) {
|
foreach ($this->sources as $source) {
|
||||||
|
if (@isset($source->opts->verbatim)) {
|
||||||
|
$verbatim = $source->opts->verbatim;
|
||||||
|
} else {
|
||||||
|
$verbatim = $this->getVerbatim();
|
||||||
|
}
|
||||||
if ($source->type == 'dir') {
|
if ($source->type == 'dir') {
|
||||||
$it = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source->path));
|
$it = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source->path));
|
||||||
foreach ($it as $item) {
|
foreach ($it as $item) {
|
||||||
if ($item->isDir()) continue;
|
if ($item->isDir()) continue;
|
||||||
$items[] = (object)['src'=>realpath($item->getPathname()),'dest'=>$item->getPathname()];
|
$items[] = (object)['src'=>realpath($item->getPathname()),'dest'=>$item->getPathname(),'verbatim'=>$verbatim];
|
||||||
}
|
}
|
||||||
} elseif ($source->type == 'file') {
|
} elseif ($source->type == 'file') {
|
||||||
$items[] = (object)['src'=>realpath($source->path),'dest'=>$item->getPathname()];
|
$items[] = (object)['src'=>realpath($source->path),'dest'=>$source->path,'verbatim'=>$verbatim];
|
||||||
} else {
|
} else {
|
||||||
log_warn("Unsupported source type: %s", $source->type);
|
log_warn("Unsupported source type: %s", $source->type);
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,7 @@ class PharBuilder
|
|||||||
}
|
}
|
||||||
|
|
||||||
$size_tot += filesize($file->src);
|
$size_tot += filesize($file->src);
|
||||||
if (fnmatch("*.php",$file->src) && (!$verbatim)) {
|
if (fnmatch("*.php",$file->src) && (!$file->verbatim)) {
|
||||||
$min = php_strip_whitespace($file->src);
|
$min = php_strip_whitespace($file->src);
|
||||||
$size_min += strlen($min);
|
$size_min += strlen($min);
|
||||||
$phar->addFromString($file->dest?:$file->src, $min);
|
$phar->addFromString($file->dest?:$file->src, $min);
|
||||||
@ -92,7 +92,7 @@ class PharBuilder
|
|||||||
log_debug("Creating library stub...");
|
log_debug("Creating library stub...");
|
||||||
// Create library stub
|
// Create library stub
|
||||||
$stub = '<?php ';
|
$stub = '<?php ';
|
||||||
$stub.= 'require_once __DIR__."/vendor/autoload.php";';
|
$stub.= 'file_exists(__DIR__."/vendor/autoload.php") && require_once __DIR__."/vendor/autoload.php";';
|
||||||
foreach ($this->manifest->getProps() as $k=>$v) {
|
foreach ($this->manifest->getProps() as $k=>$v) {
|
||||||
$stub.= sprintf('define(%s,%s);', var_export($k,true), var_export($v,true));
|
$stub.= sprintf('define(%s,%s);', var_export($k,true), var_export($v,true));
|
||||||
}
|
}
|
||||||
@ -119,6 +119,13 @@ class PharBuilder
|
|||||||
$phar->setStub($mainstub);
|
$phar->setStub($mainstub);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Write metadata
|
||||||
|
log_debug("Writing metadata...");
|
||||||
|
$md = $this->manifest->getMetadata();
|
||||||
|
foreach ($md as $key=>$value)
|
||||||
|
log_debug(" meta[{$key}] = {$value}");
|
||||||
|
$phar->setMetadata($md);
|
||||||
|
|
||||||
// Close the phar
|
// Close the phar
|
||||||
$phar = null;
|
$phar = null;
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,6 @@ if (@empty(STDOUT) || (!posix_isatty(STDOUT))) {
|
|||||||
define("IS_TTY", true);
|
define("IS_TTY", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function log_info($fmt,...$arg) { printf(LF_INFO."[info] {$fmt}".LF_RESET."\n", ...$arg); }
|
function log_info($fmt,...$arg) { defined("QUIET") || printf(LF_INFO."[info] {$fmt}".LF_RESET."\n", ...$arg); }
|
||||||
function log_debug($fmt,...$arg) { printf(LF_DEBUG."[debg] {$fmt}".LF_RESET."\n", ...$arg); }
|
function log_debug($fmt,...$arg) { defined("QUIET") || printf(LF_DEBUG."[debg] {$fmt}".LF_RESET."\n", ...$arg); }
|
||||||
function log_warn($fmt,...$arg) { printf(LF_WARN."[warn] {$fmt}".LF_RESET."\n", ...$arg); }
|
function log_warn($fmt,...$arg) { defined("QUIET") || printf(LF_WARN."[warn] {$fmt}".LF_RESET."\n", ...$arg); }
|
||||||
|
Loading…
Reference in New Issue
Block a user