web-dev-qa-db-ja.com

Npmスクリプトへのコマンドライン引き数の送信

私のpackage.jsonscripts部分は現在このようになっています:

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

...これはnpm startを実行してサーバーを起動できることを意味します。ここまでは順調ですね。

ただし、npm start 8080のようなものを実行して、引数をscript.jsに渡すことができるようにしたい(例:npm start 8080 => node ./script.js server 8080)。これは可能ですか?

570
arnemart

編集2014.10.30: npm 2.0.0以降、npm runに引数を渡すことが可能です

構文は次のとおりです。

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

必要な--に注意してください。 npmコマンド自体に渡されたパラメータとあなたのスクリプトに渡されたパラメータを分けることが必要です。

package.jsonに入っているのであれば

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

その場合、以下のコマンドは同等になります。

grunt task:target => npm run grunt -- task:target

node server.js --port=1337 => npm run server -- --port=1337

パラメータ値を取得するには、 この質問を参照してください 。名前付きパラメータを読むには、おそらく yargs または minimist のような解析ライブラリを使用するのが最善です。 nodejsはコマンドラインパラメータ値を含むprocess.argvをグローバルに公開しますが、これは低レベルAPIです(オペレーティングシステムによってノード実行可能ファイルに提供される、空白で区切られた文字列の配列)。


編集2013.10.03: 現在は直接できません。しかし、あなたが求めている振る舞いを実装するために関連する GitHubの問題が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からのデフォルトがオーバーライドされます)。

800
jakub.g

like 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 を解決する必要はありません。

173
cjerdonek

あなたもそれをすることができます:

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も使っているので、これがVanillaのデフォルトの振る舞いであるかどうかはわかりませんが、この答えは is workingです。 process.env.npm_config_myVarの代わりにprocess.env.npm_config_myvarを試してください。

69
francoisrv

jakub.g の答えは正しいですが、gruntを使った例は少し複雑に思えます。

だから私の簡単な答え:

- npmスクリプトにコマンドライン引数を送信する

Npmスクリプトにコマンドライン引数を送信するための構文:

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

Webpack devサーバーを起動するために、package.jsonにnpm開始タスクがあるとします。

"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

- package.json configを使用します。

jakub.g で述べたように、代わりに package.json の設定でparamsを設定できます。

"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"
},

server.js どちらかの prod または dev にあるNODE_ENVを読んでください。

var env = process.env.NODE_ENV || 'prod'

if(env === 'dev'){
    var app = require("./serverDev.js");
} else {
    var app = require("./serverProd.js");
}
60
svnm

npm 2.xサポート cli args

コマンド

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

Package.json

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

Index.js

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

28

コードにprocess.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

process.argv[0]は実行可能ファイル(ノード)、process.argv[1]はあなたのスクリプトです。

npm v5.3.0およびノー​​ドv8.4.0でテスト済み

26
Peter

最後に追加するのではなく、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は通常のビルドを1回実行するだけです。

15
Dan Ross

これは本当にあなたの質問に答えるものではありませんが、あなたはいつも代わりに環境変数を使うことができます:

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

それからserver.jsファイルで:

var port = process.env.PORT || 3000;
6
DrunkenBeetle

私が見たものから、人々がより簡単な方法でスクリプトを実行したいときに人々はpackage.jsonスクリプトを使用します。たとえば、ローカルのnode_modulesにインストールされているnodemonを使用するために、cliから直接nodemonを呼び出すことはできませんが、./node_modules/nodemon/nodemon.jsを使用して呼び出すことができます。それで、この長い型付けを簡単にするために、我々はこれを置くことができます...

 
 ... 
 
スクリプト:{
 '開始': 'nodemon app.js' 
} 
 
 ... 
 

...次にnpm startを呼び出して、最初の引数としてapp.jsを持つ 'nodemon'を使用します。

私が言おうとしていることですが、nodeコマンドでサーバーを起動するだけの場合は、scriptsを使用する必要はないと思います。 npm startまたはnode app.jsを入力しても同じことが言えます。

しかし、nodemonを使いたい場合や、動的引数を渡したい場合は、scriptも使用しないでください。代わりにsymlinkを使ってみてください。

例えばsequelizeを使ったマイグレーションの使用。シンボリックリンクを作成しています...

ln -s node_modules/sequelize/bin/sequelize sequelize

...そして、私がそれを呼ぶとき、私はどんな議論でも渡すことができます...

./sequlize -h /* show help */

./sequelize -m /* upgrade migration */

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

等...

現時点では、シンボリックリンクを使用するのが最善の方法ですが、それがベストプラクティスであるとは本当に思いません。

私の答えに対するあなたの意見も願っています。

4
Kiddo

Sequelize seed:generate cliコマンドを実行して問題を解決しようとしているときに、この質問が見つかりました。

node_modules/.bin/sequelize seed:generate --name=user

要点を説明しましょう。 package.json ファイルに短いスクリプトコマンドを入れ、同時に--name引数を指定したいと思いました。

答えはいくつかの実験の後に来ました。これが package.json にある私のコマンドです。

"scripts: {
  "seed:generate":"NODE_ENV=development node_modules/.bin/sequelize seed:generate"
}

...そしてこれが user のためのシードファイルを生成するためにターミナルでそれを実行する例です

> yarn seed:generate --name=user

> npm run seed:generate -- --name=user

ちなみに

yarn -v
1.6.0

npm -v
5.6.0
2
Serge Seletskyy

npm run script_target-<引数>基本的にこれはコマンドライン引数を渡す方法ですが、スクリプトが1つしかない場合にのみ機能しますコマンドを実行しているようにコマンドを実行します。つまり、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そして、このようなものが期待されますcopy c:/ file c:/ work space/file && ng build

注:そのため、コマンドラインパラメーターは、スクリプト内のコマンドが1つだけの場合にのみ期待どおりに機能します。

上記のいくつかの回答を読んだところ、それらのいくつかは$記号を使用してコマンドラインパラメータにアクセスできると書いていますが、これは機能しません

1
Sunny Goel

次の方法でテストを実行しました

  "scripts": {  
       "test-one": "mocha --timeout 90000 --watch --require ts-node/register --watch-extensions ts $1"
}

次のコマンドを使用してテストを実行するには

npm run test-one ./e2e/<test_file_path>

設定を使用する必要はありません。ここで行っているのと同じ方法で引数を渡すことができると思います。

0
Kamrul