这是我的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
,如果这对被分割并且必须去, 那么它只能扔。
参考资料
- 请参阅什么是脚本中的"注意:"?- 脚本 - 作曲家文档
- 基础包在 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-server
、test
和build
的脚本。
无法为默认安装和--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