包的脚本部分。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)。这可能吗?
当前回答
在我看来,人们使用包装。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 */
等等……
在这一点上,使用符号链接是我能想出的最好的方法,但我真的不认为这是最好的实践。
我也希望你能对我的回答提出意见。
其他回答
我知道已经有了一个认可的答案,但我有点喜欢这种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]);
总之,问题已经回答了。我想分享一下,因为我经常使用这种方法。
上面的大多数答案都只是将参数传递到你的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
jakub。G的答案是正确的,但是使用grunt的例子似乎有点复杂。
所以我的简单回答是:
-向npm脚本发送命令行参数
发送命令行参数到npm脚本的语法:
npm run [command] [-- <args>]
假设我们的包中有一个npm start任务。Json启动webpack开发服务器:
"scripts": {
"start": "webpack-dev-server --port 5000"
},
我们用npm start从命令行运行它
现在,如果我们想把一个端口传递给npm脚本:
"scripts": {
"start": "webpack-dev-server --port process.env.port || 8080"
},
运行该命令并通过命令行传递端口,例如5000,如下所示:
npm start --port:5000
-使用包。json配置:
正如jakub提到的。G,你也可以在package.json的配置中设置参数
"config": {
"myPort": "5000"
}
"scripts": {
"start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080"
},
NPM start将使用配置中指定的端口,或者你也可以覆盖它
npm config set myPackage:myPort 3000
-在npm脚本中设置参数
读取npm脚本中设置的变量的例子。在本例中NODE_ENV
"scripts": {
"start:prod": "NODE_ENV=prod node server.js",
"start:dev": "NODE_ENV=dev node server.js"
},
通过prod或dev读取server.js中的NODE_ENV
var env = process.env.NODE_ENV || 'prod'
if(env === 'dev'){
var app = require("./serverDev.js");
} else {
var app = require("./serverProd.js");
}
如果你想把参数传递到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": {
"start": "PORT=3000 node server.js"
}
然后在你的server.js文件中:
var port = process.env.PORT || 3000;