以 -- 开头的脚本参数被删除

Scripts arguments starting with -- are removed

在节点 14 中,我有以下脚本

scripts: {
  "test": "node test.js",
}

然后我 运行 它使用以下命令 npm run test -- --value '10' 这给出了输出

node test.js "--value" "10"

但是当我切换到节点 16 时,所有以 -- 开头的参数都会被删除

所以当我 运行 npm run test -- --value '10' 这给出了输出

node test.js "10"

“--值”去哪儿了?

我不能 100% 确定根本原因,但我现在可以解释 semi-root 原因和解决方法。

我的机器上似乎只有 C:\Program Files\nodejs 中的一个 npm.cmd 文件,而你的机器上也有一个 npm.ps1 文件。该文件似乎仅在某些 install/upgrade 路径中创建,您的节点升级似乎导致创建该文件。

这意味着当您在 PowerShell 中 运行 npm 时,它调用的是 ExternalScript 而不是 Application。因此,调用 cmdlet 的语义适用于调用,而不适用于调用本机 commands/applications.

的语义

这些语义包括使用 -- 停止解析更多参数。这意味着在这种情况下 PowerShell 将消耗 -- 令牌,因此它永远不会到达 npm!反过来,现在使用 npm run test --value 10 而不使用 -- 调用 npm 将吞下 --value,因为它被认为是 npm 的参数,而不是您要调用的脚本的参数。

引自the docs

The end-of-parameters token (--)

The end-of-parameters token (--) indicates that all arguments following it are to be passed in their actual form as though double quotes were placed around them. For example, using -- you can output the string -InputObject without using quotes or having it interpreted as a parameter

这里没有说明它仅适用于 cmdlet 和外部脚本,但我的测试表明情况确实如此。

我能想到四种可能的解决方案:

  • 创建别名以手动将 npm 指向 npm.cmd 而不是 npm.ps1Set-Alias -Name npm -Value npm.cmd
  • Rename/remove npm.ps1 以确保 PowerShell 使用 npm.cmd 而不是
  • 在 PowerShell 使用的前面添加另一个 -- 以允许 npm 使用以下 --npm run test -- -- --value 10npm -- run test -- --value 10
  • 引用--npm run test '--' --value 10