使用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"我想启动"npm install-production"one_answers"bower install-production"(

据我所知,似乎没有办法根据传递的标志来更改为"安装后命令"指定的列表,也没有办法设置变量,然后将这些变量传递给安装后命令中的命令。

我是不是错过了什么?似乎不可能使用composer来同时使用配置进行开发和生产安装。我真的必须在生产中使用composer install --no-scripts,然后自己手动运行所有四个命令吗?这看起来有点笨拙。

您可以始终使用PHP为您进行环境检测,然后从同一脚本安装其他依赖项。这不是很好也不干净,就像在安装后的cmd中包含npm和bower一样,但它会让你得到你想要的。

"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命令。

这会起作用;

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

也就是说,您应该在开发环境中运行"update",并且只在生产环境中运行过"install"。

这有点麻烦,但您可以在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"

不过,我推荐@kwoodfriend的解决方案,因为它需要bash、ps&grep。

因为我使用npm、bower和gullow来构建我的资产,所以我在生产中不需要它们中的任何一个,所以这里是我使用的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"
    ]

但在我看来,使用这样一个棘手的命令来检测开发环境很奇怪,或者不。。。

相关内容

  • 没有找到相关文章

最新更新