2012-07-20 191 views
317

package.jsonscripts部分目前看起来是这样的:发送命令行参数NPM脚本

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

...这意味着我可以运行npm start启动服务器。到现在为止还挺好。

然而,我想能够运行类似npm start 8080和具有参数(一个或多个)传递到script.js(例如npm start 8080 =>node ./script.js server 8080)。这可能吗?

回答

458

编辑2014.10.30:It's possible to pass args to npm run as of npm 2.0.0

的语法如下:

npm run <command> [-- <args>]

注意必要--。需要将传递给npm命令的参数与传递给脚本的参数分开。

所以,如果你有package.json

"scripts": { 
    "grunt": "grunt", 
    "server": "node server.js" 
} 

然后

grunt task:target

通过NPM运行相当于将

npm run grunt -- task:target

和等效的

node server.js --port=1337

npm run server -- --port=1337

要获取的参数值,see this question。为了读取命名参数,最好使用解析库,如yargsminimist; nodejs全局公开了process.argv,包含命令行参数值,但是这是一个低级API(由操作系统提供给节点可执行文件的空格分隔字符串数组)。


编辑2013年10月3日:它目前无法直接。但是有一个相关的GitHub issue opened on npm来实现你所要求的行为。似乎共识是要实现这一点,但这取决于之前解决的另一个问题。


原来的答复:作为某种解决办法的(虽然不是很方便),你可以做如下:

说从package.json你的包的名字是myPackage,你必须也

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

然后加在package.json

"config": { 
    "myPort": "8080" 
} 

而在你script.js

// defaulting to 8080 in case if script invoked not via "npm run-script" but directly 
var port = process.env.npm_package_config_myPort || 8080 

这样,在默认情况下npm start将使用8080但是,您可以配置它(该值将npm在其内部存储器存储):

npm config set myPackage:myPort 9090 

然后,当调用npm start时,将使用9090(默认从package.json被覆盖)。

+0

这也与像'yargs'包工作完美地结合在一起; '--'后的所有参数都可以在脚本中完美分析。 – Thomas 2016-05-10 08:58:03

+1

AFAIKS,这只能将参数添加到脚本的末尾。如果在中间需要参数,该怎么办? – Spock 2016-08-23 16:28:59

+0

@Spock你有什么意思吗? – 2016-08-24 07:29:53

2

从我看到的情况来看,人们使用package.json脚本时,他们想以更简单的方式运行脚本。例如,使用nodemon是安装在本地node_modules,我们不能直接从CLI调用nodemon,但我们可以通过使用./node_modules/nodemon/nodemon.js调用它。因此,为了简化这个长期打字,我们可以把这个...

 

    ... 

    scripts: { 
     'start': 'nodemon app.js' 
    } 

    ... 

...然后调用npm start使用“nodemon”具有app.js作为第一个参数。

我想说的是,如果你只是想用node命令启动服务器,我认为你不需要使用scripts。打字npm startnode app.js也有同样的努力。

但是,如果您确实想使用nodemon,并且想要传递动态参数,请不要使用script。尝试使用符号链接。

例如使用迁移与sequelize。我创建符号链接...

ln -s node_modules/sequelize/bin/sequelize sequelize

,我还可以通过时,我把它叫做任何arguement ...

./sequlize -h /* show help */ 

./sequelize -m /* upgrade migration */ 

./sequelize -m -u /* downgrade migration */ 

等等

此时,使用符号链接是我能弄清楚的最好方法,但我并不认为这是最佳做法。

我也希望为您的意见对我的回答。

48

你也可以这样做:

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

+2

谢谢这对我工作!我特别错过了你在命令行中指定的变量名的前缀“npm_config_”。 – jp093121 2015-10-13 18:07:29

+1

这是错误的。 'process.env.npm_config_myVar'返回true,而不是值。 – 2016-11-10 10:25:32

+0

非常感谢你 – jck 2016-12-19 12:47:49

3

这并没有真正回答你的问题,但你总是可以使用环境变量来代替:

"scripts": { 
    "start": "PORT=3000 node server.js" 
} 

