这是我的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
答案 0 :(得分:40)
要在不触发任何脚本的情况下执行非开发环境更新,请使用the --no-scripts
command line switch for the update
command:
php composer.phar update --no-scripts
^^^^^^^^^^^^
默认情况下,Composer脚本仅在基础包中执行。因此,您可以拥有一个用于开发的软件包,并且在实时环境中使其成为实时系统的依赖项。
除此之外,我认为没有办法自动区分脚本。
答案 1 :(得分:11)
无法为默认安装和 - dev选项选择不同的脚本,但您可以在 Composer \ Script \中使用 isDevMode()方法事件仅在开发环境中运行命令。 http://getcomposer.org/apidoc/master/Composer/Script/Event.html
答案 2 :(得分: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
答案 3 :(得分:5)
您可以使用COMPOSER_DEV_MODE环境变量(版本1.3.0-RC-2016-12-11中的新功能):
"scripts": {
"post-install-cmd": [
"[ $COMPOSER_DEV_MODE -eq 0 ] || echo devmode only"
]
},
答案 4 :(得分:3)
简介
一些答案很简短,并且没有详细说明完成此操作的环境。阅读之前的答案后,我仍然想与仍然困惑的人分享一些知识。
为您确定正确的选项
首先,花一点时间意识到您正在有效地创建针对特定环境(即您的开发服务器/容器)的不同流程。这违反任何最佳做法,因为它通常容易出错。话虽如此,您可以通过多种方式实现您想要的;
不触发任何脚本(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的dev-scripts
部分中的extra
部分中使用所有命令来键入以上内容.json
在PHP脚本中定义条件(docs)
调用一个PHP方法,该方法根据您的应用程序已执行此操作的方式检查您的环境。您甚至可以通过与上面的方法结合使用此条件; “在命令中定义条件”。
"scripts": {
"post-update-cmd": [
"AppNameSpaceName\\YourClassName::methodName"
]
}
然后您可以继续创建类,如下所示:
<?php
namespace AppNameSpaceName;
class YourClassName
{
methodName() {
// do stuff
}
}
在许多现代框架中,已经存在一种机制来确定应用程序的运行时环境(Symfony way,Laravel 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-server
,test
和build
的脚本。
答案 5 :(得分:2)
这是小包装,您可以用它来做 https://github.com/neronmoon/scriptsdev 它增加了仅定义-dev脚本的能力。 使用
...
"extra": {
"scripts-dev": {
"post-install-cmd": [
"npm install --dev"
],
"post-update-cmd": "php ./someCoolCommand.php"
},
}
...
答案 6 :(得分:0)
运行以下命令。
composer update --no-scripts