如何将参数传递给自定义作曲家脚本
Posted
技术标签:
【中文标题】如何将参数传递给自定义作曲家脚本【英文标题】:How to pass arguments to custom composer script 【发布时间】:2020-12-17 23:35:24 【问题描述】:在我的 Laravel 项目中,我想为单个文件运行 phpunit,如下所示:
$ composer run-script test tests/Unit/Services/OrderServiceTest.php
这是我的作曲家设置:
"scripts":
"test": [
"@testenv",
"@phpunit"
],
"testenv": [
"php artisan config:cache --env=testing",
"php artisan config:clear"
],
"phpunit": [
"php ./vendor/phpunit/phpunit/phpunit --"
]
但是,我遇到了这个错误:
www@287dd7480e22:/var/www$ composer run-script test tests/Unit/Services/OrderServiceTest.php
php artisan config:cache --env=testing 'tests/Unit/Services/OrderServiceTest.php'
参数过多,预期参数“命令”。
注意:
我看过这个帖子:How do you pass an argument to a composer script from the command line?。但是解决方案(在自定义作曲家脚本末尾添加--
)不适用于我的情况,或者我无法正确理解。
如果我不传递参数,脚本运行没有问题。 (即为所有测试文件运行 phpunit)
【问题讨论】:
可能是因为你的参数被传递给你的两个命令,第一个是artisan
命令,它不接受错误提到的这样的参数。您可以做的是将您的命令分成两部分:composer test-env && composer phpunit tests/Unit/Services/OrderServiceTest.php
(或 Windows 下的(composer test-env) -and (composer phpunit tests/Unit/Services/OrderServiceTest.php)
)。可能有一种方法可以将您的参数仅传递给最后一个命令,但我不知道。
@Jeto 我知道确切的原因,我想以更优雅的方式解决它:只将你的参数传递给最后一个命令 - 是的
另一种方法是让您的 test
脚本成为带有 php artisan config:cache --env=testing && php artisan config:clear && @phpunit
的单个条目(因为遗憾的是,@testenv && @phpunit
不起作用),这应该完全符合您的要求,但那是在 composer.json 文件中复制 @testenv
命令行并不理想。无论如何,我在这里没有看到任何完美的解决方案,但也许其他人知道。
【参考方案1】:
有一个技巧可以让你忽略子脚本的参数:
"scripts":
"testenv": [
"php artisan config:cache --env=testing || exit $?",
...
],
...
这里发生的情况是您的参数(比如说OrderServiceTest.php
)被附加到整个命令行,但是shell 命令exit
会忽略退出代码之后的任何其他参数。对于退出代码,我们设置了$?
,这是最后一个运行命令的退出代码,以免改变整体结果。
【讨论】:
【参考方案2】:根据this comment in composer repository:
如果您执行脚本组并调用多个事物,则无法仅将参数传递给其中一个子脚本。..
【讨论】:
以上是关于如何将参数传递给自定义作曲家脚本的主要内容,如果未能解决你的问题,请参考以下文章
Sklearn Pipeline:将参数传递给自定义变压器?
如何将三个或多个参数传递给自定义模板标签过滤器 django?