Générer un PHAR pour une application simple

j'expérimente la construction D'outils CLI en utilisant la bibliothèque de console Symfony2. J'ai quelque chose de basique qui fonctionne et maintenant je veux l'emballer comme un phar. J'ai lu quelques exemples mais ceux que j'ai vus sont très simples (3 fichiers, pas d'espaces de noms, etc.).

Dans mon src/ répertoire, j'ai le code suivant:

enter image description here

src/ j'ai un console.php que j'exécute pour lancer l'application. J'ai aussi un vendors/ dir que je suis en utilisant le compositeur de installer les dépendances. console.php est très simple:

#!/usr/bin/env php
<?php

set_time_limit(0);
$loader = require 'vendor/autoload.php';

use SymfonyComponentConsoleApplication;
use BendihossanPinfoCommandEnvironmentCommand;
use BendihossanPinfoCommandExtensionsCommand;
use BendihossanPinfoCommandRunAllCommand;

$console = new Application();

$console->add(new RunAllCommand());
$console->add(new EnvironmentCommand);
$console->add(new ExtensionsCommand);

$console->run();

de ce que (peu) je comprends au sujet de construire un phar je pense que je dois inclure console.php sur le talon et tout le reste src/ plus toutes mes dépendances dans vendors/.

regarder le code de l'exemple sur phpmaster.com ils spécifient manuellement chaque fichier à inclure dans le phar en utilisant file_get_contents, mais j'ai besoin de maintenir ma structure de répertoire afin d'utiliser l'autoloader du compositeur et maintenez la structure du répertoire PSR-0.

Est-il un moyen facile de créer un .phar et de maintenir mon répertoire de la structure de sorte que je peux encore utiliser l'autoloader de composer?

23
demandé sur Wouter J 2013-04-02 00:05:06

1 réponses

je vous suggère de prendre un coup d'oeil à Éditeur Compiler (créé à L'origine par Fabien Potencier dans Silex). Dans cette classe, vous pouvez voir comment une grande application de console comme Composer crée le .phar fichier.


Certaines parties intéressantes:

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

$phar->startBuffering();

Phar#startBuffering commence la création du fichier phar.

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

ici, Composer utilise le Symfony2 Finder Component pour trouver chaque fichier dans l' src répertoire (sauf ce fichier et l'autoloader).

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

ici, Composer itère chaque fichier trouvé et l'ajoute à L'archive Phar. (vous pouvez voir le Compiler#addFile méthode ligne 116).

ceci est répété plusieurs fois. Et puis à la ligne 93, le compositeur autoloader est utilisé:

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

parce que Phar est un flux, la structure du répertoire est conservée dans le fichier phar et le compositeur autoloader est encore capable pour charger les classes.

puis, à la fin, les talons sont ajoutés et le tampon arrêté:

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

$phar->stopBuffering();

(voir Compiler#getStub méthode ligne 173). Phar#stopBuffering la méthode stoppe la création du phar et le sauvegarde dans le fichier phar.

pour compléter cette histoire, le compositeur crée un clip très simple!--45-->compiler le fichier qui exécute cette commande.

23
répondu Wouter J 2013-11-18 16:02:28