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

标签 javascript node.js npm

我的 package.jsonscripts 部分目前如下所示:

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

...这意味着我可以运行 npm start 来启动服务器。到目前为止一切顺利。

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

最佳答案

npm 2 和更新版本

可以pass args to npm run 自 npm 2 (2014) 以来。语法如下:

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而不是脚本,并且被默默地吞没在那里。

$ 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

获取参数值,see this question .要读取命名参数,最好使用解析库,如 yargs。或 minimist ; nodejs 暴露 process.argv全局,包含命令行参数值,但这是一个低级 API(空格分隔的字符串数组,由操作系统提供给 Node 可执行文件)。


编辑 2013.10.03: 目前无法直接进行。但是有一个相关的GitHub issue opened on 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 将被使用(package.json 的默认值被覆盖)。

关于javascript - 将命令行参数发送到 npm 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11580961/

相关文章:

javascript - 将不同内容的多个元素附加到另一个 div

javascript - 如何将 OpenCV 包含到 javascript 项目中?

node.js - 无法在Docker内部启动 Node 应用程序

javascript - 使用 Mocha 测试 Promises 时,如何在发生错误时打印完整的堆栈跟踪

javascript - 是否可以将函数作为计算键 ES6 中的键?

javascript - React Redux 未在 mapStateToProps 中获取状态

Javascript:涉及I/O的有向树的DFS遍历

node.js - config.json 与 config.js |什么是 global-config.js |在环回应用程序中查看服务器配置?

node.js - 转到 TypeScript 源文件,而不是 VS Code 中的类型定义文件

node.js - 如何解决npm安装期间的重命名错误