npm 2 及更高版本
从 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`
注意:如果你的参数不是以 -
或 --
开头,那么就不需要显式的 --
分隔符;但为了清楚起见,最好还是这样做。
npm run grunt task:target // invokes `grunt task:target`
请注意下面的行为差异( has ):以 npm 开头或传递给 npm
而不是脚本的参数,并在那里默默地吞噬。test.js
console.log(process.argv)
-
--
$ 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 全局公开,包含命令行参数值,但这是一个低级 API(由操作系统提供给节点可执行文件的空格分隔字符串数组)。process.argv
编辑2013.10.03:目前无法直接实现。但是有一个相关的GitHub问题在npm
上打开,以实现你要求的行为。似乎共识是实现这一点,但这取决于之前解决的另一个问题。
原始答案(2013.01):作为某种解决方法(虽然不是很方便),您可以执行以下操作:
说出您的软件包名称 is,并且您也有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
这样,默认情况下将使用 8080。但是,您可以对其进行配置(该值将存储在其内部存储中):npm start
npm
npm config set myPackage:myPort 9090
然后,在调用 时,将使用 9090(默认值 from 将被覆盖)。npm start
package.json