scripts
On 12月 17, 2021 by adminDescription
package.json
ファイルの"scripts"
プロパティは、多くの組み込みスクリプトとそのプリセット ライフサイクル イベント、および任意のスクリプトをサポートします。 これらはすべて npm run-script <stage>
または npm run <stage>
を実行することで実行できます。 一致する名前のプリポストコマンドも同様に実行される(例:premyscript
, myscript
, postmyscript
)。 依存関係のスクリプトは npm explore <pkg> -- npm run <stage>
で実行できます。
Pre & Post Scripts
package.json
の "scripts"
セクションで定義されたスクリプトに対して “pre” または “post” スクリプトを作成するには、単に一致する名前の別のスクリプトを作って、それらの先頭に “pre” または “post” を追加するだけです。
{"scripts": {"precompress": "{{ `compress` スクリプトの前に実行されます }}","compress": "{{ ファイルを圧縮するコマンドを実行 }}","postcompress": "ファイルを圧縮するコマンドを実行します。 "{{ `compress` スクリプトの後に実行する }}".}}
ライフサイクルスクリプト
特定の状況でのみ発生する、特別なライフサイクルスクリプトがあります。 これらのスクリプトは、”pre” と “post” スクリプトに追加して実行されます。
-
prepare
,prepublish
,prepublishOnly
,prepack
,postpack
prepare (846>以降)
- パッケージがパックされる前に実行
- パッケージが公開する前に実行
- ローカル
npm install
で何も引かずに実行 -
prepublish
より後で、prepublishOnly
より前に実行 - NOTE: git を通してインストールされるパッケージが
prepare
スクリプトを含んでいる場合、パッケージがパッケージ化されてインストールされる前に、そのdependencies
とdevDependencies
がインストールされ、prepare スクリプトが実行されるでしょう。
prepublish (DEPRECATED)
-
prepare
と同様
prepublishOnly
- パッケージが準備されてパッケージされる前に
npm publish
上でのみ実行されます。
prepack
- tarball が圧縮される前に実行されます (
npm pack
,npm publish
, および git 依存関係をインストールするとき)。 - NOTE: “
npm run pack
” は “npm pack
” と同じものではありません。 「
postpack
- tarball が生成され、最終目的地に移動した後に実行されます。
Prepare and Prepublish
非推奨 Note: prepublish
[email protected]以来、npm CLI は npm publish
と npm install
の両方に対して prepublish
スクリプトを実行しています。これは、使用のためにパッケージを準備するのに都合の良い方法であるからです (いくつかの共通の使用例は下のセクションで説明されています)。 これはまた、実際には非常にわかりにくいものであることが判明しています。 [email protected]
の時点で、この既存の動作を維持する新しいイベント prepare
が導入されています。 新しいイベント prepublishOnly
は、ユーザーが既存の npm バージョンの混乱した動作を避け、npm publish
でのみ実行できるようにする過渡的な戦略として追加されました (たとえば、テストを最後にもう一度実行して、良い状態であることを確認するなどです)。
この変更に関する、さらなる読み物を含むより長い正当化理由については、https://github.com/npm/npm/issues/10074 を参照してください。
使用例
ターゲット システムの OS やアーキテクチャに依存しない方法で、使用前にパッケージに対して操作を実行する必要がある場合、prepublish
スクリプトを使用してください。 これには次のようなタスクが含まれます:
- CoffeeScript ソース コードを JavaScript にコンパイルする。
- JavaScript ソース コードの minified バージョンを作成する。
- パッケージが使用するリモート リソースを取得する。
これらのことを prepublish
時に実施する利点は、一度で単一の場所で行うため複雑さと変動性が少なくなることです。 さらに、これは以下のことを意味します。
-
devDependency
としてcoffee-script
に依存できるので、ユーザーはそれをインストールする必要がありません。 - 最小化ツールをパッケージに含める必要がなく、ユーザーにとってのサイズを縮小できます。
ライフサイクル操作順序
npm publish
prepublishOnly
prepare
prepublish
publish
postpublish
npm pack
prepack
postpack
npm install
preinstall
install
postinstall
トリガーも
- prepublish (ローカル時)
-
prepare
(ローカル時)
npm start
npm run start
にはnpm start
の略記があります。
prestart
start
poststart
Default Values
npm はパッケージ内容に基づいていくつかの値をデフォルトで使用します。
-
"start": "node server.js"
:パッケージのルートに
server.js
ファイルがある場合、npm はstart
コマンドをnode server.js
にデフォルト設定します。 -
"install": "node-gyp rebuild"
:パッケージのルートに
binding.gyp
ファイルがあり、独自のinstall
またはpreinstall
スクリプトを定義していない場合、npm は node-gyp を使用してコンパイルするためにinstall
コマンドを既定に設定します。
User
npm が root 権限で起動された場合、uid を user
config で指定したユーザーアカウントまたは uid (デフォルトは nobody
) に変更します。
Environment
Package scripts run in the environment where many pieces of information are available regarding the setup of npm and the current state of the process.
path
testsuites など、実行スクリプトを定義するモジュールに依存している場合、それらの実行可能ファイルはスクリプト実行時の PATH
に追加されることに注意してください。 つまり、package.json が以下のような場合:
{"name" : "foo","dependencies" : {"bar" : "0.1.x"},"scripts": {"start" : "bar ./test"}.}
そこで npm start
を実行すると bar
スクリプトが実行され、npm install
の node_modules/.bin
ディレクトリにエクスポートされます。
package.json vars
package.json フィールドは npm_package_
プレフィックスに追加されました。 例えば、package.json ファイルに {"name":"foo", "version":"1.2.5"}
がある場合、パッケージスクリプトには npm_package_name
環境変数に “foo” が設定され、npm_package_version
に “1.2.5” が設定されていることになります。 これらの変数には process.env.npm_package_name
や process.env.npm_package_version
でアクセスでき、他のフィールドも同様です。
configuration
設定パラメータは、npm_config_
というプレフィックスで環境に格納されます。 例えば、環境変数npm_config_root
を確認することで、有効なroot
configを見ることができます。
Special: package.json “config” object
configパラメータに<name>:<key>
があると、環境中のパッケージのconfigキーが上書きされる。 例えば、package.jsonが以下のような場合:
{"name" : "foo","config" : {"port" : "8080"},"scripts" : {"start" : "node server.js"}.}
そして server.js はこれです:
http.createServer(...).listen(process.env.npm_package_config_port)
とすると、ユーザーは次のようにして動作を変更できます:
npm config set foo:port 80
現在のライフサイクル イベント
最後に、npm_lifecycle_event
環境変数はサイクルのどの段階でも設定されていることを示します。 したがって、プロセスのさまざまな部分で使用され、現在何が起こっているかに基づいて切り替わる 1 つのスクリプトを持つことができます。
オブジェクトはこの形式に従ってフラット化されるため、{"scripts":{"install":"foo.js"}}
がパッケージに含まれている場合、そのオブジェクトは、
のように表示されます。
process.env.npm_package_scripts_install === "foo.js"
Examples
例えば、package.json に次のようなものがあるとします:
{"scripts" : {"install" : "scripts/install.js","postinstall" : "scripts/install.js","uninstall" : "scripts/uninstall.js"} となります。}
すると、ライフサイクルのインストールとインストール後の段階で scripts/install.js
が呼び出され、パッケージがアンインストールされるときに scripts/uninstall.js
が呼び出されることになります。 scripts/install.js
は 2 つの異なるフェーズで実行されるので、この場合、npm_lifecycle_event
環境変数を調べるのが賢明でしょう。
Make コマンドを実行したい場合、そうすることが可能です。 これはちょうどよく動作します:
{"scripts" : {"preinstall" : "./configure","install" : "make && make install","test" : "make test"} ですね。}
Exiting
スクリプトは、sh
にスクリプト引数として行を渡すことで実行されます。
もし、0以外のコードで終了した場合、プロセスを中断します。
スクリプトファイルは、nodejsやjavascriptプログラムでさえある必要はないことに注意してください。
フックスクリプト
すべてのパッケージの特定のライフサイクルイベントで特定のスクリプトを実行したい場合、フックスクリプトを使用することができます。
Hook スクリプトは package.json スクリプトとまったく同じ方法で実行されます。つまり、別の子プロセスで、上記の環境下で実行されます。 失敗がマイナーであったり、いくつかのオプション機能を妨げるだけであれば、警告を表示して正常に終了する方がよいでしょう。 package.json
を読んで、パッケージを適切に記述するだけで指定したり有効にしたりできるものをすべて見てください。 一般に、これはより堅牢で一貫した状態をもたらします。
npm_config_binroot
環境変数が /home/user/bin
に設定されている場合、実行可能ファイルを /usr/local/bin
にインストールしようとしないでください。 install
を使用しないでください。 コンパイルには .gyp
ファイルを、それ以外のものには prepublish
を使用します。 apreinstall やインストールスクリプトを明示的に設定する必要はほとんどないはずです。 もしそうするならば、他の選択肢がないかどうか考えてみてください。 install
または preinstall
スクリプトの唯一の有効な使用方法は、ターゲットアーキテクチャ上で行わなければならないコンパイルです。See Also
- npm run-script
- package.json
- npm developers
- npm install
コメントを残す