私のpackage.json
のscripts
部分は現在このようになっています:
"scripts": {
"start": "node ./script.js server"
}
...これはnpm start
を実行してサーバーを起動できることを意味します。ここまでは順調ですね。
ただし、npm start 8080
のようなものを実行して、引数をscript.js
に渡すことができるようにしたい(例:npm start 8080
=> node ./script.js server 8080
)。これは可能ですか?
編集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
からのデフォルトがオーバーライドされます)。
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 を解決する必要はありません。
あなたもそれをすることができます:
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
を試してください。
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");
}
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);
コードに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でテスト済み
最後に追加するのではなく、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回実行するだけです。
これは本当にあなたの質問に答えるものではありませんが、あなたはいつも代わりに環境変数を使うことができます:
"scripts": {
"start": "PORT=3000 node server.js"
}
それからserver.jsファイルで:
var port = process.env.PORT || 3000;
私が見たものから、人々がより簡単な方法でスクリプトを実行したいときに人々は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 */
等...
現時点では、シンボリックリンクを使用するのが最善の方法ですが、それがベストプラクティスであるとは本当に思いません。
私の答えに対するあなたの意見も願っています。
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
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つだけの場合にのみ期待どおりに機能します。
上記のいくつかの回答を読んだところ、それらのいくつかは$記号を使用してコマンドラインパラメータにアクセスできると書いていますが、これは機能しません
次の方法でテストを実行しました
"scripts": {
"test-one": "mocha --timeout 90000 --watch --require ts-node/register --watch-extensions ts $1"
}
次のコマンドを使用してテストを実行するには
npm run test-one ./e2e/<test_file_path>
設定を使用する必要はありません。ここで行っているのと同じ方法で引数を渡すことができると思います。