包的脚本部分。Json当前看起来是这样的:

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

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

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


当前回答

你要求能够运行像npm start 8080这样的程序。这是可能的,而不需要修改script.js或配置文件如下。

例如,在你的“脚本”JSON值中,包括——

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

然后在命令行中:

$ PORT=8080 npm start

我已经确认这是使用bash和npm 1.4.23工作。注意,这个解决方案不需要解决GitHub npm问题#3494。

其他回答

你要求能够运行像npm start 8080这样的程序。这是可能的,而不需要修改script.js或配置文件如下。

例如,在你的“脚本”JSON值中,包括——

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

然后在命令行中:

$ PORT=8080 npm start

我已经确认这是使用bash和npm 1.4.23工作。注意,这个解决方案不需要解决GitHub npm问题#3494。

从npm 2开始。X,你可以通过——分隔参数传递到运行脚本

终端

npm run-script start -- --foo=3

Package.json

"start": "node ./index.js"

Index.js

console.log('process.argv', process.argv);

NPM 2和更新版本

从npm 2(2014)开始,可以将参数传递给npm。语法如下:

npm运行<命令> [-- <args>]

注意——separator,用来分隔传递给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.js有console.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

要获取参数值,请参见下面的问题。对于读取命名参数,最好使用yargs或minimist这样的解析库;Nodejs公开进程。argv,包含命令行参数值,但这是一个低级API(由空格分隔的字符串数组,由操作系统提供给节点可执行文件)。

我满足于这样的东西,看看测试观察脚本:

"scripts": {
    "dev": "tsc-watch --onSuccess \"node ./dist/server.js\"",
    "test": "tsc && cross-env NODE_OPTIONS=--experimental-vm-modules NODE_NO_WARNINGS=1 jest",
    "test-watch": "cross-env NODE_OPTIONS=--experimental-vm-modules NODE_NO_WARNINGS=1 tsc-watch --onSuccess",
  },

你像这样调用test-watch脚本:

// Run all tests with odata in their name
npm run test-watch "jest odata"

适用于Windows系统下的PowerShell用户

接受的答案不为我的npm 6.14工作。无论是添加“不”还是包含“一次”都不起作用。但是,在实参前面放两次——或者放一次“——”就可以了。例子:

npm run <my_script> -- -- <my arguments like --this>

怀疑的理由

像在bash中一样,——指示PowerShell将以下所有参数视为字面字符串,而不是选项(例如,请看这个答案)。问题似乎是该命令比预期的多解释了一次,丢失了“——”。例如,通过做

npm run <my_script> -- --option value

NPM将运行

<my_script> value

然而,做

npm run <my_script> "--" --option value

结果

<my_script> "--option" "value"

这很好。