Boxを使用してpharファイルをすばやく作成する





Phar



はJavaの世界のjar



の類似物ですが、PHPにのみ関連しています。 Phar



は、プロジェクトファイルを特別なアーカイブにパックし、プロジェクト自体を実行可能プログラムとして操作することなく、アプリケーションの転送とインストールを簡単にします。



公式ドキュメントからのpharの説明
Pharアーカイブは、複数のファイルを1つのファイルにグループ化する便利な方法として最もよく特徴付けられます。 そのため、pharアーカイブは、完全なPHPアプリケーションを単一のファイルで配布し、ディスクに抽出することなくそのファイルから実行する方法を提供します。 さらに、pharアーカイブは、コマンドラインとWebサーバーの両方で、他のファイルと同じくらい簡単にPHPで実行できます。 Pharは、PHPアプリケーションのサムドライブのようなものです。





PHPでpharファイルを作成するには、 かなり分岐したAPIがありますが、よりシンプルで便利な方法があります-Boxプロジェクトを使用します。



JSONファイル形式



Boxプロジェクトを使用すると、便利なJSON形式でpharファイルを作成するプロセスを説明できます。



最も単純なファイルは次のようになります。



 { "files": ["src/Put.php"], "main": "bin/main", "output": "example.phar", "stub": true }
      
      







どこで



files



-pharに含まれるファイル



main



-pharファイルが呼び出されたときに実行されるファイル



phar



結果のphar



ファイルの名前



stub



-コンソールアプリケーションがtrue



設定されているtrue







ここでは、単純なプロジェクトの例を使用して、pharファイルを作成するプロセスを見ることができます。



これは、コメント付きのすべての可能なbox.json



オプションのリストです。



実際のプロジェクトの例を使用して、pharファイルをビルドしてみましょう。 例として、 Nasgrateデータベース移行システムを取り上げます 。 「従来」、このシステムは、GitHubからリポジトリを複製するか、Composerを介してインストールされます。 PHPに関する知識がまったくなくても、単純にダウンロードして使用を開始できる別のユーティリティを作成しようとします。



プロジェクトのルートにbox.json



を作成します



 { "chmod": "0755", "directories": ["src","app"], "files": ["README.md"], "main": "bin/nasgrate", "output": "nasgrate.phar", "stub": true }
      
      





directories



-このパラメータには、プロジェクトに完全に含まれるディレクトリのリストが含まれます(この場合は、 src



およびapp



ディレクトリ)。



files



-特定のファイルを含める必要がある場合は、ここにリストします。



たとえば、box.jsonを次のように書き換えることができます。



 { "chmod": "0755", "directories": ["src"], "files": ["app/console.php", "app/index.php", "README.md"], "main": "bin/nasgrate", "output": "nasgrate.phar", "stub": true }
      
      





これら2つの記録オプションに加えて、フィルターに基づいてプロジェクトにファイルを選択的に含めることもできます。 たとえば、プロジェクトで外部ライブラリがアクティブに使用され、それらがvendors



フォルダにある場合、これらのライブラリのファイルをプロジェクトに含めますが、たとえば、すべてのテストを除外します。 ファイルは次のようになります



 { "chmod": "0755", "directories": ["src"], "files": ["app/console.php", "app/index.php", "README.md"], "finder": [ { "name": "*.php", "exclude": [ "tests", "test" ], "in": "vendor" } ], "main": "bin/nasgrate", "output": "nasgrate.phar", "stub": true }
      
      





この場合のfinder



セクションには、「 tests



およびtest



フォルダーを除くvendor



ディレクトリからの*.php



拡張子を持つすべてのファイルを含める」とあります。



chmod



- phar



ファイルにパーミッションを設定できます。 この場合、ファイルを実行可能にするために0755



を設定します。



残りのパラメーターは上記のとおりです。



ボックスのインストール



最も簡単な(推奨される)インストール方法



 $ curl -LSs https://box-project.github.io/box2/installer.php | php
      
      





その後、 box.phar



が現在のディレクトリに表示されます。



php box.phar



として実行するか、 chmod 755 box.phar



を実行する権限を割り当て、box mv box.phar box



に名前を変更して/usr/local/bin



転送しmv box.phar box



。 次に、 box



ようにどこからでも起動できbox







Composerによる代替インストール



 $ composer global require kherge/box --prefer-source
      
      





または既存のプロジェクトに追加します



 { "require-dev": { "kherge/box": "~2.5" } }
      
      





インストールを確認する



 $ box -v
      
      





プログラムの説明と可能なオプションのリストを表示する必要があります。



次に、 php.ini



ファイルでphar.readonly



パラメーターが0



Off



またはfalse



phar.readonly



ていることを確認する必要がありfalse







コンソールに関連するファイルの場所を確認します(phpinfo()を実行すると、Apacheを介して別のphp.iniが表示されます)。



 $ php -i | grep php.ini >> Configuration File (php.ini) Path => /usr/local/php5/lib >> Loaded Configuration File => /usr/local/php5/lib/php.ini
      
      





