Hooks
デフォルトでは、VoltaはNode、npm、Yarnをパブリックソースとレジストリ(https://nodejs.org、https://yarnpkg.com、https://www.npmjs.com)から取得します。しかし、環境によっては、Voltaに異なるソースからダウンロードするよう指示する必要がある場合があります(例:内部ツール用のnpm Enterprise)。このような状況に対応するため、Voltaはダウンロードプロセスでのフックを提供します。
フックの指定場所
フックは常にhooks.jsonというファイルで設定されます。このファイルは、これらのフックに持たせたいスコープに応じて、以下の2つの場所のいずれかに配置できます:
- Voltaディレクトリに指定されたフック(Linux/macOSでは
~/.volta/hooks.json、Windowsでは%LOCALAPPDATA%\Volta\hooks.json)はシステム全体に適用されます。 - プロジェクトの
.voltaサブディレクトリに指定されたフック(<PROJECT ROOT>/.volta/hooks.json)は、そのプロジェクト内でのみ適用されます。ここで<PROJECT ROOT>は、そのプロジェクトのpackage.jsonの場所として定義されます。
フックファイル形式
hooks.jsonの内容は、各ツールタイプ(現在はnode、npm、yarn)に対するオプションキーを提供するオブジェクトでなければなりません。各ツールには3つの操作があり、それぞれの操作にフックを適用できます:
indexは、そのツールがダウンロード可能なバージョンのリストを決定するために使用されるURLを表します。そのURLにアクセスしたときのレスポンスは、選択されたツールのパブリックインデックス形式と一致する必要があります。latestは、そのツールの最新バージョンを決定するために使用されるURLを表します。nodeの場合、レスポンスはindex形式と同じで、最新バージョンがリストの最初の要素であることを確認する必要があります。yarnの場合、レスポンスは生のバージョン番号文字列のみである必要があります。distroは、ツールバイナリをダウンロードするために使用されるURLを表します。
最後に、各操作には3つの可能なフック(以下で説明)があり、使用できます(各操作につき一度に1つのみ指定可能)。hooks.jsonファイルの例は以下の通りです:
{
"node": {
"index": {
"bin": "/usr/local/node-lookup"
},
"latest": {
"prefix": "http://example.com/node/"
},
"distro": {
"template": "http://example.com/{{os}}/{{arch}}/node-{{version}}.tar.gz"
}
},
"npm": {
"index": {
"prefix": "http://example.com/npm/"
},
"latest": {
"bin": "~/npm-latest"
},
"distro": {
"template": "http://example.com/npm/npm-{{version}}.tgz"
}
},
"yarn": {
"index": {
"template": "http://example.com/yarn/{{os}}/{{arch}}/yarn-{{version}}.tgz"
},
"latest": {
"prefix": "http://example.com/yarnpkg/"
},
"distro": {
"bin": "~/yarn-distro"
}
}
}フックタイプ
prefixフック
prefixフックは直接的なURL置換です。URLは指定されたプレフィックスと、その操作のパブリックファイル名を使用して構築されます。例えば、上記のhooks.jsonを使用して、最新のyarnバージョンを決定するためのprefixフックを指定しました。デフォルトでは、Voltaはhttps://yarnpkg.com/latest-versionにリクエストして最新バージョンを取得します。フックを使用すると、Voltaはhttp://example.com/yarnpkg/latest-versionにアクセスしようとし、指定されたプレフィックスhttp://example.com/yarnpkg/にlatest-versionを追加します。
templateフック
templateフックは、置換されるワイルドカードを含むURLのテンプレートを指定できます。利用可能なワイルドカードは以下の通りです:
は、オペレーティングシステムに応じてdarwin、linux、またはwinに置換されます。は、システムアーキテクチャに応じてx86またはx64に置換されます。(distro操作でのみ利用可能)は、Voltaがダウンロードしようとしているツールの特定のバージョンに置換されます。は、Voltaがパブリックレジストリからダウンロードするファイルのファイル名に置換されます。(distro操作でのみ利用可能)は、Voltaがダウンロードを期待するファイル拡張子に置換されます。
TIP
filenameとextの置換は、Volta 0.8.4以降でのみ利用可能です
上記の例のnode.distroフックを使用して、64ビットLinuxシステムでnode@10.15.3を取得するとき、Voltaは以下の場所からtarballをダウンロードしようとします:http://example.com/linux/x64/node-10.15.3.tar.gz
binフック
binフックは汎用フックで、外部スクリプトを呼び出してURLを決定します。値は呼び出される実行可能スクリプトのパスで、URLはそのスクリプトのstdoutから読み取られます。スクリプトのstderrはユーザーに表示されるため、必要に応じて進行状況バーや待機スピナーを表示するために使用できます。スクリプトのパスが相対パスの場合、それを指定したhooks.jsonファイルに対して相対的に解決されます。この場合、相対パスとは、Linux/macOSでは./または../で始まり、Windowsでは.\または..\で始まるパスを意味します。最後に、distro操作フックの場合、要求されたツールバージョンが最初の引数としてスクリプトに渡されます。
サンプルhooks.jsonのyarn.distroフックを使用して、yarn@1.13.0を取得するとき、Voltaは~/yarn-distro "1.13.0"を呼び出し、そのフックが返すURLからtarballをダウンロードしようとします。