Added docs and example config
This commit is contained in:
parent
29edf6e591
commit
b7ad437c9d
98
doc/PHAR-PLUGINS.md
Normal file
98
doc/PHAR-PLUGINS.md
Normal file
@ -0,0 +1,98 @@
|
||||
Plugins in Phar Archives
|
||||
========================
|
||||
|
||||
This is a short guide on how to create single-file portable plugins using
|
||||
MakePhar.
|
||||
|
||||
|
||||
## The workflow
|
||||
|
||||
1. Your application should export functions that can be called by the plugin
|
||||
on load, such as `myapp_plugin_register` in the example below.
|
||||
2. Locate the .phar plugins to load, and `@include` them one at a time.
|
||||
3. Process the plugins etc that has been registered from the successfully
|
||||
loaded .phar libraries.
|
||||
|
||||
|
||||
## Example files
|
||||
|
||||
### src/plugin.php
|
||||
|
||||
<?php
|
||||
|
||||
// Prevent standalone use, as it doesn't make sense
|
||||
if (!is_callable('myapp_plugin_register')) {
|
||||
error_log("This is a plugin for MyApp and can't be used standalone");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Register the plugin
|
||||
myapp_plugin_register(new MyPlugin\MyPlugin());
|
||||
|
||||
### composer.json
|
||||
|
||||
{
|
||||
"autoload": {
|
||||
"files": [ "src/plugin.php" ],
|
||||
"psr-4": { "MyPlugin\\":"src/" }
|
||||
}
|
||||
}
|
||||
|
||||
### makephar.sdl
|
||||
|
||||
phar "myplugin.phar" {
|
||||
library;
|
||||
include {
|
||||
dir "src";
|
||||
dir "vendor";
|
||||
}
|
||||
exclude {
|
||||
dir ".git";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
## Notes and Considerations
|
||||
|
||||
* Try not to bundle unneccesary or duplicate dependencies using composer. It is
|
||||
possible to include multiple composer `autoload.php` files (as is done when
|
||||
including the phar libraries) but effectively only the first matching loader
|
||||
will be used. Thus, if you have required a library in the plugin that is also
|
||||
present in the main application, the main version will be loaded rather than
|
||||
the plugin version.
|
||||
|
||||
|
||||
|
||||
## 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.
|
||||
|
25
makephar.sdl.dist
Normal file
25
makephar.sdl.dist
Normal file
@ -0,0 +1,25 @@
|
||||
// Define output file here
|
||||
phar "output.phar" {
|
||||
|
||||
// Remove this line to build an executable
|
||||
library;
|
||||
|
||||
// Remove this line to minify source files (recommended9)
|
||||
verbatim;
|
||||
|
||||
// Define the stub called when the phar is executed
|
||||
stub "src/bootstrap.php";
|
||||
|
||||
// Select files/dirs to include
|
||||
include {
|
||||
dir "vendor";
|
||||
dir "src";
|
||||
}
|
||||
|
||||
// Patterns to exclude
|
||||
exclude {
|
||||
dir "Tests";
|
||||
dir ".git";
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user