使用Composer在生产中安装npm和bower包(即没有devDependencies)

Dan*_*n B 12 php npm laravel composer-php bower

在我的composer.json文件中,我在脚本部分中有以下内容:

    "post-install-cmd": [
        "php artisan clear-compiled",
        "php artisan optimize",
        "npm install",
        "bower install"
    ]
Run Code Online (Sandbox Code Playgroud)

运行'composer install'时,这将导致npm和bower安装所有依赖项,默认情况下包括devDependencies.在进行生产推广时(例如'composer install --no-dev'我要启动'npm install --production'和'bower install --production')

据我所知,似乎没有办法根据传递的标志更改为'post-install-command'指定的列表,或者设置变量然后可以传递给post中的命令的方法-install-CMD.

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

kfr*_*end 13

您可以随时使用PHP为您执行环境检测,然后从同一脚本安装其他依赖项.这不是很好而且很干净,比如在post-install-cmd中包含npm和bower,但它会为你提供你想要的东西.

"post-install-cmd": [
     "php artisan clear-compiled",
     "php artisan optimize",
     "php path/to/installer.php"
 ]
Run Code Online (Sandbox Code Playgroud)

示例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}");
Run Code Online (Sandbox Code Playgroud)

您可以使此示例更加健壮,甚至可以为它创建Artisan命令.

  • 您的安装/更新后脚本将会失败,因为您假设 npm 已安装在用户的计算机上,但事实可能并非如此。 (2认同)

Lau*_*nce 5

这会起作用;

"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"
]
Run Code Online (Sandbox Code Playgroud)

也就是说,您应该在开发环境中运行“更新”,并且只在生产环境中运行“安装”。

  • 如果我在一个团队中,这会很好地工作,但如果我希望其他团队成员从 .lock 文件中获取 Composer 中所有包的当前版本,他们将无法做到。他们将被迫更新所有软件包或错过开发依赖项。 (2认同)
  • 然后我假设您应该首先运行“composer install”和“composer update”。对于开发者来说应该不是问题。 (2认同)