如何将参数传递给自定义作曲家脚本

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:

如果您执行脚本组并调用多个事物,则无法仅将参数传递给其中一个子脚本。..

【讨论】:

以上是关于如何将参数传递给自定义作曲家脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何将附加参数传递给自定义 python 排序函数

将参数传递给自定义 save() 方法

Sklearn Pipeline:将参数传递给自定义变压器?

如何将三个或多个参数传递给自定义模板标签过滤器 django?

distutils:如何将用户定义的参数传递给 setup.py?

使用 Express 服务器将多个参数传递给 Next.js 自定义 URL