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

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

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

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


当前回答

当我需要部署到不同的环境时,我也遇到了同样的问题 这是包裹。Json预发布更新。

 scripts:
{"deploy-sit": "sls deploy --config resources-sit.yml",
 "deploy-uat": "sls deploy --config resources-uat.yml",
 "deploy-dev": "sls deploy --config resources-dev.yml"}

但这里是采用环境变量而不是重复自己的正确方法

scripts:{"deploy-env": "sls deploy --config resources-$ENV_VAR.yml"}

最后,您可以通过运行进行部署 ENV_VAR=dev npm运行deploy-env

其他回答

使用过程。Argv在你的代码中,然后只提供一个尾随$*到你的脚本值项。

作为一个例子,尝试用一个简单的脚本,只记录提供的参数到标准的echoargs.js:

console.log('arguments: ' + process.argv.slice(2));

package.json:

"scripts": {
    "start": "node echoargs.js $*"
}

例子:

> npm start 1 2 3
arguments: 1,2,3

的过程。[0]是可执行(节点)进程。Argv[1]是你的脚本。

在npm v5.3.0和node v8.4.0中测试

你也可以这样做:

在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脚本的中间,而不是仅仅把它们附加到结尾,那么内联环境变量似乎工作得很好:

"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只运行一次常规构建。

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

终端

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

Package.json

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

Index.js

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

我知道已经有了一个认可的答案,但我有点喜欢这种JSON方法。

npm start '{"PROJECT_NAME_STR":"my amazing stuff", "CRAZY_ARR":[0,7,"hungry"], "MAGICAL_NUMBER_INT": 42, "THING_BOO":true}';

通常我需要1个变量,比如项目名称,所以我发现这个快速n'简单。

我的package.json中也经常有这样的东西

"scripts": {
    "start": "NODE_ENV=development node local.js"
}

贪婪的我想要“所有的”,NODE_ENV和CMD行参数的东西。

你只需要像这样访问你的文件(在我的例子中是local。js)

console.log(process.env.NODE_ENV, starter_obj.CRAZY_ARR, starter_obj.PROJECT_NAME_STR, starter_obj.MAGICAL_NUMBER_INT, starter_obj.THING_BOO);

你只需要在它上面有这一点(我运行v10.16.0 btw)

var starter_obj = JSON.parse(JSON.parse(process.env.npm_config_argv).remain[0]);

总之,问题已经回答了。我想分享一下,因为我经常使用这种方法。