web-dev-qa-db-ja.com

簡単なアプリケーション用のPHARの生成

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

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

enter image description here

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のオートローダーを引き続き使用できるようにする簡単な方法はありますか?

24
Bendihossan

作曲家の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アーカイブに追加します( 行116Compiler#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();

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

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

23
Wouter J