ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Homebrew Autobump 机制解析:官方仓库的自动版本升级与 no_autobump! 排除策略

Homebrew Autobump 机制解析:官方仓库的自动版本升级与 no_autobump! 排除策略 Homebrew Autobump 机制解析官方仓库的自动版本升级与 no_autobump! 排除策略【免费下载链接】brew The Package Manager for Everywhere项目地址: https://gitcode.com/GitHub_Trending/br/brewHomebrew 的 Autobump 机制让官方仓库Homebrew/core、Homebrew/cask中的软件包无需贡献者手动提交升级 PR由 BrewTestBot 驱动的 GitHub Action 每 3 小时扫描一次 autobump 列表中的软件包发现新版本后自动开启升级 Pull Request。本文基于仓库文档 docs/Autobump.md 及核心实现源码完整讲解该机制的运作方式、三种排除条件、no_autobump!的合法参数取值以及 RuboCop 对排除理由的静态审计规则帮助你在维护官方 tap 中的软件包时正确配置自动升级行为。Autobump 的工作方式在官方仓库中BrewTestBot 会自动检查处于 Homebrew autobump 列表 中的软件包是否有可用更新。这些软件包不需要贡献者手动 bump即手动提升版本号每隔 3 小时一个 GitHub Action 会检查是否需要升级并在需要时自动开启一个新的 Pull Request 将其升级到最新版本。这意味着对于处于 autobump 列表中的包维护者只需保证 formula/cask 定义正确版本迭代由 CI 流水线负责。列表的默认覆盖范围非常宽默认情况下Homebrew/core 和 Homebrew/cask 仓库中所有新增的 formula 和 cask 都会进入 autobump 列表。因此如何把某个包排除出去比如何加入更有实际意义。将软件包排除出 autobump 的三种方式要让一个软件包不进入 autobump 列表它必须满足以下其中任意一个条件存在生效的deprecate!或disable!调用—— 已被废弃或禁用的包不会再被升级livecheck do块中包含skip调用—— livecheck 被显式跳过例如livecheck do skip Not maintained url https://example.com/foo/releases regex /foo-(\d(?:\.\d))\.tar/ end该 DSL 形式对应源码中 formula.rb 的livecheck方法它在Livecheck对象的上下文中执行块内容skip即向自动检查流水线声明该包不做版本检查。livecheck 的更多用法见 Brew-Livecheck.md。存在no_autobump!调用—— 主动声明排除并给出理由详见下一节。此外formula 与 cask 各自还有若干特定的不自动升级原因分别列于 Formula CookbookExcluding formulae from autobumping 小节与 Cask Cookbook 中。值得注意的是除了上述显式声明还有两种隐式排除由 DSL 自动完成见源码 cask/dsl.rbcask 的version设置为:latest时会自动以:latest_version为由调用set_no_autobumpcask 的 livecheck 策略为:extract_plist时会自动以:extract_plist为由排除cask/dsl.rb。这两种情况不需要也不应该手写no_autobump!理由本身由系统自动填入。no_autobump! 排除理由符号优先、字符串兜底使用no_autobump!时必须提供排除理由。有两种书写方式方式一推荐使用预置符号。合法符号定义在常量NO_AUTOBUMP_REASONS_LIST中源码见 autobump_constants.rbno_autobump! because: :bumped_by_upstream方式二自定义字符串。当预置理由都不适用时可以直接写字符串no_autobump! because: some unique reason文档同时指出如果多个软件包有相似的自定义理由可以将其作为新符号加入NO_AUTOBUMP_REASONS_LIST实现理由复用。常量中的全部合法理由从 Library/Homebrew/autobump_constants.rb 的源码可以看到NO_AUTOBUMP_REASONS_LIST由三部分合并而成共 5 个符号符号含义来源:incompatible_version_format包的版本格式只能人工更新公开理由NO_AUTOBUMP_REASONS_LIST直接定义:bumped_by_upstream包的更新由上游开发者负责处理公开理由:extract_plistlivecheck 使用了:extract_plist策略内部理由NO_AUTOBUMP_REASONS_INTERNAL由系统自动设置:latest_versionversion被设置为:latest内部理由NO_AUTOBUMP_REASONS_INTERNAL由系统自动设置:requires_manual_review该包的 autobump 纳入需要人工审查已废弃理由NO_AUTOBUMP_REASONS_DEPRECATED可以看到源码把符号分为公开、内部、废弃三档这一分档直接约束了维护者的使用方式——内部与废弃符号有各自的校验逻辑下文 RuboCop 审计一节详述。参数校验官方 tap 限制与符号合法性no_autobump!的实现位于 formula.rbformula 侧与 cask/dsl.rbcask 侧两者行为一致def no_autobump!(because:) caller_path caller_locations(1, 1).first.path if caller_path tap Tap.from_path(caller_path) raise ArgumentError, no_autobump! can only be used in official Homebrew taps. if tap !tap.official? end if because.is_a?(Symbol) !NO_AUTOBUMP_REASONS_LIST.key?(because) raise ArgumentError, because argument should use valid symbol or a string! end # ... end由此可以确认三条硬性约束只能在官方 tap 中使用从调用者文件路径解析出所属 tap若非官方 tap 则抛出ArgumentErrorcask 侧抛出CaskInvalidError。第三方 tap 无法使用该 DSL 语句符号必须合法传入 Symbol 时会查NO_AUTOBUMP_REASONS_LIST不在表中的符号直接报错字符串则不做白名单校验cask 中该语句只能出现一次cask/dsl.rb 的set_no_autobump在no_autobump_defined?已为真时再次调用会抛出 no_autobump! stanza may only appear once. 错误formula 侧则通过autobump状态位生效。调用成功后软件包的autobump被置为falseautobump?返回false排除理由存入no_autobump_message。这两个属性还会随官方 API 一起对外暴露——见 formula.rb 中autobump autobump?、no_autobump_message no_autobump_message的 API 序列化映射下游工具可以据此判断一个包是否处于自动升级列表。对于非官方 tap仓库采用另一种管理方式tap_auditor.rb 检查第三方 tap 的.github/autobump.txt文件与其声明的 autobump 列表是否一致即第三方 tap 通过维护一份文本清单来表达升级策略而不是依赖no_autobump!。RuboCop 静态审计理由字符串的书写规范排除理由不仅要存在还要写得规范。仓库为 formula 和 cask 各配了一个 RuboCop 审计 cop——rubocops/no_autobump.rb 与 rubocops/cask/no_autobump.rb——共用 rubocops/shared/no_autobump_helper.rb 中的规则模块对应测试见 test/rubocops/no_autobump.rb。其规则包括because:参数不可缺失若no_autobump!没有because:字符串或符号参数直接报告Add a reason for exclusion from autobump: no_autobump! because: ...禁止使用内部自动理由符号:extract_plist与:latest_version属于系统内部自动设置见上文的DISALLOWED_NO_AUTOBUMP_REASONS列表人工写入会被判为错误——这两个场景应由version :latest或:extract_plist策略自动触发而非手写字符串理由不能以it开头支持 autocorrect 自动去掉前缀字符串理由不能以标点符号.!?结尾同样支持 autocorrect 自动删除末尾标点。这些规则说明理由字符串会被集中展示给维护者与 CI 系统因此仓库要求它像常量说明一样是陈述性短语而非完整句子。小结配置时的决策路径结合文档与源码为官方 tap 中的软件包配置 Autobump 行为时的判断顺序为包已废弃/禁用deprecate!/disable!或 livecheck 被skip——是则已被排除无需额外声明cask 使用version :latest或:extract_plist策略——系统自动排除勿手写no_autobump!需要手动排除——使用no_autobump!优先从NO_AUTOBUMP_REASONS_LIST见 Library/Homebrew/autobump_constants.rb选取预置符号如:bumped_by_upstream、:incompatible_version_format不匹配时用不重复it开头、不带末尾标点的短字符串并且若多个包共享同一理由考虑将其提升为新符号加入该常量列表。以上即 Autobump 文档 所述机制的完整实现链路默认全量自动升级 → 三类显式排除条件 →no_autobump!的理由约束DSL 校验 RuboCop 静态审计 API 对外暴露。【免费下载链接】brew The Package Manager for Everywhere项目地址: https://gitcode.com/GitHub_Trending/br/brew创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表