php - Generando un PHAR para una aplicación simple
include phar in php (1)
Le sugiero que eche un vistazo al Compiler
de compositores (originalmente fue creado por Fabien Potencier en Silex). En esa clase, puedes ver cómo una aplicación de consola grande como Composer crea el archivo .phar
.
Algunas partes interesantes:
// line 49
$phar = new /Phar($pharFile, 0, ''composer.phar'');
$phar->setSignatureAlgorithm(/Phar::SHA1);
$phar->startBuffering();
Phar#startBuffering
inicia la creación del archivo phar.
// Line 54
$finder = new Finder();
$finder->files()
->ignoreVCS(true)
->name(''*.php'')
->notName(''Compiler.php'')
->notName(''ClassLoader.php'')
->in(__DIR__.''/..'')
Aquí, Composer usa el componente Symfony2 Finder para encontrar todos los archivos en el directorio src
(excepto este archivo y el autoloader).
// Line 63
foreach ($finder as $file) {
$this->addFile($phar, $file);
}
Aquí, Composer recorre cada archivo encontrado y lo agrega al archivo Phar. (Puede ver el método Compiler#addFile
en la línea 116 ).
Esto se repite algunas veces. Y luego, en la línea 93, se utiliza el autocargador Composer:
$this->addFile($phar, new /SplFileInfo(__DIR__.''/../../vendor/autoload.php''));
$this->addFile($phar, new /SplFileInfo(__DIR__.''/../../vendor/composer/autoload_namespaces.php''));
$this->addFile($phar, new /SplFileInfo(__DIR__.''/../../vendor/composer/autoload_classmap.php''));
$this->addFile($phar, new /SplFileInfo(__DIR__.''/../../vendor/composer/autoload_real.php''));
Debido a que Phar es una secuencia, la estructura del directorio se mantiene en el archivo phar y el autocargador Composer aún puede cargar las clases.
Luego, al final, se agregan los apéndices y se detiene el almacenamiento en búfer:
$phar->setStub($this->getStub());
$phar->stopBuffering();
(Ver el método Compiler#getStub
en la línea 173 ). El método Phar#stopBuffering
detiene la creación del phar y lo guarda en el archivo phar.
Para completar esta historia, Composer crea un archivo de compilación de CLI muy simple que ejecuta este comando.
Estoy experimentando en la construcción de herramientas CLI usando la biblioteca de la consola Symfony2. Tengo algo básico que funciona y ahora quiero empaquetarlo como un phar. He leído algunos ejemplos, pero los que he visto son muy simples (3 archivos, sin espacios de nombres, etc.).
En mi directorio src/
tengo lo siguiente:
Sobre src/
tengo un console.php
que ejecuto para ejecutar la aplicación. También tengo un directorio vendors/
ya que estoy usando compositor para instalar dependencias. console.php
es muy simple:
#!/usr/bin/env php
<?php
set_time_limit(0);
$loader = require ''vendor/autoload.php'';
use Symfony/Component/Console/Application;
use Bendihossan/Pinfo/Command/EnvironmentCommand;
use Bendihossan/Pinfo/Command/ExtensionsCommand;
use Bendihossan/Pinfo/Command/RunAllCommand;
$console = new Application();
$console->add(new RunAllCommand());
$console->add(new EnvironmentCommand);
$console->add(new ExtensionsCommand);
$console->run();
Por lo que (poco) entiendo sobre cómo construir un phar, creo que necesito incluir console.php
como el código auxiliar y todo lo demás en src/
más todas mis dependencias en los vendors/
.
Mirando el código de ejemplo en phpmaster.com , especifican que cada archivo se incluya manualmente en phar usando file_get_contents
, pero necesito mantener mi estructura de directorios para usar el autocargador del compositor y mantener la estructura de directorios PSR-0.
¿Hay una manera fácil de crear un .phar y mantener mi estructura de directorios dentro de él para que pueda usar el autocargador del compositor?