包的脚本部分。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方法。
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]);
总之,问题已经回答了。我想分享一下,因为我经常使用这种方法。
其他回答
我满足于这样的东西,看看测试观察脚本:
"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"
使用过程。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中测试
基本上这是传递命令行参数的方式,但它只在脚本只有一个命令运行的情况下才会工作,就像我正在运行一个命令,即npm run start——4200
"script":{
"start" : "ng serve --port="
}
这将在传递命令行参数时运行,但如果我们一起运行多个命令,比如npm run build c:/workspace/file
"script":{
"build" : "copy c:/file <arg> && ng build"
}
但是当运行copy c:/file && ng build c:/work space/file时,它会这样解释 我们期待的是这样的事情 复制c:/file c:/work space/file && ng build
注意:-所以命令行参数只能在脚本中只有一个命令的情况下工作。
我读了上面的一些答案,其中一些人写着你可以使用$ symbol访问命令行参数,但这将不起作用
在我看来,人们使用包装。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 start 8080这样的程序。这是可能的,而不需要修改script.js或配置文件如下。
例如,在你的“脚本”JSON值中,包括——
"start": "node ./script.js server $PORT"
然后在命令行中:
$ PORT=8080 npm start
我已经确认这是使用bash和npm 1.4.23工作。注意,这个解决方案不需要解决GitHub npm问题#3494。