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

时间:2014-08-04 15:25:53

标签: php laravel npm composer-php bower

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

    "post-install-cmd": [
        "php artisan clear-compiled",
        "php artisan optimize",
        "npm install",
        "bower install"
    ]

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

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

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

5 个答案:

答案 0 :(得分:12)

您可以随时使用PHP为您执行环境检测,然后从同一脚本安装其他依赖项。这不是很干净,比如在post-install-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命令。

答案 1 :(得分:2)

这有点黑客但你可以在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的。

答案 2 :(得分:1)

这样可行;

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

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

答案 3 :(得分:1)

因为我使用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"
    ]

...但是对于我来说,使用这样一个棘手的命令来检测开发环境是不是很奇怪......

答案 4 :(得分:0)

来自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');\""
        ]
    }
}