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

新手上路,请多包涵

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

原文由 Richard Knop 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 407
2 个回答

要在不触发任何脚本的情况下进行非开发环境更新,请使用 --no-scripts 命令行开关 update 命令

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

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

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


  1. 参阅 什么是脚本? - 脚本 - 作曲家文档
  2. 基础包 在 Composer 文档中通常称为 _根包_。

原文由 hakre 发布,翻译遵循 CC BY-SA 4.0 许可协议

介绍

有些答案有点简短,没有详细说明这样做的背景。想和大家分享一些知识,给看完前面的回答还有不解的人。

确定适合您的选项

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

不触发任何脚本文档

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

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

 composer upgrade --no-scripts

这在您的代码当前无法运行时升级包时特别有用。如果您的唯一脚本是开发和测试相关的,它也可以工作。

单独运行一个脚本文档

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

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

当您只想在特定场合运行脚本时,这很有用。

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

在命令中定义条件( 文档)

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

一个例子可能看起来像

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

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

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

还有一些包(如 neronmoon 的 scriptsdev )可以帮助您实现相同的目标,而无需在所有命令中键入上述内容,使用作曲家中 dev-scripts 部分中的 extra 部分。 JSON

在 PHP 脚本中定义条件文档

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

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

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

 <?php

namespace AppNameSpaceName;

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

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

纱线运行文档

由于现在大多数 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 干净。在纱线中,您可以拥有 dev-servertestbuild 的脚本。

原文由 Webber 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