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

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

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

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


当前回答

上面的大多数答案都只是将参数传递到你的NodeJS脚本中,由npm调用。我的解决办法是通用的。

只需要用shell解释器(例如sh)调用包装npm脚本,并像往常一样传递参数。唯一的例外是第一个参数编号为0。

例如,你想添加npm脚本someprogram——env=<argument_1>,其中someprogram只打印env参数的值:

package.json

"scripts": {
  "command": "sh -c 'someprogram --env=$0'"
}

当你运行它时:

% npm run -s command my-environment
my-environment

其他回答

在我看来,人们使用包装。Json脚本,当他们想以更简单的方式运行脚本。例如,要使用安装在本地node_modules中的nodemon,我们不能直接从cli调用nodemon,但可以通过./node_modules/nodemon/nodemon.js调用它。所以,为了简化这种冗长的输入,我们可以把这个…


    ...

    scripts: {
      'start': 'nodemon app.js'
    }

    ...

... 然后调用NPM start使用“nodemon”,它的第一个参数是app.js。

我想说的是,如果你只是想用node命令启动你的服务器,我认为你不需要使用脚本。输入npm start或node app.js也有同样的效果。

但如果你确实想使用nodemon,并且想传递一个动态参数,也不要使用script。尝试使用符号链接代替。

例如使用sequelize迁移。我创建了一个符号链接…

Ln -s node_modules/sequelize/bin/sequelize

... 当我调用它时,我可以传递任何参数…

./sequlize -h /* show help */

./sequelize -m /* upgrade migration */

./sequelize -m -u /* downgrade migration */

等等……

在这一点上,使用符号链接是我能想出的最好的方法,但我真的不认为这是最好的实践。

我也希望你能对我的回答提出意见。

如果你想把参数传递到npm脚本的中间,而不是仅仅把它们附加到结尾,那么内联环境变量似乎工作得很好:

"scripts": {
  "dev": "BABEL_ARGS=-w npm run build && cd lib/server && nodemon index.js",
  "start": "npm run build && node lib/server/index.js",
  "build": "mkdir -p lib && babel $BABEL_ARGS -s inline --stage 0 src -d lib",
},

在这里,npm run dev将-w watch标志传递给babel,但是npm run start只运行一次常规构建。

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

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

你也可以这样做:

在package.json:

"scripts": {
    "cool": "./cool.js"
}

在cool.js:

 console.log({ myVar: process.env.npm_config_myVar });

在CLI:

npm --myVar=something run-script cool

应该输出:

{ myVar: 'something' }

更新:在使用npm 3.10.3时,它看起来降低了process.env的大小写。npm_config_变量?我还使用了better-npm-run,所以我不确定这是否是普通的默认行为,但这个答案是有效的。而不是process.env。npm_config_myVar,尝试process.env.npm_config_myvar

试试跨环境的NPM包。

使用方便。安装方便。跨所有平台。

例子:

为命令设置参数

// package.json
"scripts": {
  “test”: “node test.js”,
  “test-with-env-arg”: “cross-env YourEnvVarName=strValue yarn test,
}

从process.env中获取参数

// test.js
const getCommandLineArg = Boolean(process.env.YourEnvVarName === 'true')  // Attention: value of process.env.* is String type, not number || boolean