次に、 phar.readonly



パラメーターを見つけてOff



設定しOff







 [Phar] ; http://php.net/phar.readonly phar.readonly = Off
      
      





プロジェクトのコンパイル



プロジェクトフォルダー( box.json



するレベル)に移動し、コンパイルを開始します



 $ box build -v
      
      





-v



フラグを使用すると、コンパイル中に何が起こるかを確認できます



  Removing previously built Phar... * Building... ? Output path: /Users/dlevsha/Sites/nasgrate/nasgrate.phar ? Adding directories... + /Users/dlevsha/Sites/nasgrate/src/config.php + /Users/dlevsha/Sites/nasgrate/src/Driver/Base/Dump.php + /Users/dlevsha/Sites/nasgrate/src/Driver/Base/Generator.php + /Users/dlevsha/Sites/nasgrate/src/Driver/Base/Helper.php + /Users/dlevsha/Sites/nasgrate/src/Driver/Base/Migration.php + /Users/dlevsha/Sites/nasgrate/src/Driver/Mysql/Dump.php + /Users/dlevsha/Sites/nasgrate/src/Driver/Mysql/Generator.php + /Users/dlevsha/Sites/nasgrate/src/Driver/Mysql/Helper.php + /Users/dlevsha/Sites/nasgrate/src/Process/Base.php + /Users/dlevsha/Sites/nasgrate/src/Process/Console.php + /Users/dlevsha/Sites/nasgrate/src/Process/Server.php + /Users/dlevsha/Sites/nasgrate/src/template.sql + /Users/dlevsha/Sites/nasgrate/src/Util/Console.php + /Users/dlevsha/Sites/nasgrate/src/Util/Db.php + /Users/dlevsha/Sites/nasgrate/app/console.php + /Users/dlevsha/Sites/nasgrate/app/index.php ? Adding files... + /Users/dlevsha/Sites/nasgrate/README.md ? Adding main file: /Users/dlevsha/Sites/nasgrate/bin/nasgrate ? Generating new stub... ? Setting file permissions... * Done.
      
      





その後、 nasgrate.phar



ファイルがプロジェクトディレクトリに表示されます。



すべてが正常にコンパイルされたことを確認します。



 $ ./nasgrate.phar
      
      





ユーティリティの説明が表示されます



 Nasgrate is a console utility that let you organise database schema migration process at a consistent and easy way. It supports mysql, mssql, postgresql, oracle and other databases Usage: php nasgrate [command] [options] Command: status - displays migration status generate - creates new migration (migration file) up:show - displays (but not executes) SQL-query, executed by migration update ...
      
      





外部リソースを操作する



phar



の機能は、アーカイブ内のすべてのリソースを検索することです。 ほとんどの場合、これは問題ではありません。環境から独立させるのはこのためであるためです。 しかし、 phar



アーカイブ内のリソースが外部ファイルを操作する必要がある場合がいくつかあります。



たとえば、Nasgrate- .environment



ファイルから設定を読み取り、移行ファイルとステータスファイルを外部ディレクトリに書き込む必要があります。



../.environment



ように、プロジェクト内で相対パスを指定しようとすると、 phar



内にそのようなファイルがないため、エラーが生成されます。



この問題を解決するための2つのオプションがあります。



最初のオプションは、外部ファイルをphar



ファイルの内部スペースにマップすることです。



 Phar::mount('phar://.environment', '/etc/nasgrate/.environment');
      
      





問題は、ファイルへの絶対パスを正確に知る必要があることです。



2番目のオプションは、 phar



ファイルの現在の場所からのパスを指定することです。 このようなもの:



 define(DIR_RUN, dirname(Phar::running(false)));
      
      





次に、Phar :: mountを使用して内部のphar



スペースにマッピングするか、単に構成ファイルへの絶対パスを指定します。 構成ファイルはphar



自体と同じフォルダーにあると仮定します



 define(DIR_RUN, dirname(Phar::running(false))); Phar::mount('phar://.environment', DIR_RUN.'/.environment');
      
      





その後、ローカルファイルとして参照するか、常に絶対パスを参照します。



これがバグなのか機能なのかはわかりませんが、 Phar::mount



を介して接続されているすべてのディレクトリは読み取り専用モードであり、これを変更する方法はあまり明確ではありません。 絶対パスに対処する場合、このような問題は発生しません。



もう1つは明らかな点のように思えますが、注意する価値があります。 pharファイルにはプロジェクトのリソースが含まれており、PHP自体、そのバージョンなどに接続されたライブラリの存在を規制しません。 つまり、PDOなどの何らかのPHP拡張機能を使用したり、PECLから何かをインストールしたり、PHPの特定のバージョンの機能を使用したりすると、pharにはランタイムに関する情報が含まれません。 たとえば、PHP 5.4の特性を使用し、ユーザーが5.3を持っている場合、エラーが生成されます。 アプリケーション内で必要な依存関係をすべて確認する必要があります。



関連リンク:






All Articles