2012-07-20 221 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