Added more docs
This commit is contained in:
parent
b7ad437c9d
commit
688b9dcfca
100
doc/PHAR-APPS.md
Normal file
100
doc/PHAR-APPS.md
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
Phar Applications
|
||||||
|
=================
|
||||||
|
|
||||||
|
This guide explains how to make single-file executables using MakePhar.
|
||||||
|
|
||||||
|
|
||||||
|
## The workflow
|
||||||
|
|
||||||
|
1. Make sure you have a native php loader, in this example `src/stub.php`.
|
||||||
|
If you include a bin, such as `bin/myapp` make sure it wraps the native
|
||||||
|
loader or the shebang (`#!/usr/bin/env php` or similar) will be output
|
||||||
|
during load.
|
||||||
|
2. Set up the `makephar.sdl` file. You can copy and modify the example in
|
||||||
|
this doc, the `makephar.sdl.dist` from the source package, or simply
|
||||||
|
use `makephar -n > makephar.sdl` to have a template generated for you.
|
||||||
|
3. Call on `makephar` to generate the output file.
|
||||||
|
|
||||||
|
|
||||||
|
## Example files
|
||||||
|
|
||||||
|
### src/stub.php
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once __DIR__."/../vendor/autoload.php";
|
||||||
|
$app = new MyApp\MyApp();
|
||||||
|
$app->run();
|
||||||
|
|
||||||
|
|
||||||
|
### makephar.sdl
|
||||||
|
|
||||||
|
phar "myapp.phar" {
|
||||||
|
stub "src/stub.php";
|
||||||
|
include {
|
||||||
|
dir "src";
|
||||||
|
dir "vendor";
|
||||||
|
}
|
||||||
|
exclude {
|
||||||
|
dir ".git";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Problems and Solutions
|
||||||
|
|
||||||
|
### Getting the directory of the running phar
|
||||||
|
|
||||||
|
You can get the path of the command invoked using `$_SERVER['SCRIPT_NAME']`:
|
||||||
|
|
||||||
|
$root = dirname($_SERVER['SCRIPT_NAME']);
|
||||||
|
|
||||||
|
Note that the script *can* be a symbolic link, in which case you need to call
|
||||||
|
on `readlink` before you call `dirname`:
|
||||||
|
|
||||||
|
// Get the path of the script, eg. /usr/bin/myapp
|
||||||
|
$root = $_SERVER['SCRIPT_NAME'];
|
||||||
|
// Unwrap the links, eg. /usr/bin/myapp -> ~/myapp/myapp.phar
|
||||||
|
while (readlink($root)) {
|
||||||
|
$root = readlink($root);
|
||||||
|
}
|
||||||
|
// Finally get the directory (~/myapp)
|
||||||
|
$root = dirname($root);
|
||||||
|
|
||||||
|
Use this to locate your plugins.
|
||||||
|
|
||||||
|
### Find out if running from within a Phar
|
||||||
|
|
||||||
|
You can easilly find out if running from within a .phar archive by calling
|
||||||
|
`Phar::running()`.
|
||||||
|
|
||||||
|
if (Phar::running()) { inside_phar(); }
|
||||||
|
|
||||||
|
This doesn't make sense to use in phar plugins, as the main application can
|
||||||
|
also be in a phar, in which case it will be true even for non-phar plugins.
|
||||||
|
|
||||||
|
### Including the Git revision etc
|
||||||
|
|
||||||
|
Use the `props` for this. If you have an executable file, say `build/genprops`
|
||||||
|
that look like this...
|
||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
printf "GIT_REVISION=%s" "$(git describe --tags)"
|
||||||
|
|
||||||
|
...then you can define it in your `makephar.sdl` to be evaluated when the
|
||||||
|
phar is being built:
|
||||||
|
|
||||||
|
phar "output.phar" {
|
||||||
|
...
|
||||||
|
stub exec="build/genprops";
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
When running from within the built phar, the define `GIT_REVISION` will be
|
||||||
|
available:
|
||||||
|
|
||||||
|
if (defined('GIT_REVISION')) {
|
||||||
|
echo "Git Revision: ".GIT_REVISION."\n";
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user