Javascript 为npm脚本提供部分路径名(作为参数)
是否可以读取Javascript 为npm脚本提供部分路径名(作为参数),javascript,npm,yarnpkg,npm-scripts,Javascript,Npm,Yarnpkg,Npm Scripts,是否可以读取包.json的脚本中的CLI参数。我在找这样的东西: { "scripts": { "example": "ts-node --project tsconfig.json ./examples/${1}/.ts" } } 其中,${1}将被传递给的第一个参数替换 npm run example yadda 并最终运行 ts-node --project tsconfig.json ./examples/yadda/.ts 我知道我可以编写一个JS文件,npm可以
包.json
的脚本中的CLI参数。我在找这样的东西:
{
"scripts": {
"example": "ts-node --project tsconfig.json ./examples/${1}/.ts"
}
}
其中,${1}
将被传递给的第一个参数替换
npm run example yadda
并最终运行
ts-node --project tsconfig.json ./examples/yadda/.ts
我知道我可以编写一个JS文件,npm可以调用并运行该文件来读取CLI参数,但我想知道是否可以从npm脚本条目中读取参数。您可以使用以下语法(不特定于npm本身)
在你的脚本部分,你可以这样做
"example": "ts-node --project tsconfig.json ./examples/$MY_VAR/.ts"
您可以将示例命令设置为运行脚本
{
"scripts": {
"example": "node --project tsconfig.json ./yourscript.js"
}
}
然后在脚本中使用参数
var args=process.argv.splice(process.execArgv.length+2);
args.forEach((值,索引)=>{
log(`Argument${index}是:${value}`);
});
然后,您可以调用运行npm run example arg1 arg2
的脚本,并使用其中一个参数导入/需要另一个文件或有条件地运行特定代码。不幸的是,npm没有也不打算提供内置功能,允许将参数传递到npm脚本的中间(如上所述)。参数只能传递到脚本的末尾
假设在您的示例中,您希望将一个参数传递到脚本的中间(基本上创建一个新的路径名),那么您需要利用一种变通方法
在*nix平台(Linux、macOS等)上,npm使用的默认shell是sh
。因此,您可以利用npm脚本中的作为处理要传递到脚本中间的参数的机制
package.json
。。。
“脚本”:{
“示例”:“func(){ts节点--project tsconfig.json\”/examples/${1}.ts\”;};func”
},
...
说明:
- 在脚本末尾,即尾部的
func
部分调用任意命名的shell函数func
,在脚本开头定义。基本上,通过CLI提供的参数(例如,yadda
)被传递给它
- 在
func
函数体中,我们执行ts node
命令。参数(例如,yadda
)在函数体中使用$1
(即第一个/参数)引用
跑步:
通过命令行运行以下命令
npm运行示例yadda
最终将作为:
ts节点——项目tsconfig.json./examples/yadda.ts
注意事项:
使用cmd.exe
作为默认shell的Windows将无法满足上述解决方案
>P>您可能还想考虑在CLI没有提供参数的情况下提供默认值。例如:
package.json
。。。
“脚本”:{
“示例”:“func(){ts节点--project tsconfig.json\”/examples/${1:-foobar}.ts\”;};func”
^^^^^^^^
},
...
注意${1:-foobar}
部分,而不仅仅是${1}
。这意味着在不提供参数的情况下运行脚本。例如:
npm运行示例
最终将作为:
ts节点——项目tsconfig.json./examples/foobar.ts
^^^^^^
但是,当提供参数时,例如:
npm运行示例yadda
它仍将像以前一样运行,即
ts节点——项目tsconfig.json./examples/yadda.ts
跨平台:
如果需要跨平台解决方案,即同时使用sh
和cmd.exe
运行的解决方案,那么实际上只剩下一个选项,正如您所说的:“编写一个可以由npm调用和运行的JS文件,该文件将读取CLI参数[…使用并使用or退出ts node
命令]看看这里@Emanuele,这是一个JS脚本中的内容。这就是为什么我在最后一句中写道我不想这样做好的对不起,你是对的看看我的答案这就是你的意思谢谢。一个有效的答案,但不是我想要的100%。我会投票,但不会接受它已解决。谢谢。谢谢,但作为回答我在问题中说,这是我明确不想做的(使用脚本文件)。相反,我只想使用package.json的scripts字段。使用脚本是一种常见的做法,没有客观的理由不使用它们。如果你真的想这样做,Emanuele的回答是唯一的方法。没有客观的理由是一种意见,这是值得怀疑的。在我的情况下,我不想用脚本来扰乱我的回购协议我不需要任何其他的构建脚本。你知道,干净的代码和其他东西。而且,如果有一个像我要求的那样的解决方案,那可能就是最好的解决方案。这就是我为什么要问的原因。不,不是,因为这是传递参数的唯一方法,正如npm RUN的一样。相反,我不是说你问的问题不好。Setting这样的环境变量(即MY\u VAR=foo
),当默认shell为cmd.exe时,将在Windows上失败。此外,Windowscmd.exe
在引用带有美元前缀的变量时失败,例如$MY\u VAR
,因为预期的语法是%MY\u VAR%
。如果参数是文件夹名而不是文件名(如我前面的问题所述)然后在${1}
部分之后恢复正斜杠。
{
"scripts": {
"example": "node --project tsconfig.json ./yourscript.js"
}
}