news 2026/9/13 14:15:37

如何用 .asdfrc 的插件钩子在 asdf 插件安装、更新前后执行自定义脚本

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 .asdfrc 的插件钩子在 asdf 插件安装、更新前后执行自定义脚本

如何用 .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>])同样在执行前、执行后各触发一次通用与具体钩子。因此同一次操作中,通用钩子和具体钩子都会运行,而不是二选一。

执行并验证钩子是否生效

  1. 编辑${HOME}/.asdfrc,按上一节写入钩子。

  2. 添加一个插件。文档推荐的插件安装方式是通过直接 URL 添加(见 create.md):

    asdf plugin add <name> <git-url> # 例如 asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs
  3. 检查命令输出中钩子的打印位置。以下是 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 的输出之前,且$1dummy)被正确传入。

    • 配置post_asdf_plugin_add = echo ADD ${@}后,钩子打印出现在plugin add path=...一行之后。

    • 配置pre_asdf_plugin_add_dummy = echo ADD后,输出中只有ADD(具体钩子不接收参数),出现在plugin add输出之前。

  4. 更新插件时同理执行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-addbin/post-plugin-updatebin/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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 14:13:41

COMSOL相场法模拟水力压裂与裂纹扩展技术

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 14:12:49

AI应用生产落地的坑与实战:从RAG到Agent的工程化全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 14:11:16

微信小程序二手商城开发实战与技术解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 14:11:13

Java字符串数组创建的底层原理与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 14:10:54

大数据驱动的SEO优化:工具、技术与实战架构

1. SEO大数据优化的核心价值与挑战在当今数字营销领域&#xff0c;SEO与大数据分析的结合已经成为企业获取精准流量的黄金组合。根据Search Engine Journal最新研究&#xff0c;采用大数据驱动的SEO策略可使网站有机流量提升47%&#xff0c;而传统SEO方法平均仅能带来12%的增长…

作者头像 李华