[解決済み] npmスクリプトへのコマンドライン引数の送信
質問
その
scripts
の部分は、私の
package.json
は現在このようになっています。
"scripts": {
"start": "node ./script.js server"
}
...ということは
npm start
を実行してサーバーを起動します。ここまでは順調です。
しかし、次のようなものを実行できるようにしたい。
npm start 8080
に渡される引数は
script.js
(例)
npm start 8080
=>
node ./script.js server 8080
). これは可能なのでしょうか?
どのように解決するのですか?
npm 2 以降
可能です。
に引数を渡します。
npm run
をnpm 2(2014年)以降に導入しました。構文は以下の通りです。
npm run <command> [-- <args>]
注意
--
に渡されるパラメータを区切るために使用されます。
npm
コマンド自体と、スクリプトに渡されるパラメータを指定します。
この例では
package.json
:
"scripts": {
"grunt": "grunt",
"server": "node server.js"
}
これらのスクリプトにパラメータを渡す方法は次のとおりです。
npm run grunt -- task:target // invokes `grunt task:target`
npm run server -- --port=1337 // invokes `node server.js --port=1337`
備考
:
で始まらない場合
-
または
--
であるならば、明示的な
--
のような区切り文字は不要ですが、わかりやすくするために区切り文字はあった方がよいでしょう。
npm run grunt task:target // invokes `grunt task:target`
以下の動作の違いに注意してください (
test.js
があります。
console.log(process.argv)
で始まるパラメータは
-
または
--
に渡されます。
npm
であり、スクリプトにはない
そして、そこで静かに飲み込まれる。
$ npm run test foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', 'foobar']
$ npm run test -foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js']
$ npm run test --foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js']
$ npm run test -- foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', 'foobar']
$ npm run test -- -foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', '-foobar']
$ npm run test -- --foobar
['C:\\Program Files\\nodejs\\node.exe', 'C:\\git\\myrepo\\test.js', '--foobar']
この差は、パラメータを使用することでより明確になります。 実際にnpmで使用されている :
$ npm test --help // this is disguised `npm --help test`
npm test [-- <args>]
aliases: tst, t
パラメータの値を取得する。
この質問を見る
. 名前付きパラメータを読むには、以下のような解析ライブラリを使うのがよいでしょう。
yargs
または
ミニマリスト
nodejsが公開する
process.argv
はグローバルに、コマンドラインパラメータの値を含んでいますが、これは低レベルのAPIです(オペレーティングシステムからノード実行ファイルに提供される、空白で区切られた文字列の配列です)。
2013.10.03を編集しました。
現在、直接は不可能です。しかし、関連する
GitHubで公開された課題
npm
を使用して、要求している動作を実装することができます。これを実装することがコンセンサスになっているようですが、以前に別の問題が解決されているかどうかにかかっています。
オリジナルの回答(2013.01)です。 何らかの回避策(あまり便利ではありませんが)として、以下のようにすることができます。
パッケージ名を
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
は上書きされます)。
関連
-
HTML+CSS+JavaScriptで簡単な三目並べゲームを作成する。
-
[解決済み】npm 5で作成されたpackage-lock.jsonファイルはコミットするのでしょうか?
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] npm installの-saveオプションは何ですか?
-
[解決済み] インストールされているnpmパッケージのバージョンを検索する
-
[解決済み] npm package.jsonファイルのdependencies, devDependencies, peerDependenciesの違いは何ですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Bowerとnpmの違いは何ですか?
-
[解決済み] Node.jsのnpmモジュールをアンインストールするにはどうすればよいですか?
-
[解決済み] Node.jsのNPMモジュール(package.json)のdevDependenciesのインストールを防ぐにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
親子コンポーネント通信を解決する3つのVueスロット
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
Vue+ElementUIによる大規模なフォームの処理例
-
vue for 登録ページ効果 vue for sms 認証コードログイン
-
jQueryのコピーオブジェクトの説明
-
Vueにシンプルなメモ帳機能を実装
-
vueにおけるv-forループオブジェクトのプロパティ
-
[解決済み】Node.js Error: Cannot find module express
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] package.jsonの中から環境変数を設定する方法は?