然后在您的server.js文件:

var port = process.env.PORT || 3000; 
+1

只要你在Unix平台上,这很好。不幸的是,它不适用于Windows,因为它有自己的约定。 – 2015-08-09 19:58:57

112

你要求能够运行,如npm start 8080。这是可能的,无需如下修改script.js或配置文件。

例如,在你的"scripts" JSON值,包括 -

"start": "node ./script.js server $PORT" 

然后在命令行:

$ PORT=8080 npm start 

我已经证实,这个工程使用bash和NPM 1.4。 23。请注意,此解决方法不需要解决GitHub npm issue #3494

+0

它允许完全按照我的需要传递命令参数。 – Sushant 2015-09-28 10:41:11

+4

这工作得很好。你也可以做一些像node./script.js server $ {PORT:-8080}这样的东西来使其成为可选的。 – graup 2016-06-01 12:27:31

+4

我似乎无法使用git bash在windows中执行此操作。任何人都可以工作吗? (同样的命令在Ubuntu上工作) – 2016-10-06 10:46:21

16

npm 2.x support CLI ARGS

命令

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

的package.json

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

Index.js

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

9

如果你想传递参数给一个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腕表标记为babel,但npm run start仅运行一次常规构建。

+0

这是如何从CLI中调用的? – bwobst 2015-12-28 07:22:01

+0

@dresdin'npm run dev','npm start' – 2016-02-05 06:06:30

+5

那些不是命令行参数.... – mpen 2016-02-24 16:49:07

32

jakub.g的答案是正确的,但是使用grunt的例子看起来有点复杂。

所以我的答案更简单:

- 发送一个命令行参数的NPM脚本

语法发送命令行参数的NPM脚本:

npm run [command] [-- <args>] 

试想一下,我们有在我们的package.json启动webpack dev服务器的npm启动任务:

"scripts": { 
    "start": "webpack-dev-server --port 5000" 
}, 

我们从npm start

在命令行中运行这个现在,如果我们想在一个端口传递给故宫脚本:

"scripts": { 
    "start": "webpack-dev-server --port process.env.port || 8080" 
}, 

运行这一点,例如通过该端口5000通过命令行是如下:

npm start --port:5000 

- 使用的package.json配置:

正如jakub.g提到的,你可以在你的包的配置或者设置PARAMS以.json

"config": { 
    "myPort": "5000" 
} 

"scripts": { 
    "start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080" 
}, 

npm start会使用在你的配置中指定的端口,或者你可以overri德它

npm config set myPackage:myPort 3000 

- 在您的NPM脚本设置设置了一个param

在你的NPM脚本读取一个变量的表率。在这个例子中NODE_ENV

"scripts": { 
    "start:prod": "NODE_ENV=prod node server.js", 
    "start:dev": "NODE_ENV=dev node server.js" 
}, 

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"); 
} 
+4

请注意,在package.json中''start:prod“:”NODE_ENV = prod node server.js“语法不适用于Windows,除非您使用[cross-env](https:// www。 npmjs.com/package/cross-env) – 2016-11-18 16:18:14

+0

这是一个完美的答案!谢谢@ steven-iseki – softvar 2017-05-31 13:23:05

+0

更正了吗?: ''start“:”webpack-dev-server --port process.env.npm_package_config_myPort || 8080“ },'should be''start”:“webpack-dev-server --port $ npm_package_config_myPort || 8080“ }”,根据我的使用[本教程]解释(http://www.marcusoft.net/2015/08/npm-scripting-configs-and-arguments.html# NPM-配置)。过程引用可以在javascript中显然使用。 – 2017-10-07 13:25:08

3

使用process.argv在你的代码只是提供一个尾随$*到脚本值项。

echoargs.js:

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

包。JSON:

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

例子:

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

process.argv[0]是可执行文件(节点),process.argv[1]是你的脚本。

测试与NPM V5.3.0和节点V8.4.0

+1

在使用括号而不是括号方面,“切片”不是一个函数吗? – 2018-01-09 15:33:41