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

Ric*_*nop 30 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/"
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

基本上我希望脚本只在我调用时运行:

php composer.phar update --dev
Run Code Online (Sandbox Code Playgroud)

hak*_*kre 43

要做到非开发环境更新,而不会触发任何脚本,使用--no-scripts在命令行开关update命令:

php composer.phar update --no-scripts
                         ^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

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

除此之外,我没有看到任何自动区分脚本的方法.

  • @TobiasGaertner:引用:*“注意:仅执行根包的composer.json 中定义的脚本。如果根包的依赖项指定了自己的脚本,Composer 不会执行这些附加脚本。”* 来自:https:// getcomposer.org/doc/articles/scripts.md#what-is-a-script- (2认同)

Chr*_*och 12

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


Web*_*ber 11

介绍

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

确定适合您的选项

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

不触发任何脚本docs

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

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

composer upgrade --no-scripts
Run Code Online (Sandbox Code Playgroud)

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

单独运行一个脚本docs

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

composer run-script [--dev] [--no-dev] script
Run Code Online (Sandbox Code Playgroud)

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

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

在命令中定义条件docs

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

一个例子可能看起来像

"scripts": {
    "post-install-cmd": [
         "[ $COMPOSER_DEV_MODE -eq 0 ] || <your command>"
    ]
}
Run Code Online (Sandbox Code Playgroud)

我个人认为如果您使用容器,这是推荐的方法。

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

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

在PHP脚本中定义条件docs

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

"scripts": {
    "post-update-cmd": [
        "AppNameSpaceName\\YourClassName::methodName"
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

<?php

namespace AppNameSpaceName;

class YourClassName 
{
    methodName() {
         // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

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

纱线运行docs

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

yarn run dev-only-script
Run Code Online (Sandbox Code Playgroud)

在package.json中有一个部分

"scripts": {
    "dev-only-script": "rm some/folder && ln -s path/to/your/folder some/"
}
Run Code Online (Sandbox Code Playgroud)

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


Ali*_*gji 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"
    ]
}
Run Code Online (Sandbox Code Playgroud)

然后简单地运行 php composer.phar dev-update


Ved*_*eda 6

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

"scripts": {
    "post-install-cmd": [
        "[ $COMPOSER_DEV_MODE -eq 0 ] || echo devmode only"
    ]
},
Run Code Online (Sandbox Code Playgroud)