为啥是 。作为参数传递给没有 -- 分隔符的 npm?
Posted
技术标签:
【中文标题】为啥是 。作为参数传递给没有 -- 分隔符的 npm?【英文标题】:Why is . passed as argument to npm without -- delimiter?为什么是 。作为参数传递给没有 -- 分隔符的 npm? 【发布时间】:2021-11-04 08:05:52 【问题描述】:我无法弄清楚为什么 npm
使用 .
而没有 --
分隔符。
在以下命令中,.
被传递给 test
脚本,没有 --
分隔符。
npm test .
test
脚本在package.json
中定义如下:
"test": "react-app-rewired test"
将常规参数传递给test
脚本
当我尝试将 --coverage
传递给 npm test
时发生这种情况,但后来我发现要将参数传递给 npm 脚本,我需要在任何后续参数之前使用 --
。
如果我想传递参数,这就是有效的:
npm test -- --coverage
但这不会通过--coverage
参数
npm test --coverage
问题是为什么 .
在没有 --
的情况下通过。根据 npm 文档将任何参数传递给我们需要使用 --
分隔符的脚本,npm 将知道以下标志/参数适用于 test
脚本或我们想要参数化的任何其他脚本。
【问题讨论】:
你能澄清一下你在哪里收到/没有收到这些论点吗?您如何判断一个有效而另一个无效? 我编辑了我的问题以提供更多背景信息。告诉我这是否更有意义。 注意位置参数和选项的区别:***.com/questions/36495669/… 啊哈。如果我得到正确的 ti,.
是npm
命令的选项吗?但在我的情况下,它也是 npm test
包装的测试命令的参数
基本上,句点 (.
) 不会被解释为选项,因为它不以连字符 (-
) 开头。
【参考方案1】:
正如Charles Duffy 在他对this question 的回答中解释的那样(强调我的):
双连字符 (
--
) 作为一个参数本身是标准化的 所有 UNIX 命令:这意味着应该处理更多的参数 作为位置参数,而不是选项。
回答您的问题:.
作为位置参数传递给 react-app-rewired
脚本,因为您在运行 npm test .
时将其作为位置参数提供。--something
将被 npm 解释为一个单独的选项,除非它在某些时候以 --
为前缀,在这种情况下,它也将被视为位置参数。
有关命令选项、参数和参数之间区别的更详细说明,请参阅this SO question。
【讨论】:
你说; “因此 npmtest .
等价于 npm test -- --.
和 npm test -- --coverage
将等价于 npm test coverage
”。但是,您给出的可比较示例都不是等效的。在您的第一个示例中,使用脚本/命令将接收其中一个; .
或 --.
。在您的第二个示例中,消费脚本/命令将收到; --coverage
或 coverage
.
您说得对,感谢您指出这一点。我相信更新的版本应该是正确的
@whme 为了测试你的假设,我建议将 package.json 中的 test
脚本定义为 "test": "node test.js"
。在 test.js 中添加以下代码行 console.log(process.argv);
。它记录了脚本通过使用process.argv
接收的命令行参数数组。您会看到更新后的比较也不等价。 npm test '--.'
中的 '--.'
和 npm test '--coverage'
中的 '--coverage'
由 npm (未传递给脚本/cmd) 使用,因为即使它们被引用,它们也以连字符开头。 以上是关于为啥是 。作为参数传递给没有 -- 分隔符的 npm?的主要内容,如果未能解决你的问题,请参考以下文章
AfxBeginThread 破坏了作为参数传递给线程函数的类中的 LPWSTR 值。为啥?
为啥我们将字符串数组作为参数传递给 main() 方法,为啥不传递任何集合类型或包装类型或原始类型?
在 Visual Studio 2008 中使用设计器将逗号分隔列表作为参数传递给 db2 查询的 IN 子句