以 -- 开头的脚本参数被删除
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.ps1
:Set-Alias -Name npm -Value npm.cmd
- Rename/remove
npm.ps1
以确保 PowerShell 使用 npm.cmd
而不是
- 在 PowerShell 使用的前面添加另一个
--
以允许 npm 使用以下 --
:npm run test -- -- --value 10
或npm -- run test -- --value 10
- 引用
--
:npm run test '--' --value 10
在节点 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.ps1
:Set-Alias -Name npm -Value npm.cmd
- Rename/remove
npm.ps1
以确保 PowerShell 使用npm.cmd
而不是 - 在 PowerShell 使用的前面添加另一个
--
以允许 npm 使用以下--
:npm run test -- -- --value 10
或npm -- run test -- --value 10
- 引用
--
:npm run test '--' --value 10