2013-04-01 6 views
22

私はSymfony2コンソールライブラリを使ってCLIツールを構築しようとしています。私は基本的な作業をしており、今はpharとしてパッケージ化したいと思っています。私はいくつかの例を読んだことがありますが、私が見たものは非常に単純です(3つのファイル、名前空間などはありません)。私src/ディレクトリで単純なアプリケーションのためのPHARの生成

私は、次の持っている:私はアプリケーションを実行するために実行console.phpを持っている

enter image description here

src/上。私は依存関係をインストールするためにコンポーザーを使用しているので、vendors/ dirも持っています。 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(); 

何(少し)私は私がスタブとsrc/で他のすべてのプラスvendors/内のすべての私の依存関係としてconsole.phpを含める必要があると思うのpharの構築について理解しています。 phpmaster.com上のサンプルコードを見てみると

彼らはfile_get_contentsを使用するPharに含まれるように、手動ですべてのファイルを指定しますが、私は作曲家のオートローダーを使用すると、PSR-0のディレクトリ構造に保つために、私のディレクトリ構造を維持する必要があります。

.pharを作成し、それに私のディレクトリ構造を維持する簡単な方法はありますか?私はまだコンポーザのオートローダーを使用できますか?

答えて

22

Composer's 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は(このファイルとオートローダーを除く)srcディレクトリ内のすべてのファイルを検索しSymfony2 Finder Componentを使用しています。

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

ここで、Composerは検出されたすべてのファイルを繰り返し、Pharアーカイブに追加します。 (line 116Compiler#addFileメソッドを参照してください)。

これは何度か繰り返されます。そしてライン93で、作曲オートローダが使用されます。

$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形式のファイルに保存され、作曲オートローダはまだクラスをロードすることができます。

そして、終了時に、スタブを添加し、バッファリングを停止:

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

$phar->stopBuffering(); 

line 173Compiler#getStub方法を参照されたいです)。Phar#stopBufferingメソッドは、pharの作成を停止し、それをpharファイルに保存します。

このストーリーを完成させるために、Composerはこのコマンドを実行する非常に簡単なCLI compile fileを作成します。

+2

ありがとうございます!私が必要とするものと全く同じように見えます:) – Bendihossan

+8

@Bendihossan [ボックス](https://github.com/kherge/box) - pharsを構築するための小さなユーティリティです。これは、Composerコンパイラと同じものの多くをサポートしています。 – Seldaek

関連する問題