为啥是 。作为参数传递给没有 -- 分隔符的 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。

【讨论】:

你说; “因此 npm test . 等价于 npm test -- --.npm test -- --coverage 将等价于 npm test coverage。但是,您给出的可比较示例都不是等效的。在您的第一个示例中,使用脚本/命令将接收其中一个; .--.。在您的第二个示例中,消费脚本/命令将收到; --coveragecoverage. 您说得对,感谢您指出这一点。我相信更新的版本应该是正确的 @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 子句

将 DataFrame 切片作为参数传递给没有“SettingWithCopyWarning”的函数

如何在一个条目中将RGB作为单独的参数传递给函数