作曲家 - 仅在开发环境中运行脚本



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

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

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

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

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


这个答案是从 2012 年回来的,现在可以安全地列出按外观顺序排列的其他选项。由于该列表仅供作曲家使用,并且原始问题闻起来属于 x/y,因此一般答案是使用构建管理器。

但事实证明,这可以在询问的那天完成,就像这个作曲家-json 示例一样:

{
"scripts": {
"post-update-cmd": "composer::dev-post-update-cmd",
"dev-post-update-cmd": [
"rm -rf vendor/Behat",
": ... ",
"ln -sf ../Behat/bin/behat vendor/bin/"
]
}
}
  • 1.0.0-alpha6 (2012-10-23):使用 PHP 脚本类和__callStatic调度仅开发脚本,例如composer::dev-post-update-cmd.如果in_array('--dev', $_SERVER['argv']),则$eventDispatcher->dispatchCommandEvent($name).
  • 1.0.0-alpha7 (2013-05-04):--dev现在是默认的,以后是可选的,--no-dev不需要--dev脚本调度。 这有效地将有问题的命令行从:仅composer update --dev运行更改为:未在composer update --no-dev上运行。$event->isDevMode()现在可用,在事件调度器上调度脚本的新第二个参数也是必需的。与克里斯蒂安·科赫的回答进行比较。
  • 1.0.0-alpha9 (2014-12-07):autoload-dev现在允许通过将脚本类从autoload中删除来自动--no-dev没有脚本类。 这适用于 b/c 不存在的类,没有错误。
  • 1.3.0-RC (2016-12-11):--dev已弃用。COMPOSER_DEV_MODE环境参数现在在更新/安装/转储自动加载脚本中可用。 PHP 脚本类不再需要继承,除非环境参数在您的设置中不起作用,否则请使用 PHP 类脚本进行解决方法。与吠陀的答案进行比较。
  • 3(未来):--dev会不必要地使作曲家致命,至少这是宣布的。 这关闭了 1.0.0-alpha7 之前的循环,后者在相反方面也失败了,--no-dev. 当时和将来使用的命令行库无法对称地应对-[-not]-args,如果这对被分割并且必须去, 那么它只能扔。
<小时 />

参考资料

  1. 请参阅什么是脚本中的"注意:"?- 脚本 - 作曲家文档
  2. 基础包在 Composer 文档中通常称为根包

简介

有些答案有点简短,没有详细说明完成此操作的背景。我想与阅读前面的答案后仍然感到困惑的人分享一些知识。

确定适合您的选项

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

不触发任何脚本(文档)

如果在某些环境中您不想触发任何脚本,则可以使用--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>"
]
}

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

注意:这不适用于窗口,因为它需要%COMPOSER_DEV_MODE%.

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

在 PHP 脚本中定义条件(文档)

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

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

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

<?php
namespace AppNameSpaceName;
class YourClassName 
{
methodName() {
// do stuff
}
}

在许多现代框架中,已经存在一种机制来确定应用程序的运行时环境(Symfony way,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/"
}

这样做的重点是你的作曲家.json干净。在纱线中,你可以有dev-servertestbuild的脚本。

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

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

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

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

运行以下命令。

composer update --no-scripts

这是一个小包,你可以用它来做到这一点 https://github.com/neronmoon/scriptsdev 它增加了定义仅开发脚本的功能。 用法

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

您可以运行任何一个并检查,

composer update --no-scripts

composer dump-autoload

相关内容

  • 没有找到相关文章

最新更新