38

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

7 回答 7

56

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

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

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

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

于 2012-10-26T13:00:45.223 回答
25

介绍

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

为您确定正确的选择

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

不触发任何脚本文档

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

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

composer upgrade --no-scripts

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

单独运行一个脚本文档

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

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

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

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

在命令中定义条件文档

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

一个例子可能看起来像

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

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

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

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

在 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 进行清理。在 yarn 中,你可以有dev-server,testbuild.

于 2018-10-27T14:01:17.047 回答
13

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

于 2013-02-26T09:29:57.837 回答
11

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

"scripts": {
    "post-install-cmd": [
        "[ $COMPOSER_DEV_MODE -eq 0 ] || echo devmode only"
    ]
},
于 2018-09-05T10:16:44.023 回答
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

于 2016-07-18T14:31:40.587 回答
2

这是您可以用来执行此操作的小包 https://github.com/neronmoon/scriptsdev 它增加了定义 only-dev 脚本的能力。用法

...
"extra": {
    "scripts-dev": {
    "post-install-cmd": [
        "npm install --dev"
    ],
    "post-update-cmd": "php ./someCoolCommand.php"
    },
}
...
于 2017-12-20T09:15:18.553 回答
2

运行以下命令。

 composer update --no-scripts
于 2018-02-13T07:47:41.753 回答