钩子
默认情况下,Volta 从公共来源和注册表(https://nodejs.org、https://yarnpkg.com、https://www.npmjs.com)获取 Node、npm 和 Yarn。但是,根据您的环境,可能需要告诉 Volta 从不同的来源下载(例如用于内部工具的 npm Enterprise)。为了适应这种情况,Volta 提供了下载过程中的钩子。
在哪里指定钩子
钩子总是在名为 hooks.json
的文件中设置。此文件可以在两个位置之一,具体取决于您希望这些钩子具有的范围:
- 在 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 个可能的钩子(如下所述),可以使用(每次每个操作只能指定其中一个)。一个示例 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
,将 latest-version
附加到指定的前缀 http://example.com/yarnpkg/
上。
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。