D 2015-01-21T13:13:00.939
L phar
N text/x-markdown
P bb9d16fca975032823d02c12da00737cac10336f
U mario
W 5928
### -t `phar` packaging
Phars are PHPs file bundles. They are available in a few format and compression flavours (binary, zip, tar).
And this target plugin basically works like the `zip` module.
* Packs the staging dir with relative directory structures.
* Somewhat consolidates the `--phar-format` selection.
* Allows for stub inclusion.
* And provides a `--phar-sign` option.
* Populates the Phar meta data bag.
* Builds a class map.
Interacts with the -s src, -s composer source plugins, and -u lcase, -u composer update filters.
### Recognized file extensions or `--phar-format` specifiers
Extension / Specifier | Archive Format | Compression Per File | Envelope Compression | Use Cases |
phar | Phar | - | - | |
phar.gz | Phar | gzip | - | general |
phar.bz2 | Phar | bzip2 | - | |
phaz | Phar | - | gzip | |
phaz.bz2 | Phar | gzip | bzip2 | (avoid!) |
zip | Zip | - | - | |
zip.gz | Zip | gzip | - | distribution |
zip.bz2 | Zip | bzip2 | - | |
tar | Pax | - | - | |
tgz | Pax | - | gzip | |
tar.bz2 | Pax | - | bzip2 | data bundles |
The `tar` archives are POSIX tars, therefore mentioned as `Pax` here.
Format/file extension combos can be specified with dots, without, or arbitrary delimiters, and in any order. So these are all equivalent:
* `--phar-format .tar.gz`
* `--phar-format tar+gz`
* `--phar-format tar/gz`
* `--phar-format targz`
Per default uncompressed Phars are generated.
## Meta data
Phars have a built-in [meta data](http://php.net/phar.getmetadata) section, internally stored as PHP `serialize()` array.
* Packaging options are used as defaults.
The basic fields are:
* `id` (package basename)
* `title`
* `description`
* `category`
* `version`
* `epoch` (optional)
* `iteration` (optional)
* `architecture` (usually "all")
* `author`
* `url`
* `license`
* An identifier `map` is automatically included. It contains not just `class` but also `function` and `const` declarations. Each is a simple identifer→filename association, with keys being lowercased (for PHP compliance).
* The [-s src](wiki/src) module can update or add extra fields. It reads out the comment meta block from the primary script.
For instance:
* `main` (lists the primary PHP script within the phar)
* `api`
* `type`
* `comment` (includes the remainder of the first comment block, basic documentation / long description text)
* `state`
* `doc`
* `pack` (unparsed file list / glob specifier)
* `config` (unparsed section)
Further fields can be present. Each `api:` may define custom attributes. Or can just be used for documentative purposes. Field names are always lowercased in the Phar meta array (they're case-insensitive in source comment headers).
* When using the [-s composer](wiki/source_composer) source plugin, the `composer.json` bundle information will be stashed in a `composer` subarray.
* `composer`{}
* `keywords`[]
* `license`[]
* `authors`{}
* `support`{}
* `require`{}
This is somewhat redundant, since `phar://.../composer.json` is available still. Because full phar support is frowned on in the packagist/composer ecosystem, and due to their constrained set of allowed fields, `composer:` is only a substructure in the meta array. (Thus indirectly returning the `extra:` stashing favour.)
* Custom phar meta array fields can likewise be added using the fpm --attr flag. (Just strings though, not array structures currently.)
* The [-u composer](wiki/update+filters#composer) update filter works the other way round. It *generates* a stub `composer.json` when there wasn't one in the input dir. It maps accumulated fpm package infos to populate or update fields in `composer.json`. Which for example is useful for refining the `--version` field.
### Update filters
* With [-u lcase=php](wiki/update+filters#lcase) all included filenames can be converted to lowercase beforehand.
### Prior notes
* fpm issue: [#812](https://github.com/jordansissel/fpm/issues/812)
* orig gist: [fpm…package…**phar.rb**](https://gist.github.com/prof-milki/1c1930b2e8cba5753902)
* The implementation is basically just 70% php code. The Ruby section mostly just copies data over.
It wouldn't be very practical to reimplement the phar binary format, or the zip/tar specifica.
Generating Phars per `fpm` is a convenienence over using the command-line `phar` tool.
Z 0c2db60b9139136222d4b07aab0b28c3