これは私のcomposer.jsonファイルです:
"require": {
"php": ">=5.4",
"zendframework/zendframework": "2.*",
"doctrine/doctrine-module": "dev-master",
"doctrine/doctrine-orm-module": "0.*",
"gedmo/doctrine-extensions": "dev-master"
},
"require-dev": {
"phpunit/phpunit": "3.7.*"
},
"scripts": {
"post-update-cmd": [
"rm -rf vendor/Behat",
"git clone git://github.com/Behat/Behat.git",
"cp composer.phar Behat/composer.phar",
"cd Behat && git submodule update --init",
"cd Behat && php composer.phar install",
"cd Behat && php composer.phar require guzzle/guzzle:3.0.*",
"mv Behat vendor/Behat",
"ln -sf ../Behat/bin/behat vendor/bin/"
]
}
スクリプトが開発環境でのみ実行されるようにするにはどうすればよいですか?
基本的に、スクリプトを呼び出すときにのみスクリプトを実行します。
php composer.phar update --dev
スクリプトをトリガーせずに非開発環境の更新を行うには、 the --no-scripts
update
コマンドのコマンドラインスイッチ :
php composer.phar update --no-scripts
^^^^^^^^^^^^
デフォルトでは、Composerスクリプトは基本パッケージでのみ実行されます。そのため、開発用のパッケージを1つ作成し、ライブ環境でそれをライブシステムの依存関係にすることができます。
それ以外には、スクリプトを自動的に区別する方法はありません。
デフォルトのインストールと-devオプションに異なるスクリプトを選択することはできませんが、メソッドisDevModeを使用できます()inComposer\Script\Eventを使用して、開発環境でのみコマンドを実行します。 http://getcomposer.org/apidoc/master/Composer/Script/Event.html
はじめに
回答のいくつかは少し簡潔であり、これが行われるコンテキストについては詳しく説明しません。以前の回答を読んだ後、まだ困惑している人と知識を共有したいと思います。
適切なオプションを決定してください
まず、少し時間を取って、特定の環境(つまり、開発サーバー/コンテナー)に固有の異なるフローを効果的に作成していることを確認します。一般にエラーが発生しやすいため、これはベストプラクティスに反します。そうは言っても、いくつかの方法で目的を達成できます。
スクリプトをトリガーしません( docs )
一部の環境でスクリプトをトリガーしたくない場合は、--no-scripts
フラグを使用してこれを防止できます。
ドキュメントの読み取り:--no-scripts
:composer.jsonで定義されたスクリプトの実行をスキップします。
composer upgrade --no-scripts
これは、コードが現在機能していないときにパッケージをアップグレードする場合に特に便利です。スクリプトのみが開発およびテスト関連である場合にも機能します。
1つのスクリプトを個別に実行する( docs )
必要に応じて、特定のコマンドを実行するだけです。
composer run-script [--dev] [--no-dev] script
これは、特定の状況でのみスクリプトを実行する場合に役立ちます。
たとえば、テストを実行する前に特定のスクリプトを実行する必要があるビルドシステムでは、ビルドシステムは、上記のようなカスタムスクリプトを呼び出す構成オプションを提供します。
コマンドでの条件の定義( docs )
ドキュメントの読み取り:composerインストールまたは更新プロセス中に、COMPOSER_DEV_MODE
という名前の変数が環境に追加されます。コマンドが- -no-devフラグ。この変数は0に設定されます。それ以外の場合は1に設定されます。
例は次のようになります
"scripts": {
"post-install-cmd": [
"[ $COMPOSER_DEV_MODE -eq 0 ] || <your command>"
]
}
個人的には、コンテナを使用している場合、これは推奨される方法であると言えます。
注:%COMPOSER_DEV_MODE%
が必要になるため、これはWindowsでは機能しません。
extra
のdev-scripts
セクションを使用して、すべてのコマンドで上記を入力しなくても同じ目標を達成できるようにするパッケージ( scriptsdev by neronmoon など)もあります。 composer.jsonのセクション
PHP scriptで条件を定義する( docs )
PHPメソッドを呼び出します。これは、アプリケーションが既にこれを行っている方法に基づいて環境をチェックします。この条件を上記の「コマンドでの条件の定義」と組み合わせることで、この条件を再利用することもできます。
"scripts": {
"post-update-cmd": [
"AppNameSpaceName\\YourClassName::methodName"
]
}
次に、次のようにクラスを作成します。
<?php
namespace AppNameSpaceName;
class YourClassName
{
methodName() {
// do stuff
}
}
多くの最新のフレームワークには、アプリケーションのランタイム環境を決定するメカニズムがすでに存在しています( Symfony way 、 Laravel way )。
ヤーンラン( docs )
現在、ほとんどのPHPアプリケーションはjavascriptファイルもトランスパイルしているため、NPMまたはYarnのいずれかがインストールされます。スクリプトセクションを使用して、この部分を開発マシン/コンテナでのみ実行できます。次に例を示します。
yarn run dev-only-script
package.jsonにセクションがある
"scripts": {
"dev-only-script": "rm some/folder && ln -s path/to/your/folder some/"
}
これのポイントは、composer.jsonをクリーンにすることです。ヤーンでは、dev-server
、test
、build
のスクリプトを作成できます。
COMPOSER_DEV_MODE 環境変数を使用できます(バージョン1.3.0-RCの新機能-2016-12-11):
"scripts": {
"post-install-cmd": [
"[ $COMPOSER_DEV_MODE -eq 0 ] || echo devmode only"
]
},
post-update-cmd
フックを使用する代わりに、dev経路用のカスタムスクリプトを設定することで同じ効果を得ることができます。
"scripts": {
"update-behat": [
"rm -rf vendor/Behat",
"git clone git://github.com/Behat/Behat.git",
"cp composer.phar Behat/composer.phar",
"cd Behat && git submodule update --init",
"cd Behat && php composer.phar install",
"cd Behat && php composer.phar require guzzle/guzzle:3.0.*",
"mv Behat vendor/Behat",
"ln -sf ../Behat/bin/behat vendor/bin/"
],
"dev-update": [
"@composer update --dev",
"@update-behat"
]
}
次に、単にphp composer.phar dev-update
を実行します
ここに小さなパッケージがあります https://github.com/neronmoon/scriptsdev dev-onlyスクリプトを定義する機能を追加します。使用法
...
"extra": {
"scripts-dev": {
"post-install-cmd": [
"npm install --dev"
],
"post-update-cmd": "php ./someCoolCommand.php"
},
}
...
次のコマンドを実行します。
composer update --no-scripts