【问题标题】:Composer - run scripts only in dev environmentComposer - 仅在开发环境中运行脚本
【发布时间】:2012-10-16 17:29:17
【问题描述】:

这是我的 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

【问题讨论】:

    标签: php jenkins composer-php


    【解决方案1】:

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

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

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

    除此之外,我看不到任何自动区分脚本的方法。

    【讨论】:

    • "默认情况下 Composer 脚本只在基础包中执行。" - 那正确吗?添加 --no-script 破坏了我的部署,因为它没有执行底层依赖项中的脚本...
    • @TobiasGaertner: Quote: "注意:仅执行根包的composer.json中定义的脚本。如果根包的依赖项指定了自己的脚本,则Composer不会执行那些附加的脚本。” 来自:getcomposer.org/doc/articles/scripts.md#what-is-a-script-
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以通过为 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

      【讨论】:

        【解决方案4】:

        这是一个小包,你可以用它来做 https://github.com/neronmoon/scriptsdev 它增加了定义 only-dev 脚本的能力。 用法

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

        【讨论】:

          【解决方案5】:

          运行以下命令。

           composer update --no-scripts
          

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 我曾经运行过这个,但由于某种原因它开始显示:sh: 1: [: -eq: unexpected operator。有什么想法吗?
            • @Fabiano 我认为错误意味着 $COMPOSER_DEV_MODE 未设置。会不会是您使用的是 1.3.0-RC 版本之前的作曲家?
            • 使用作曲家版本Composer 1.8.3 2019-01-30 08:31:33。我将 sh 命令替换为 PHP 类静态方法调用。它确实添加了另一个目录并需要使用 PSR-0 自动加载,但最终添加条件行为会更干净。
            • @Veda 对我来说同样的问题,我添加了 "post-install-cmd": [ "export"] 以查看所有变量,并且不存在 COMPOSER_DEV_MODE 变量。我有作曲家版本 1.8.4
            • @midlan,我不知道。使用set怎么样?也许变量没有被导出?
            【解决方案7】:

            简介

            有些答案有点简短,并没有详细介绍完成此操作的上下文。看了前面的回答后还有疑惑的朋友,我想和大家分享一些知识。

            确定适合您的选项

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

            不触发任何脚本 (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.json 中extra 部分中的dev-scripts 部分

            在 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 的脚本。

            【讨论】:

              猜你喜欢
              • 2020-05-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多