scripts
我package.json
目前的部分看起来像这样:
"scripts": {
"start": "node ./script.js server"
}
...这意味着我可以运行npm start
以启动服务器。到现在为止还挺好。
但是,我希望能够运行类似的东西npm start 8080
并将参数传递给script.js
(例如npm start 8080
=> node ./script.js server 8080
)。这可能吗?
scripts
我package.json
目前的部分看起来像这样:
"scripts": {
"start": "node ./script.js server"
}
...这意味着我可以运行npm start
以启动服务器。到现在为止还挺好。
但是,我希望能够运行类似的东西npm start 8080
并将参数传递给script.js
(例如npm start 8080
=> node ./script.js server 8080
)。这可能吗?
自 npm 2 (2014) 以来,可以将 args 传递给npm run
。语法如下:
npm run <command> [-- <args>]
请注意--
分隔符,用于分隔传递给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`
注意:如果您的参数不以-
or开头--
,则--
不需要显式分隔符;但为了清楚起见,最好还是这样做。
npm run grunt task:target // invokes `grunt task:target`
请注意下面的行为差异(test.js
has 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这样的解析库;nodejsprocess.argv
全局公开,包含命令行参数值,但这是一个低级 API(以空格分隔的字符串数组,由操作系统提供给节点可执行文件)。
编辑 2013.10.03:目前无法直接使用。但是有一个相关的GitHub 问题已打开npm
以实现您要求的行为。似乎共识是实现这一点,但这取决于之前解决的另一个问题。
原始答案(2013.01):作为某种解决方法(虽然不是很方便),您可以执行以下操作:
说你的包名来自package.json
是myPackage
,你也有
"scripts": {
"start": "node ./script.js server"
}
然后加入package.json
:
"config": {
"myPort": "8080"
}
而在你的script.js
:
// defaulting to 8080 in case if script invoked not via "npm run-script" but directly
var port = process.env.npm_package_config_myPort || 8080
这样,默认情况下npm start
将使用 8080。但是您可以配置它(该值将存储npm
在其内部存储中):
npm config set myPackage:myPort 9090
然后,在调用时npm start
,将使用 9090(默认值 frompackage.json
被覆盖)。
您要求能够运行类似 npm start 8080
. 这是可能的,而无需修改script.js
或配置文件,如下所示。
例如,在您的"scripts"
JSON 值中,包括--
"start": "node ./script.js server $PORT"
然后从命令行:
$ PORT=8080 npm start
我已经确认这使用 bash 和 npm 1.4.23 有效。请注意,此变通方法不需要解决 GitHub npm问题 #3494。
你也可以这样做:
在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
jakub.g的答案是正确的,但是使用 grunt 的示例似乎有点复杂。
所以我更简单的答案:
- 向 npm 脚本发送命令行参数
将命令行参数发送到 npm 脚本的语法:
npm run [command] [-- <args>]
想象一下,我们在 package.json 中有一个 npm start 任务来启动 webpack 开发服务器:
"scripts": {
"start": "webpack-dev-server --port 5000"
},
我们从命令行运行它 npm start
现在,如果我们想将端口传递给 npm 脚本:
"scripts": {
"start": "webpack-dev-server --port process.env.port || 8080"
},
运行它并通过命令行传递端口(例如 5000)将如下所示:
npm start --port:5000
- 使用 package.json 配置:
正如jakub.g所提到的,您也可以在package.json的配置中设置参数
"config": {
"myPort": "5000"
}
"scripts": {
"start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080"
},
npm start
将使用您的配置中指定的端口,或者您可以覆盖它
npm config set myPackage:myPort 3000
- 在你的 npm 脚本中设置一个参数
读取 npm 脚本中设置的变量的示例。在这个例子中NODE_ENV
"scripts": {
"start:prod": "NODE_ENV=prod node server.js",
"start:dev": "NODE_ENV=dev node server.js"
},
在阅读NODE_ENV server.js无论是督促或开发
var env = process.env.NODE_ENV || 'prod'
if(env === 'dev'){
var app = require("./serverDev.js");
} else {
var app = require("./serverProd.js");
}
从npm 2.x 开始,您可以通过将 args与--
终端
npm run-script start -- --foo=3
包.json
"start": "node ./index.js"
索引.js
console.log('process.argv', process.argv);