将命令行参数发送到 npm 脚本

2022-08-29 22:05:27

我目前的部分如下所示:scriptspackage.json

"scripts": {
    "start": "node ./script.js server"
}

...这意味着我可以运行以启动服务器。目前为止,一切都好。npm start

但是,我希望能够运行类似的东西,并将参数传递给(例如 => ).这可能吗?npm start 8080script.jsnpm start 8080node ./script.js server 8080


答案 1

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.jsconsole.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

若要获取参数值,请参阅此问题。要读取命名参数,最好使用像yargsminimist这样的解析库;nodejs 全局公开,包含命令行参数值,但这是一个低级 API(由操作系统提供给节点可执行文件的空格分隔字符串数组)。process.argv


编辑2013.10.03:目前无法直接实现。但是有一个相关的GitHub问题在npm上打开,以实现你要求的行为。似乎共识是实现这一点,但这取决于之前解决的另一个问题。


原始答案(2013.01):作为某种解决方法(虽然不是很方便),您可以执行以下操作:

说出您的软件包名称 is,并且您也有package.jsonmyPackage

"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 startnpm

npm config set myPackage:myPort 9090

然后,在调用 时,将使用 9090(默认值 from 将被覆盖)。npm startpackage.json


答案 2

您要求能够运行类似 .这是可能的,而无需修改或配置文件,如下所示。npm start 8080script.js

例如,在 JSON 值中,包括 --"scripts"

"start": "node ./script.js server $PORT"

然后从命令行:

$ PORT=8080 npm start

我已经确认这可以使用bash和npm 1.4.23。请注意,此解决方法不需要解决 GitHub npm 问题 #3494