2013-04-01 6 views
22

Ich experimentiere beim Erstellen von CLI-Tools mit der Symfony2-Konsolenbibliothek. Ich habe etwas Grundfunktionelles und jetzt möchte ich es als Phar verpacken. Ich habe ein paar Beispiele gelesen, aber die, die ich gesehen habe, sind sehr einfach (3 Dateien, keine Namespaces, etc).Erstellen eines PHAR für eine einfache Anwendung

In meinem src/ Verzeichnis habe ich folgendes:

enter image description here

Above src/ ich eine console.php, die ich ausführen um die Anwendung auszuführen. Ich habe auch eine vendors/ Dir, wie ich Composer verwende, um Abhängigkeiten zu installieren. console.php ist sehr einfach:

#!/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(); 

Von dem, was (wenig) Ich verstehe über einen phar bauen Ich glaube, ich brauche console.php als Stummel und alles andere in src/ enthalten sowie alle meine Abhängigkeiten in vendors/.

am Beispielcode Blick auf phpmaster.com sie jede Datei angeben manuell im phar aufgenommen werden file_get_contents, aber ich brauche, um meine Verzeichnisstruktur zu halten, um die Komponisten Autoloader zu verwenden und zu PSR-0 Verzeichnisstruktur zu halten.

Gibt es eine einfache Möglichkeit, ein .phar zu erstellen und meine Verzeichnisstruktur beizubehalten, damit ich den Autoloader von Composer weiterhin verwenden kann?

Antwort

22

Ich empfehle Ihnen einen Blick auf Composer's Compiler (es wurde ursprünglich von Fabien Potencier in Silex erstellt). In dieser Klasse können Sie sehen, wie eine große Konsolenanwendung wie Composer die Datei .phar erstellt.


Einige interessante Teile:

// line 49 
$phar = new \Phar($pharFile, 0, 'composer.phar'); 
$phar->setSignatureAlgorithm(\Phar::SHA1); 

$phar->startBuffering(); 

Phar#startBuffering beginnt die Erstellung der Phar-Datei.

// Line 54 
$finder = new Finder(); 
$finder->files() 
    ->ignoreVCS(true) 
    ->name('*.php') 
    ->notName('Compiler.php') 
    ->notName('ClassLoader.php') 
    ->in(__DIR__.'/..') 

Hier Komponist nutzt die Symfony2 Finder Component jede Datei im Verzeichnis src (außer diese Datei und der Autoloader) zu finden.

// Line 63 
foreach ($finder as $file) { 
    $this->addFile($phar, $file); 
} 

Hier Komponist iteriert über jede gefundene Datei und fügt sie der Phar-Archiv. (Sie können die Compiler#addFile Methode auf line 116 sehen).

Dies wird einige Male wiederholt. Und dann in Zeile 93 wird der Komponist Autoloader verwendet:

$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')); 

Da Phar ein Strom ist, wird die Verzeichnisstruktur in der phar Datei gespeichert und der Komponist Autoloader ist noch in der Lage, die Klassen zu laden.

dann am Ende sind die Stubs zugegeben, und die Pufferung gestoppt:

$phar->setStub($this->getStub()); 

$phar->stopBuffering(); 

(Compiler#getStub das Verfahren bei line 173 sehen).Die Methode Phar#stopBuffering stoppt die Erstellung des phar und speichert sie in der phar-Datei.

Um diese Geschichte abzuschließen, erstellt Composer eine sehr einfache CLI compile file, die diesen Befehl ausführt.

+2

Danke! Sieht genau so aus, wie ich es brauche :) – Bendihossan

+8

@Bendihossan Ich würde dir auch raten, [Box] (https://github.com/kherge/box) anzuschauen - ein kleines Dienstprogramm, das dem Bau von Phars gewidmet ist. Es unterstützt viele der gleichen Dinge, die wir im Composer Compiler und dann einige haben. – Seldaek