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

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

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

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


当前回答

我知道已经有了一个认可的答案,但我有点喜欢这种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]);

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

其他回答

试试跨环境的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

如果你想把参数传递到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只运行一次常规构建。

我过去一直在使用这个一行程序,在离开Node.js一段时间后,最近不得不尝试重新发现它。类似于@francoisrv提到的解决方案,它利用了npm_config_*变量。

创建以下最小包。json文件:

{
  "name": "argument",
  "version": "1.0.0",
  "scripts": {
    "argument": "echo \"The value of --foo is '${npm_config_foo}'\""
  }
}

执行如下命令:

npm run argument --foo=bar

观察以下输出:

foo的值是'bar'

所有这些都在npm官方文档中有很好的记录:

https://docs.npmjs.com/using-npm/config

注意:“环境变量”标题解释了脚本中的变量与文档中定义的变量的行为不同。当涉及到大小写敏感性时,这是正确的,以及参数是否定义为空格或等号。

注意:如果使用带有连字符的参数,这些参数将在相应的环境变量中替换为下划线。例如,npm运行示例——foo-bar=baz对应于${npm_config_foo_bar}。

注意:对于非wsl Windows用户,请参阅下面@Doctor Blue的评论…将${npm_config_foo}替换为%npm_config_foo%。

使用——从脚本中分离参数,并添加所有必需的参数,稍后我们可以通过索引访问它们。

npm run start -- myemail@gmail.com 100

你可以在节点中使用

const params = process.argv.slice(2);
console.log(params);

输出

['myemail@gmail.com', '100']

使用过程。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中测试