Symfony2コンソールライブラリを使用してCLIツールを構築する実験を行っています。私は何か基本的な動作をしているので、それをpharとしてパッケージ化したいです。私はいくつかの例を読みましたが、私が見たものは非常に単純です(3つのファイル、名前空間がないなど)。
私のsrc/
ディレクトリには、次のものがあります。
src/
の上にアプリを実行するために実行するconsole.php
があります。 composerを使用して依存関係をインストールしているので、vendors/
ディレクトリもあります。console.php
は非常に単純です。
#!/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();
Pharのビルドについて(少し)理解していることから、スタブとしてconsole.php
を含め、src/
に他のすべてを含め、さらにvendors/
にすべての依存関係を含める必要があると思います。
phpmaster.com のサンプルコードを見ると、file_get_contents
を使用してすべてのファイルを手動でpharに含めるように指定されていますが、コンポーザーのオートローダーを使用するには、ディレクトリ構造を維持する必要があります。 PSR-0ディレクトリ構造を維持します。
。pharを作成し、その中にディレクトリ構造を維持して、composerのオートローダーを引き続き使用できるようにする簡単な方法はありますか?
作曲家のCompiler
(元々はSilexのFabien Potencierによって作成されたもの)をご覧になることをお勧めします。そのクラスでは、Composerのような大きなコンソールアプリケーションが.phar
ファイルを作成する方法を確認できます。
いくつかの興味深い部分:
// line 49
$phar = new \Phar($pharFile, 0, 'composer.phar');
$phar->setSignatureAlgorithm(\Phar::SHA1);
$phar->startBuffering();
Phar#startBuffering
pharファイルの作成を開始します。
// Line 54
$Finder = new Finder();
$Finder->files()
->ignoreVCS(true)
->name('*.php')
->notName('Compiler.php')
->notName('ClassLoader.php')
->in(__DIR__.'/..')
ここで、Composerは Symfony2 Finder Component を使用して、src
ディレクトリ内のすべてのファイルを検索します(このファイルとオートローダーを除く)。
// Line 63
foreach ($Finder as $file) {
$this->addFile($phar, $file);
}
ここで、Composerは、見つかったすべてのファイルを反復処理し、それをPharアーカイブに追加します( 行116 でCompiler#addFile
メソッドを確認できます)。
これは数回繰り返されます。そして93行目で、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'));
Pharはストリームであるため、ディレクトリ構造はpharファイルに保持され、Composerオートローダーは引き続きクラスをロードできます。
次に、最後にスタブが追加され、バッファリングが停止します。
$phar->setStub($this->getStub());
$phar->stopBuffering();
( 行17 のCompiler#getStub
メソッドを参照してください)。 Phar#stopBuffering
メソッドは、pharの作成を停止し、pharファイルに保存します。
このストーリーを完成させるために、Composerは、このコマンドを実行する非常に単純なCLI コンパイルファイル を作成します。