Skip to content

钩子

默认情况下,Volta 从公共来源和注册表(https://nodejs.orghttps://yarnpkg.comhttps://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 的内容必须是一个对象,为每种工具类型(目前是 nodenpmyarn)提供可选键。每个工具有 3 个操作,每个操作都可以应用钩子:

  • index 表示用于确定该工具可供下载的版本列表的 URL。访问该 URL 时的响应必须匹配所选工具的公共索引格式。
  • latest 表示用于确定该工具最新版本的 URL。对于 node,响应应与 index 格式相同,确保最新版本是列表中的第一个元素。对于 yarn,响应应该是原始版本号字符串,仅此而已。
  • distro 表示用于下载工具二进制文件的 URL。

最后,每个操作有 3 个可能的钩子(如下所述),可以使用(每次每个操作只能指定其中一个)。一个示例 hooks.json 文件是:

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 的模板,其中包含将被替换的通配符。可用的通配符有:

  • 将根据操作系统被替换为 darwinlinuxwin
  • 将根据系统架构被替换为 x86x64
  • (仅对 distro 操作可用)将被 Volta 尝试下载的工具的特定版本替换。
  • 将被 Volta 从公共注册表下载的文件的文件名替换。
  • (仅对 distro 操作可用)将被 Volta 期望下载的文件扩展名替换。

TIP

filenameext 替换仅在 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。