Cross package maker. DEB/RPM generation or conversion. Derived from jordansissel/fpm.

⌈⌋ ⎇ branch:  cross package maker


Artifact [c974d053fd]

Artifact c974d053fd922998f7c5255c0741550a027f01ec:

Wiki page [phar] by mario 2015-01-28 12:42:36.
D 2015-01-28T12:42:36.312
L phar
N text/x-markdown
P 98a8ecfd314a3daf755f6ffd4f61cc01bd438758
U mario
W 6381
### <kbd>-t `phar`</kbd> packaging

Phars are PHPs file bundles. They are available in a few format and compression flavours (binary, zip, tar).

   * Packs the staging dir with relative directory structures (like the `zip` module).
   * 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 <kbd><a href="wiki/src">-s src</a></kbd>,  <kbd><a href="wiki/source_composer">-s composer</a></kbd> source plugins, and <kbd><a href="wiki/update+filters#lcase">-u lcase</a></kbd>, <kbd><a href="wiki/update+filters#composer">-u composer</a></kbd> update filters.


### Recognized file extensions or `--phar-format` specifiers

<table>
<tr>
<th> Extension / Specifier  </th><th> Archive Format    </th><th> Compression Per File </th><th> Envelope Compression   </th><th> Use Cases          </th>
</tr>
<tr>
<td> phar        </td><td> Phar        </td><td> -           </td><td> -           </td><td>               </td>
</tr>
<tr>
<td> phar.gz     </td><td> Phar        </td><td> gzip        </td><td> -           </td><td> general       </td>
</tr>
<tr>
<td> phar.bz2    </td><td> Phar        </td><td> bzip2       </td><td> -           </td><td>               </td>
</tr>
<tr>
<td> phaz        </td><td> Phar        </td><td> -           </td><td> gzip        </td><td>               </td>
</tr>
<tr>
<td> phaz.bz2     </td><td> Phar       </td><td> gzip        </td><td> bzip2       </td><td> (avoid!)      </td>
</tr>
<tr>
<td> zip         </td><td> Zip         </td><td> -           </td><td> -           </td><td>               </td>
</tr>
<tr>
<td> zip.gz      </td><td> Zip         </td><td> gzip        </td><td> -           </td><td> distribution  </td>
</tr>
<tr>
<td> zip.bz2     </td><td> Zip         </td><td> bzip2       </td><td> -           </td><td>               </td>
</tr>
<tr>
<td> tar         </td><td> Pax         </td><td> -           </td><td> -           </td><td>               </td>
</tr>
<tr>
<td> tgz         </td><td> Pax         </td><td> -           </td><td> gzip        </td><td>               </td>
</tr>
<tr>
<td> tar.bz2     </td><td> Pax         </td><td> -           </td><td> bzip2       </td><td> data bundles  </td>
</tr>
</table>

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`<br><br>

   * An identifier <kbd>map</kbd> is automatically included. It contains not just <kbd>class</kbd> but also <kbd>function</kbd> and <kbd>const</kbd> declarations.

       * <kbd>map</kbd>
          * <kbd>class</kbd>
             * `vnd\dir\classname` **=>** `src/dir/Classname.php`
             * `myiterator` **=>** `src/MyIterator.php`
          * <kbd>function</kbd>
          * <kbd>const</kbd>

     Each is a simple identifer→filename association, with keys being lowercased (for PHP compliance). For libraries usually only the `class` list is populated.

   * The [<kbd>-s src</kbd>](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 [<kbd>-s composer</kbd>](wiki/source_composer) source plugin, the `composer.lock` 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 disregarded 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 <kbd>--attr</kbd> flag. (Just strings though, not array structures currently.)

   * The [<kbd>-u composer</kbd>](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 [<kbd>-u lcase=php</kbd>](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 19c17f39b3f2316fdaf588eec35ae9af