Composer - 仅在开发环境中运行脚本

时间:2012-10-26 12:40:02

标签: php jenkins composer-php

这是我的composer.json文件:

"require": {
    "php": ">=5.4",
    "zendframework/zendframework": "2.*",
    "doctrine/doctrine-module": "dev-master",
    "doctrine/doctrine-orm-module": "0.*",
    "gedmo/doctrine-extensions": "dev-master"
},
"require-dev": {
    "phpunit/phpunit": "3.7.*"
},
"scripts": {
    "post-update-cmd": [
        "rm -rf vendor/Behat",
        "git clone git://github.com/Behat/Behat.git",
        "cp composer.phar Behat/composer.phar",
        "cd Behat && git submodule update --init",
        "cd Behat && php composer.phar install",
        "cd Behat && php composer.phar require guzzle/guzzle:3.0.*",
        "mv Behat vendor/Behat",
        "ln -sf ../Behat/bin/behat vendor/bin/"
    ]
}

如何才能使脚本只在开发环境中运行?

基本上我希望脚本只在我打电话时运行:

php composer.phar update --dev

7 个答案:

答案 0 :(得分:40)

要在不触发任何脚本的情况下执行非开发环境更新,请使用the --no-scripts command line switch for the update command

php composer.phar update --no-scripts
                         ^^^^^^^^^^^^

默认情况下,Composer脚本仅在基础包中执行。因此,您可以拥有一个用于开发的软件包,并且在实时环境中使其成为实时系统的依赖项。

除此之外,我认为没有办法自动区分脚本。

答案 1 :(得分:11)

无法为默认安装和 - dev选项选择不同的脚本,但您可以在 Composer \ Script \中使用 isDevMode()方法事件仅在开发环境中运行命令。 http://getcomposer.org/apidoc/master/Composer/Script/Event.html

答案 2 :(得分:6)

您可以通过为dev路径设置自定义脚本来实现相同的效果,而不是使用post-update-cmd挂钩。

"scripts": {
    "update-behat": [
        "rm -rf vendor/Behat",
        "git clone git://github.com/Behat/Behat.git",
        "cp composer.phar Behat/composer.phar",
        "cd Behat && git submodule update --init",
        "cd Behat && php composer.phar install",
        "cd Behat && php composer.phar require guzzle/guzzle:3.0.*",
        "mv Behat vendor/Behat",
        "ln -sf ../Behat/bin/behat vendor/bin/"
    ],
    "dev-update": [
        "@composer update --dev",
        "@update-behat"
    ]
}

然后只需运行php composer.phar dev-update

答案 3 :(得分:5)

您可以使用COMPOSER_DEV_MODE环境变量(版本1.3.0-RC-2016-12-11中的新功能):

"scripts": {
    "post-install-cmd": [
        "[ $COMPOSER_DEV_MODE -eq 0 ] || echo devmode only"
    ]
},

答案 4 :(得分:3)

简介

一些答案​​很简短,并且没有详细说明完成此操作的环境。阅读之前的答案后,我仍然想与仍然困惑的人分享一些知识。

为您确定正确的选项

首先,花一点时间意识到您正在有效地创建针对特定环境(即您的开发服务器/容器)的不同流程。这违反任何最佳做法,因为它通常容易出错。话虽如此,您可以通过多种方式实现您想要的;

不触发任何脚本docs

如果在某些环境中您不想触发任何脚本,则可以使用--no-scripts标志来防止这种情况。

文档内容为:--no-scripts:跳过对composer.json中定义的脚本的执行。

composer upgrade --no-scripts

当代码当前不起作用时升级软件包时,这特别有用。如果您唯一的脚本是与开发和测试相关的,它也将起作用。

单独运行一个脚本docs

只需根据需要运行特定命令:

composer run-script [--dev] [--no-dev] script

当您只想在特定情况下运行脚本时,这很有用。

例如,在构建系统上,必须在运行任何测试之前执行一定的脚本;构建系统提供了配置选项来调用上述自定义脚本。

在命令中定义条件docs

文档内容如下:在作曲家安装或更新过程中,会将名为COMPOSER_DEV_MODE的变量添加到环境中。如果命令是通过--no-dev标志运行的,则此变量将设置为0,否则将设置为1。

一个例子可能像

"scripts": {
    "post-install-cmd": [
         "[ $COMPOSER_DEV_MODE -eq 0 ] || <your command>"
    ]
}

如果使用容器,我个人会说这是推荐的方式。

注意:这在Windows上不起作用,因为它需要%COMPOSER_DEV_MODE%

还有一些软件包(如scriptsdev by neronmoon)可以帮助您实现相同的目标,而不必在composer的dev-scripts部分中的extra部分中使用所有命令来键入以上内容.json

在PHP脚本中定义条件docs

调用一个PHP方法,该方法根据您的应用程序已执行此操作的方式检查您的环境。您甚至可以通过与上面的方法结合使用此条件; “在命令中定义条件”。

"scripts": {
    "post-update-cmd": [
        "AppNameSpaceName\\YourClassName::methodName"
    ]
}

然后您可以继续创建类,如下所示:

<?php

namespace AppNameSpaceName;

class YourClassName 
{
    methodName() {
         // do stuff
    }
}

在许多现代框架中,已经存在一种机制来确定应用程序的运行时环境(Symfony wayLaravel way)。

纱线运行docs

由于当今大多数PHP应用程序还可以转换其javascript文件,因此将安装NPM或Yarn。您可以使用脚本部分仅在开发机器/容器上运行此部分。例如:

yarn run dev-only-script

package.json中有一个部分

"scripts": {
    "dev-only-script": "rm some/folder && ln -s path/to/your/folder some/"
}

关键是将composer.json清理干净。在yarn中,可以有dev-servertestbuild的脚本。

答案 5 :(得分:2)

这是小包装,您可以用它来做 https://github.com/neronmoon/scriptsdev 它增加了仅定义-dev脚本的能力。 使用

...
"extra": {
    "scripts-dev": {
    "post-install-cmd": [
        "npm install --dev"
    ],
    "post-update-cmd": "php ./someCoolCommand.php"
    },
}
...

答案 6 :(得分:0)

运行以下命令。

 composer update --no-scripts