私のcomposer.jsonファイルでは、スクリプトセクションに次の行があります。
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize",
"npm install",
"bower install"
]
「composer install」を実行すると、これによりnpmとbowerはすべての依存関係をインストールします。これにはデフォルトでdevDependenciesが含まれます。本番環境でのロールアウトの場合(例: 'composer install --no-dev' up up up 'npm install --production' and 'bower install --production')
私が知る限り、渡されたフラグに応じて 'post-install-command'に指定されたリストを変更する方法も、postのコマンドに渡される変数を設定する方法もないようです-install-cmd。
何か不足していますか? composerを使用して、configだけを使用してdevと本番環境の両方のインストールを行うことはできません。本番環境でcomposer install --no-scripts
を実際に使用し、4つすべてを手動で実行する必要がありますか?私自身のコマンドの?それは少し不格好なようです。
PHPを使用して環境を検出し、同じスクリプトから他の依存関係をインストールすることができます。これは、インストール後のnpmとbowerのような、きれいではありません。 cmd、しかしそれはあなたが探しているものを得るでしょう。
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize",
"php path/to/installer.php"
]
Installer.phpの例:
// Logic to determine the environment. This could be determined many ways, and depends on how your
// application's environment is determined. If you're making use of Laravel's environment
// capabilities, you could do the following:
$env = trim(exec('php artisan env'));
// Clean up response to get the value we actually want
$env = substr($env, strrpos($env, ' ') + 1);
$envFlag = ($env === 'production')
? '--production'
: '';
// Install npm
passthru("npm install {$envFlag}");
// Install bower
passthru("bower install {$envFlag}");
この例をより堅牢にして、Artisanコマンドを作成することもできます。
少しハックですが、bashで$PPID
を使用して親コマンドのPIDを取得できます。それから、コマンドライン引数を取得できます。
"post-install-cmd": [
"ps -ocommand= -p $PPID | grep no-dev > /dev/null && echo called with no-dev || echo called without no-dev",
],
これを行う場合は、bashスクリプトに入れて、次のように実行します。run-if-env-is-production.sh "bower install --production"
ただし、これはbash、ps、およびgrepを必要とするため、移植性が低いため、@ kwoodfriendのソリューションをお勧めします。
これはうまくいくでしょう。
"post-update-cmd": [
"php artisan clear-compiled",
"php artisan optimize",
"npm install",
"bower install"
],
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize",
"npm install --production",
"bower install --production"
]
つまり、開発環境で「更新」を実行し、本番環境でのみ「インストール」を実行する必要があります。
私はnpm、bower、gulpを使用してアセットを構築しているため、本番環境ではそれらを必要としません。そのため、使用するcomposer.jsonは次のとおりです。
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize",
"(ps -ocommand= -p $PPID | grep -q no-dev && true) || npm --loglevel silent install",
"(ps -ocommand= -p $PPID | grep -q no-dev && true) || npm --loglevel silent install --global bower",
"(ps -ocommand= -p $PPID | grep -q no-dev && true) || bower --silent install"
],
"post-update-cmd": [
"php artisan clear-compiled",
"php artisan optimize",
"(ps -ocommand= -p $PPID | grep -q no-dev && true) || npm --loglevel silent update",
"(ps -ocommand= -p $PPID | grep -q no-dev && true) || bower --silent update"
]
...しかし、開発環境を検出するためにそのようなトリッキーなコマンドを使用するかどうかは、奇妙に見えます...
Composer.org のブロック全体の例
{
"scripts": {
"post-update-cmd": "MyVendor\\MyClass::postUpdate",
"post-package-install": [
"MyVendor\\MyClass::postPackageInstall"
],
"post-install-cmd": [
"MyVendor\\MyClass::warmCache",
"phpunit -c app/"
],
"post-create-project-cmd" : [
"php -r \"copy('config/local-example.php', 'config/local.php');\""
]
}
}