web-dev-qa-db-ja.com

package.jsonのnpmスクリプトにコマンドライン引数を渡します

Package.jsonに以下のスクリプトがあります。

"scripts": {
    "vumper": "node node_modules/vumper/index.js",
    "format": "prettier --single-quote -width=80 --write package.json"
 },

「vumper」パッケージは、コマンドライン引数(「dv」など)を受け取ります。私ができることは、これらの両方を連続して実行するコマンドを使用することです。

本質的に、私は実行できるようにしたい:

npm run vumber dv

その後

npm run format

しかし、1つのコマンドで、次のようなもの

npm run my-build dv

上記の両方のコマンドを実行し、コマンドライン引数「dv」を正しく受け入れて、最初のnpm run vumperに渡します。これは可能ですか?

11
Tony Scialo

簡潔な答え:

基本的に、あなたが望んでいるのは、npm-scriptを次のようにすることです。これにより、CLIを介して_<arg-here>_が提供されます。

_...
"scripts": {
  "my-build": "npm run vumper <arg-here> && npm run format",
  ...
},
...
_

ただし、残念ながら、npmにはこれを実現するための組み込み機能がありません。

特別なnpmオプション_--_(Solution 1の最後を参照してください)引数をスクリプトの[〜#〜] end [〜#〜]に渡しますが、MIDDLEには渡しません。したがって、2つのコマンドが反対の場合次のように、_--_オプションを使用できます。

_...
"scripts": {
  "my-build": "npm run format && npm run vumper --",
  ...
},
...
_

スクリプトのMIDDLEに引数を渡す組み込み機能がないという制限を克服するには、次の解決策を検討してください。

  1. Bashのみのソリューションについては、「ソリューション1」セクションを参照してください。

  2. クロスプラットフォームサポートが必要な場合は、「ソリューション2」セクションで説明されているソリューションに従ってください。


解決策1-Bash(MacOS/Linux /など)

以下に示すように、package.jsonscriptsセクションで_my-build_スクリプトを構成して、Bash Shell function を呼び出します:

package.json

_...
"scripts": {
  "my-build": "func() { npm run vumper \"$1\" && npm run format; }; func",
  "vumper": "node node_modules/vumper/index.js",
  "format": "prettier --single-quote -width=80 --write package.json"
},
...
_

説明:

funcという名前のBash関数は次のことを行います。

  1. 最初に_npm run vumper <arg>_を実行します。これにより、_<arg>_は、CLIを介して渡されるシェル引数になります。スクリプトでは、_$1_(つまり、最初の 位置パラメータ /引数)を使用して参照されます。
  2. 続いて、コマンド_npm run format_を介してformatという名前のスクリプトを実行します。

これらの2つの_npm run_コマンドは_&&_演算子を使用してチェーンされているため、2番目の_npm run format_コマンドは、最初の_npm run vumper <arg>_コマンドが正常に完了した場合(つまり、_0_終了コード)。

_my-build_スクリプトの実行:

CLIから_my-build_を呼び出すには、次を実行する必要があります。

_npm run my-build -- dv
_

注意:

  1. この場合、末尾のdv部分は、vumperスクリプトに渡される引数です。

  2. 引数の前に特別なオプション_--_を指定する必要があります。 docs は、_--_オプションを次のように説明します。

    ...特別なオプション_--_は、オプションの終わりを区切るために getopt によって使用されます。 npmは、_--_の後のすべての引数をスクリプトに直接渡します。..引数は、_npm run_の後に指定されたスクリプトにのみ渡され、プリまたはポストスクリプトには渡されません。


解決策2-クロスプラットフォーム

クロスプラットフォームソリューション(Bash、Windowsコマンドプロンプト/cmd.exe、PowerShellなどで正常に動作するソリューション)の場合、nodejsヘルパースクリプトを次のように利用する必要があります。

run.js

Nodejsスクリプトに名前run.jsを付け、package.jsonと同じレベルでプロジェクトのルートディレクトリに保存します。

_const execSync = require('child_process').execSync;

const arg = process.argv[2] || 'dv'; // Default value `dv` if no args provided via CLI.

execSync('npm run vumper ' + arg, {stdio:[0, 1, 2]});
execSync('npm run format', {stdio:[0, 1, 2]});
_

package.json

_my-build_スクリプトを設定して、次のようにrun.jsを呼び出します。

_...
"scripts": {
  "my-build": "node run",
  "vumper": "node node_modules/vumper/index.js",
  "format": "prettier --single-quote -width=80 --write package.json"
},
...
_

_my-build_スクリプトの実行:

ソリューション1に従って、CLIから_my-build_を呼び出すには、次を実行する必要があります

_npm run my-build -- dv
_

説明:

  • run.js_process.argv_ を使用して、CLIを介して渡された引数を取得します(例:dv)。 _npm run my-build_の実行時に引数が指定されていない場合、デフォルト値(つまりdv)がvumper npm-scriptに渡されます。

  • run.jsも利用します child_process.execSync(...) toShell-out/ invoke 2つの_npm run_コマンド。

19
RobC

同時に使用できると思います。

https://www.npmjs.com/package/concurrently

最初に同時にインストールしてから、次のように使用する必要があります。

引数を指定して複数のコマンドを実行できます

だからあなたの場合、それは

concurrently "npm:vumber dv" "npm:format"
0
Sanish Joseph