如何用 .asdfrc 的插件钩子在 asdf 插件安装、更新前后执行自定义脚本
【免费下载链接】asdfExtendable version manager with support for Ruby, Node.js, Elixir, Erlang & more项目地址: https://gitcode.com/GitHub_Trending/as/asdf
如果你的多个项目里都在用 asdf 管理语言版本,你很可能需要在asdf plugin add添加插件、asdf plugin update更新插件的前后做一些自己的事情:记录日志、同步配置、触发通知等。asdf 支持在机器级配置文件.asdfrc里定义插件钩子(Plugin Hooks),在插件安装(add)、reshim、更新(update)、卸载(remove)前后执行自定义代码,见 配置文档。本文以 add 和 update 为主路径,说明钩子如何配置、何时触发、以及如何通过命令输出确认钩子确实执行了。
钩子的配置位置与命名规则
.asdfrc是 asdf 的用户机器级配置文件,默认位置是${HOME}/.asdfrc。如果 asdf 安装在别处,可以用环境变量ASDF_CONFIG_FILE指向任意位置(必须是绝对路径,且应在 sourceasdf.sh/asdf.fish等脚本之前设置)。
钩子在.asdfrc中按钩子名 = shell 表达式的形式定义。文档给出的示例:
pre_foo_bar = echo Executing with args: $@支持的模式如下(摘自 configuration.md 的 Plugin Hooks 一节):
| 模式 | 触发时机 |
|---|---|
{pre,post}_asdf_plugin_{add,update,remove,reshim} | 通用钩子,对任意插件的对应操作生效;$1为插件名 |
{pre,post}_asdf_plugin_{add,update,remove}_<plugin_name> | 只针对某个具体插件名生效 |
{pre,post}_asdf_{install,reshim,uninstall}_<plugin_name> | 工具版本安装/reshim/卸载前后,$1为完整版本号 |
pre_asdf_download_<plugin_name> | 下载插件对应工具源码前 |
本文聚焦第一、二种模式(插件 add/update 前后)。第三、四种是同一机制作用于版本安装流程的钩子,本文不展开。
在 .asdfrc 中配置 add / update 钩子
最短主路径是写通用钩子。在${HOME}/.asdfrc中追加(以下内容来自 test/plugin_add_command.bats 中的真实测试配置):
pre_asdf_plugin_add = echo ADD ${@} post_asdf_plugin_add = echo ADD done ${@} pre_asdf_plugin_update = echo UPDATE ${@} post_asdf_plugin_update = echo UPDATE done ${@}- 每行一个钩子;
$@/${@}会把参数原样打印出来,方便确认钩子拿到了什么(通用钩子的$1是插件名)。 - 钩子值是任意 shell 表达式,asdf 会执行它,输出直接进入 asdf 命令的 stdout/stderr。asdf 内部的 testdata/asdfrc 展示了更复杂的写法(如
eval $@),按需使用。
可选分支:只针对某个插件生效的钩子。以插件名dummy为例:
pre_asdf_plugin_add_dummy = echo ADD post_asdf_plugin_update_dummy = echo UPDATE done从 internal/plugins/plugins.go 的实现可以看出执行顺序:以 add 为例,asdf 先依次执行pre_asdf_plugin_add(传插件名)和pre_asdf_plugin_add_<plugin_name>(不传参数),完成插件克隆后,再依次执行两个post钩子;update 流程(asdf plugin update <tool> [<git-ref>])同样在执行前、执行后各触发一次通用与具体钩子。因此同一次操作中,通用钩子和具体钩子都会运行,而不是二选一。
执行并验证钩子是否生效
编辑
${HOME}/.asdfrc,按上一节写入钩子。添加一个插件。文档推荐的插件安装方式是通过直接 URL 添加(见 create.md):
asdf plugin add <name> <git-url> # 例如 asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs检查命令输出中钩子的打印位置。以下是 test/plugin_add_command.bats 中测试断言的输出(文档测试示例,非固定预期):
配置
pre_asdf_plugin_add = echo ADD ${@}后,asdf plugin add dummy <url>的输出为:ADD dummy plugin add path=${ASDF_DIR}/plugins/dummy source_url=${BASE_DIR}/repo-dummy即 pre 钩子打印在插件 add 的输出之前,且
$1(dummy)被正确传入。配置
post_asdf_plugin_add = echo ADD ${@}后,钩子打印出现在plugin add path=...一行之后。配置
pre_asdf_plugin_add_dummy = echo ADD后,输出中只有ADD(具体钩子不接收参数),出现在plugin add输出之前。
更新插件时同理执行
asdf plugin update <tool> [<git-ref>],确认pre/post_asdf_plugin_update的打印出现在更新操作输出之前/之后。
判断标准很简单:钩子表达式打印的内容出现在 asdf 命令输出里,且位置(前/后)与 pre/post 对应,说明钩子按预期触发。asdf 的测试套件正是用这种方式断言的。
限制与边界
.asdfrc是机器级配置,不可共享。它存的是本机自定义,团队协作共享的版本约定应写在.tool-versions里;需要多用户统一钩子时,可用ASDF_CONFIG_FILE把配置文件指到受管理的绝对路径。- 未定义的钩子不会报错。执行一个
.asdfrc中不存在的钩子名时,asdf 直接跳过(internal/hook/hook_test.go 中有对应的测试用例),所以给通用钩子改名或删除某行不会导致 add/update 失败。 - 具体钩子不支持 reshim。模式表中
<plugin_name>变体只覆盖 add、update、remove,reshim 只有通用钩子pre/post_asdf_plugin_reshim。 - 区分用户钩子与插件自带脚本。插件仓库自身也可以提供
bin/post-plugin-add、bin/post-plugin-update、bin/pre-plugin-remove等回调脚本(见 docs/plugins/create.md),它们由插件作者编写、随插件分发;而本文的.asdfrc钩子由用户在自己机器上定义。两者是不同机制,不要混用。
完成配置后,你可以在每次插件添加、更新前后自动执行任意 shell 逻辑;如果之后还想在工具版本安装/卸载前后(而不是插件层面)执行自定义逻辑,可以使用{pre,post}_asdf_{install,uninstall}_<plugin_name>钩子,$1会收到完整的版本号。
【免费下载链接】asdfExtendable version manager with support for Ruby, Node.js, Elixir, Erlang & more项目地址: https://gitcode.com/GitHub_Trending/as/asdf
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考