包的脚本部分。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)。这可能吗?
当前回答
我发现这是可能的,只是传递变量完全像你会给Node.js:
// index.js
console.log(process.env.TEST_ENV_VAR)
// package.json
...
"scripts": { "start": "node index.js" },
...
TEST_ENV_VAR=hello npm start
打印出“hello”
其他回答
使用——从脚本中分离参数,并添加所有必需的参数,稍后我们可以通过索引访问它们。
npm run start -- myemail@gmail.com 100
你可以在节点中使用
const params = process.argv.slice(2);
console.log(params);
输出
['myemail@gmail.com', '100']
这并没有真正回答你的问题,但你总是可以使用环境变量来代替:
"scripts": {
"start": "PORT=3000 node server.js"
}
然后在你的server.js文件中:
var port = process.env.PORT || 3000;
你也可以这样做:
在package.json:
"scripts": {
"cool": "./cool.js"
}
在cool.js:
console.log({ myVar: process.env.npm_config_myVar });
在CLI:
npm --myVar=something run-script cool
应该输出:
{ myVar: 'something' }
更新:在使用npm 3.10.3时,它看起来降低了process.env的大小写。npm_config_变量?我还使用了better-npm-run,所以我不确定这是否是普通的默认行为,但这个答案是有效的。而不是process.env。npm_config_myVar,尝试process.env.npm_config_myvar
你要求能够运行像npm start 8080这样的程序。这是可能的,而不需要修改script.js或配置文件如下。
例如,在你的“脚本”JSON值中,包括——
"start": "node ./script.js server $PORT"
然后在命令行中:
$ PORT=8080 npm start
我已经确认这是使用bash和npm 1.4.23工作。注意,这个解决方案不需要解决GitHub npm问题#3494。
上面的大多数答案都只是将参数传递到你的NodeJS脚本中,由npm调用。我的解决办法是通用的。
只需要用shell解释器(例如sh)调用包装npm脚本,并像往常一样传递参数。唯一的例外是第一个参数编号为0。
例如,你想添加npm脚本someprogram——env=<argument_1>,其中someprogram只打印env参数的值:
package.json
"scripts": {
"command": "sh -c 'someprogram --env=$0'"
}
当你运行它时:
% npm run -s command my-environment
my-environment