25

Symfony2 コンソール ライブラリを使用して CLI ツールの構築を実験しています。基本的な作業ができたので、それを phar としてパッケージ化したいと考えています。いくつかの例を読みましたが、見たものは非常に単純です (3 つのファイル、名前空間なしなど)。

私のsrc/ディレクトリには次のものがあります。

ここに画像の説明を入力

上記src/にはconsole.php、アプリを実行するために実行する があります。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();

console.phpphar のビルドについて (少し) 理解していることから、スタブとして含める必要があるsrc/と思いますvendors/

phpmaster.comのサンプル コードを見ると、すべてのファイルを phar を使用して手動で指定していますfile_get_contentsが、コンポーザーのオートローダーを使用して PSR-0 ディレクトリ構造を維持するには、ディレクトリ構造を維持する必要があります。

.phar を作成し、その中にディレクトリ構造を維持して、composer のオートローダーを引き続き使用できるようにする簡単な方法はありますか?

4

1 に答える 1

24

Composer'sCompilerを参照することをお勧めします(これは、もともと Silex で Fabien Potencier によって作成されたものです)。そのクラスでは、Composer のような大きなコンソール アプリケーションがどのようにファイルを作成するかを見ることができ.pharます。


いくつかの興味深い部分:

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

$phar->startBuffering();

Phar#startBufferingphar ファイルの作成を開始します。

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

ここで、Composer はSymfony2 Finder コンポーネントを使用して、ディレクトリ内のすべてのファイルを検索しますsrc(このファイルとオートローダーを除く)。

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

ここで、Composer は見つかったすべてのファイルを繰り返し処理し、それを Phar アーカイブに追加します。(Compiler#addFileメソッドは116 行目にあります)。

これが何度か繰り返されます。そして 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();

( 173 行目Compiler#getStubのメソッドを参照してください)。このメソッドは、phar の作成を停止し、phar ファイルに保存します。Phar#stopBuffering

このストーリーを完成させるために、Composer はこのコマンドを実行する非常に単純な CLIコンパイル ファイルを作成します。

于 2013-04-01T20:55:55.867 に答える