包的脚本部分。Json当前看起来是这样的:
"scripts": {
"start": "node ./script.js server"
}
...这意味着我可以运行npm start来启动服务器。到目前为止一切顺利。
然而,我希望能够运行类似npm start 8080的东西,并将参数传递给script.js(例如npm start 8080 => node ./script.js服务器8080)。这可能吗?
包的脚本部分。Json当前看起来是这样的:
"scripts": {
"start": "node ./script.js server"
}
...这意味着我可以运行npm start来启动服务器。到目前为止一切顺利。
然而,我希望能够运行类似npm start 8080的东西,并将参数传递给script.js(例如npm start 8080 => node ./script.js服务器8080)。这可能吗?
当前回答
我知道已经有了一个认可的答案,但我有点喜欢这种JSON方法。
npm start '{"PROJECT_NAME_STR":"my amazing stuff", "CRAZY_ARR":[0,7,"hungry"], "MAGICAL_NUMBER_INT": 42, "THING_BOO":true}';
通常我需要1个变量,比如项目名称,所以我发现这个快速n'简单。
我的package.json中也经常有这样的东西
"scripts": {
"start": "NODE_ENV=development node local.js"
}
贪婪的我想要“所有的”,NODE_ENV和CMD行参数的东西。
你只需要像这样访问你的文件(在我的例子中是local。js)
console.log(process.env.NODE_ENV, starter_obj.CRAZY_ARR, starter_obj.PROJECT_NAME_STR, starter_obj.MAGICAL_NUMBER_INT, starter_obj.THING_BOO);
你只需要在它上面有这一点(我运行v10.16.0 btw)
var starter_obj = JSON.parse(JSON.parse(process.env.npm_config_argv).remain[0]);
总之,问题已经回答了。我想分享一下,因为我经常使用这种方法。
其他回答
我满足于这样的东西,看看测试观察脚本:
"scripts": {
"dev": "tsc-watch --onSuccess \"node ./dist/server.js\"",
"test": "tsc && cross-env NODE_OPTIONS=--experimental-vm-modules NODE_NO_WARNINGS=1 jest",
"test-watch": "cross-env NODE_OPTIONS=--experimental-vm-modules NODE_NO_WARNINGS=1 tsc-watch --onSuccess",
},
你像这样调用test-watch脚本:
// Run all tests with odata in their name
npm run test-watch "jest odata"
我知道已经有了一个认可的答案,但我有点喜欢这种JSON方法。
npm start '{"PROJECT_NAME_STR":"my amazing stuff", "CRAZY_ARR":[0,7,"hungry"], "MAGICAL_NUMBER_INT": 42, "THING_BOO":true}';
通常我需要1个变量,比如项目名称,所以我发现这个快速n'简单。
我的package.json中也经常有这样的东西
"scripts": {
"start": "NODE_ENV=development node local.js"
}
贪婪的我想要“所有的”,NODE_ENV和CMD行参数的东西。
你只需要像这样访问你的文件(在我的例子中是local。js)
console.log(process.env.NODE_ENV, starter_obj.CRAZY_ARR, starter_obj.PROJECT_NAME_STR, starter_obj.MAGICAL_NUMBER_INT, starter_obj.THING_BOO);
你只需要在它上面有这一点(我运行v10.16.0 btw)
var starter_obj = JSON.parse(JSON.parse(process.env.npm_config_argv).remain[0]);
总之,问题已经回答了。我想分享一下,因为我经常使用这种方法。
我发现这个问题,当我试图解决我的问题运行sequelize seed:generate cli命令:
node_modules/.bin/sequelize seed:generate --name=user
让我言归正传。我想在我的包中有一个简短的脚本命令。Json文件,并同时提供——name参数
经过一些实验,我们找到了答案。这是我在package.json中的命令
"scripts: {
"seed:generate":"NODE_ENV=development node_modules/.bin/sequelize seed:generate"
}
... 下面是一个在终端中运行它为用户生成种子文件的例子
> yarn seed:generate --name=user
> npm run seed:generate -- --name=user
FYI
yarn -v
1.6.0
npm -v
5.6.0
你要求能够运行像npm start 8080这样的程序。这是可能的,而不需要修改script.js或配置文件如下。
例如,在你的“脚本”JSON值中,包括——
"start": "node ./script.js server $PORT"
然后在命令行中:
$ PORT=8080 npm start
我已经确认这是使用bash和npm 1.4.23工作。注意,这个解决方案不需要解决GitHub npm问题#3494。
适用于Windows系统下的PowerShell用户
接受的答案不为我的npm 6.14工作。无论是添加“不”还是包含“一次”都不起作用。但是,在实参前面放两次——或者放一次“——”就可以了。例子:
npm run <my_script> -- -- <my arguments like --this>
怀疑的理由
像在bash中一样,——指示PowerShell将以下所有参数视为字面字符串,而不是选项(例如,请看这个答案)。问题似乎是该命令比预期的多解释了一次,丢失了“——”。例如,通过做
npm run <my_script> -- --option value
NPM将运行
<my_script> value
然而,做
npm run <my_script> "--" --option value
结果
<my_script> "--option" "value"
这很好。