1. ホーム
  2. javascript

[解決済み] npmスクリプトへのコマンドライン引数の送信

2022-03-20 18:14:24

質問

その 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.jsonmyPackage であり、また

"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 は上書きされます)。