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.imtqy.com/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パラメーターが0Offまたは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を持っている場合、エラーが生成されます。 アプリケーション内で必要な依存関係をすべて確認する必要があります。

関連リンク:

Source: https://habr.com/ru/post/J274745/


All Articles