包的脚本部分。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)。这可能吗?
当前回答
试试跨环境的NPM包。
使用方便。安装方便。跨所有平台。
例子:
为命令设置参数
// package.json
"scripts": {
“test”: “node test.js”,
“test-with-env-arg”: “cross-env YourEnvVarName=strValue yarn test,
}
从process.env中获取参数
// test.js
const getCommandLineArg = Boolean(process.env.YourEnvVarName === 'true') // Attention: value of process.env.* is String type, not number || boolean
其他回答
在我看来,人们使用包装。Json脚本,当他们想以更简单的方式运行脚本。例如,要使用安装在本地node_modules中的nodemon,我们不能直接从cli调用nodemon,但可以通过./node_modules/nodemon/nodemon.js调用它。所以,为了简化这种冗长的输入,我们可以把这个…
... scripts: { 'start': 'nodemon app.js' } ...
... 然后调用NPM start使用“nodemon”,它的第一个参数是app.js。
我想说的是,如果你只是想用node命令启动你的服务器,我认为你不需要使用脚本。输入npm start或node app.js也有同样的效果。
但如果你确实想使用nodemon,并且想传递一个动态参数,也不要使用script。尝试使用符号链接代替。
例如使用sequelize迁移。我创建了一个符号链接…
Ln -s node_modules/sequelize/bin/sequelize
... 当我调用它时,我可以传递任何参数…
./sequlize -h /* show help */
./sequelize -m /* upgrade migration */
./sequelize -m -u /* downgrade migration */
等等……
在这一点上,使用符号链接是我能想出的最好的方法,但我真的不认为这是最好的实践。
我也希望你能对我的回答提出意见。
你要求能够运行像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
NPM 2和更新版本
从npm 2(2014)开始,可以将参数传递给npm。语法如下:
npm运行<命令> [-- <args>]
注意——separator,用来分隔传递给npm命令本身的参数和传递给脚本的参数。
在package.json的示例中:
"scripts": {
"grunt": "grunt",
"server": "node server.js"
}
下面是如何将参数传递给这些脚本:
npm run grunt -- task:target // invokes `grunt task:target`
npm run server -- --port=1337 // invokes `node server.js --port=1337`
注意:如果你的参数不是以-或——开头,那么显式的——分隔符是不需要的;但为了清晰起见,还是这样做比较好。
npm run grunt task:target // invokes `grunt task:target`
请注意下面的行为差异(test.js有console.log(process.argv)):以-或——开头的参数被传递给npm而不是脚本,并在那里被无声地吞下。
$ npm run test foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', 'foobar']
$ npm run test -foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js']
$ npm run test --foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js']
$ npm run test -- foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', 'foobar']
$ npm run test -- -foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', '-foobar']
$ npm run test -- --foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', '--foobar']
当你使用npm实际使用的参数时,区别就更明显了:
$ npm test --help // this is disguised `npm --help test`
npm test [-- <args>]
aliases: tst, t
要获取参数值,请参见下面的问题。对于读取命名参数,最好使用yargs或minimist这样的解析库;Nodejs公开进程。argv,包含命令行参数值,但这是一个低级API(由空格分隔的字符串数组,由操作系统提供给节点可执行文件)。
从npm 2开始。X,你可以通过——分隔参数传递到运行脚本
终端
npm run-script start -- --foo=3
Package.json
"start": "node ./index.js"
Index.js
console.log('process.argv', process.argv);