我的package.json
的scripts
部分当前如下所示:
"scripts": {
"start": "node ./script.js server"
}
... 这意味着我可以运行npm start
来启动服务器。到目前为止,一切都很好。
但是,我希望能够运行npm start 8080
类的东西,并将参数传递给script.js
(例如npm start 8080
=> node ./script.js server 8080
)。这可能吗?
编辑 2014.10.30: 从 npm 2.0.0 开始可以将 args 传递给npm run
语法如下:
npm run <command> [-- <args>]
注意必要的--
。需要将传递给npm
命令本身的参数和传递给脚本的参数分开。
所以如果你在package.json
"scripts": {
"grunt": "grunt",
"server": "node server.js"
}
那么以下命令将是等效的:
grunt task:target
=> npm run grunt -- task:target
node server.js --port=1337
=> npm run server -- --port=1337
要获取参数值, 请参阅此问题 。为了读取命名参数,最好使用yargs或minimist 之类的解析库。 nodejs 全局公开包含命令行参数值的process.argv
,但这是一个低级 API(由空格分隔的字符串数组,由操作系统提供给节点可执行文件)。
编辑 2013.10.03:目前无法直接进行。但是 npm
上存在一个相关的GitHub 问题,用于实现您要求的行为。似乎已经达成共识,但这取决于之前要解决的另一个问题。
原始答案:作为一种变通办法(尽管不是很方便),您可以执行以下操作:
假设您来自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( package.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