包的脚本部分。Json当前看起来是这样的:
"scripts": {
"start": "node ./script.js server"
}
...这意味着我可以运行npm start来启动服务器。到目前为止一切顺利。
然而,我希望能够运行类似npm start 8080的东西,并将参数传递给script.js(例如npm start 8080 => node ./script.js服务器8080)。这可能吗?
包的脚本部分。Json当前看起来是这样的:
"scripts": {
"start": "node ./script.js server"
}
...这意味着我可以运行npm start来启动服务器。到目前为止一切顺利。
然而,我希望能够运行类似npm start 8080的东西,并将参数传递给script.js(例如npm start 8080 => node ./script.js服务器8080)。这可能吗?
当前回答
我过去一直在使用这个一行程序,在离开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%。
其他回答
当我需要部署到不同的环境时,我也遇到了同样的问题 这是包裹。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
我知道已经有了一个认可的答案,但我有点喜欢这种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]);
总之,问题已经回答了。我想分享一下,因为我经常使用这种方法。
我发现这个问题,当我试图解决我的问题运行sequelize seed:generate cli命令:
node_modules/.bin/sequelize seed:generate --name=user
让我言归正传。我想在我的包中有一个简短的脚本命令。Json文件,并同时提供——name参数
经过一些实验,我们找到了答案。这是我在package.json中的命令
"scripts: {
"seed:generate":"NODE_ENV=development node_modules/.bin/sequelize seed:generate"
}
... 下面是一个在终端中运行它为用户生成种子文件的例子
> yarn seed:generate --name=user
> npm run seed:generate -- --name=user
FYI
yarn -v
1.6.0
npm -v
5.6.0
这并没有真正回答你的问题,但你总是可以使用环境变量来代替:
"scripts": {
"start": "PORT=3000 node server.js"
}
然后在你的server.js文件中:
var port = process.env.PORT || 3000;
使用过程。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中测试