为啥 npm 将命令行标志直接传递给我的脚本?

Posted

技术标签:

【中文标题】为啥 npm 将命令行标志直接传递给我的脚本?【英文标题】:Why is npm passing cmd line flags directly to my script?为什么 npm 将命令行标志直接传递给我的脚本? 【发布时间】:2018-10-15 06:10:00 【问题描述】:

我正在使用 npm 运行构建,并且正在尝试使用 cmd 行标志覆盖我的 .npmrc 配置选项。但是 npm 坚持将这些标志直接传递给我的脚本,而不是像文档中描述的那样将它们作为配置选项读取。我做错了什么?

我尝试从 cmd 行构建一个 Tizen pacakge,如下所示:

npm run package --tizen_profile myprofile

在我的 package.json 中我有:

"package": "tizen package -t wgt --sign $npm_package_config_tizen_profile -- .buildResult/wgt -o .buildResult/wgt"

运行命令的结果是:

package: `tizen package -t wgt --sign $npm_package_config_tizen_profile -- .buildResult/wgt -o .buildResult/wgt "myprofile"`

它应该在哪里:

package: `tizen package -t wgt --sign "myprofile"_tizen_profile -- .buildResult/wgt -o .buildResult/wgt`

就像 npm 只是将 cmd 行参数附加到脚本命令,而不是像文档中描述的变量那样将其插入:https://docs.npmjs.com/misc/config

最近 npm 是否有更新弃用并删除了此功能?我刚刚更新到 npm 6.x,但它在 5.x 上也以这种方式工作。

【问题讨论】:

【参考方案1】:

我想通了!

文档存在缺陷,因为它没有告诉您传递 npm 配置属性的正确语法。我不得不使用:

npm run package --mypackagename:tizen_profile="myprofile"

其中 mypackagename 是 package.json 中使用的名称属性。另请注意,键值语法是--key=value 而不是--key value,如文档中所述。同样,--key 将是 packagename:key 使用在您的 package.json 的顶层指定的名称。

【讨论】:

请在我关于传递非 npm-config 变量的问题中查看我的更新【参考方案2】:

您可以尝试在没有--sign 标志的package.json 中重写您的脚本,例如:

"package": "tizen package -t wgt -- .buildResult/wgt -o .buildResult/wgt"

然后在运行 npm 命令时传递它:

npm run package -- --sign myprofile

我假设您可以更改参数的顺序,因为--sign myprofile 现在将位于命令的最后

更新

这是传递变量并将它们放置在 CLI 命令中的任何位置的另一种方法(不使用 npm config set)。在我的package.json

"aaa": "ls $myoptionalflag && $mycmd"

这样我可以将任何标志传递给la 命令(或根本不传递),并且我可以将任何CLI 命令作为mycmd 变量传递。所以,现在我可以运行了:

myoptionalflag=-la mycmd=pwd npm run aaa

哪个会执行

ls -la && pwd

mycmd=pwd npm run aaa

哪个会执行

ls && pwd

【讨论】:

谢谢,我想到了这个,这是最后的手段,因为它不能很好地扩展。如果我需要覆盖超过 1 个标志,我会进入 vertbosity。我希望我只是忽略了一些秘密的语法糖,比如额外的“-”或引号之类的。哈哈 巧妙使用环境变量!我喜欢!再一次,我最终发现了我的痛苦,这仅仅是一个文档问题。他们从来没有提到在 cmd 行上设置时必须使用包名作为变量的一部分。

以上是关于为啥 npm 将命令行标志直接传递给我的脚本?的主要内容,如果未能解决你的问题,请参考以下文章

将命令行参数传递给 package.json 中的 npm 脚本

将参数从cmd传递到python脚本[重复]

如何将强制和可选命令行参数传递给 perl 脚本?

R命令行将文件名传递给参数中的脚本(Windows)

为啥 argparse 不能正确解析我的布尔标志? [复制]

如何传播 npm 脚本命令行参数?