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

新手上路,请多包涵

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

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

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

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

原文由 arnemart 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

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`

请注意下面的行为差异( test.jsconsole.log(process.argv) ):以 --- 开头的参数 传递给 npm 而不是 script ,并在那里默默地吞下。

 $ 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 全局公开 process.argv ,包含命令行参数值,但这是一个低级 API(空格分隔的字符串数组,由操作系统提供给节点可执行文件)。


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


原始答案(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( package.json 中的默认值被覆盖)。

原文由 jakub.g 发布,翻译遵循 CC BY-SA 4.0 许可协议

您要求能够运行 类似 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

原文由 cjerdonek 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题