web-dev-qa-db-ja.com

Composerを使用して本番環境にnpmおよびbowerパッケージをインストールする(つまり、devDependenciesを使用しない))

私の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つすべてを手動で実行する必要がありますか?私自身のコマンドの?それは少し不格好なようです。

13
Dan B

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コマンドを作成することもできます。

13
kfriend

少しハックですが、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のソリューションをお勧めします。

2
dave1010

これはうまくいくでしょう。

"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"
]

つまり、開発環境で「更新」を実行し、本番環境でのみ「インストール」を実行する必要があります。

2
Laurence

私は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"
    ]

...しかし、開発環境を検出するためにそのようなトリッキーなコマンドを使用するかどうかは、奇妙に見えます...

1
loranger

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');\""
        ]
    }
}
0
pliashkou