
如何用 deprecate! 和 disable! 正确弃用或禁用 Homebrew 包【免费下载链接】brew The Package Manager for Everywhere项目地址: https://gitcode.com/GitHub_Trending/br/brew如果你在维护一个 formulahomebrew/core或第三方 tap或 caskhomebrew/cask需要把软件标记为不应再使用或无法再安装Homebrew 的包文件里提供了deprecate!和disable!两条 DSL 语句来完成这件事。按 Deprecating, Disabling and Removing 的说明包会经历三阶段生命周期Deprecated不应再被使用。用户会看到一条警告但安装等动作仍会继续。Disabled无法再使用。用户会看到错误动作失败。Removed代码或包被完全删除。本文讲的是在包文件formula / cask 的 Ruby 文件中正确写出deprecate!与disable!日期和原因怎么写、选哪个阶段、以及如何确认生效。先判断该用 deprecate! 还是 disable!两条语句对应生命周期中不同阶段判断依据在文档中是明确的。Formula 应弃用deprecate!的条件满足其一即可在任何受支持的操作系统版本上都无法构建软件存在未解决的 CVE软件已在上游停止维护或被弃置该软件最近 90 天安装量为零。Cask 应弃用的条件满足其一即可在受支持的系统版本上无法通过 macOS Gatekeeper 检查软件无法在任何受支持的操作系统版本上运行存在未解决的 CVE软件已在上游停止维护或被弃置最近 90 天安装量为零。应禁用disable!的条件Formula无法在任何受支持的操作系统版本上从源码构建、已被弃用很长时间、或没有许可证。Cask无法在任何受支持的操作系统版本上安装、已被弃用很长时间、或上游下载 URL 已被移除。两条边界规则需要注意有依赖方dependents的 formula除非所有依赖方也同时被弃用否则不应弃用。受欢迎的 formula最近 90 天安装量超过 1000在至少 6 个月的弃用期之后才能禁用不受欢迎的 formula 可以直接禁用。Cask 的门槛是 300 次安装/90 天且问题无法修复时不受 6 个月限制。另外仅收到上游的移除请求或打包方式有问题的指控本身不构成弃用、禁用或删除的理由需要先评估包是否仍满足接收、安全和维护要求以及用户是否报告了实际的损坏参见 Working with Homebrew as an Upstream Project。在 formula 或 cask 文件中写 deprecate! / disable!两条语句语法相同参数为date:和because:可选replacement_formula:或replacement_cask:deprecate! date: 2026-09-09, because: :unmaintained带替代建议的写法deprecate! date: 2026-09-09, because: :unmaintained, replacement_formula: foodisable!的参数与上面完全一致只需替换语句名disable! date: 2026-09-09, because: :no_licensedate: 参数的适用条件date:是 ISO 8601 格式的字符串取值含义随语句不同对deprecate!应为弃用期开始的日期通常是当天。填未来日期会把弃用推迟到该日期不要倒填日期backdate那会造成混乱。对disable!应为禁用原因生效的日期。填未来日期时formula 或 cask 会先按弃用处理到该日期才转为禁用。Cask Cookbook 对 cask 的说明与此一致带未来日期的deprecate!在该日期之前不会被当作已弃用带未来日期的disable!则会自动先处于弃用状态到达日期后转为禁用。because: 参数的写法必须提供原因首选是预置符号。预置符号与文案的对应关系定义在 DeprecateDisable 模块 中。Formula 预置原因符号 → 文案符号文案文档给出的适用条件:does_not_builddoes not build无法在任何受支持的 macOS 版本或 Linux 上从源码构建:no_licensehas no license无法识别的许可证:repo_archivedhas an archived upstream repository上游仓库已归档且无可用替代品:repo_removedhas a removed upstream repository上游仓库已删除且无可用替代品:unmaintainedis not maintained upstream项目被弃置一年无提交且存在未解决的关键 bug 或 CVE仅不活跃不构成原因:unsupportedis not supported upstream上游不支持编译例如只支持早于 macOS 11 的版本:deprecated_upstreamis deprecated upstream上游已弃用且无可用替代品:versioned_formulais a versioned formula带版本号的 formula 不再满足要求:checksum_mismatchwas built with an initially released source file…构建 bottle 以来的源码校验和发生变化且无可信解释Cask 预置原因符号文案:discontinuedis discontinued upstream:moved_to_masis now exclusively distributed on the Mac App Store:no_longer_availableis no longer available upstream:no_longer_meets_criteriano longer meets the criteria for acceptable casks:unmaintainedis not maintained upstream:unreachableis no longer reliably reachable upstream:fails_gatekeeper_checkdoes not pass the macOS Gatekeeper check也可以用自定义字符串但必须能嵌入文档规定的句式name has been deprecated/disabled because it reason!cask 的实际提示句式为cask is deprecated because it reason!。文档给出的正反例# Good: fetches unversioned dependencies at runtime fits the sentence deprecate! date: 2020-01-01, because: fetches unversioned dependencies at runtime # Bad: invalid licence does not fit the sentence disable! date: 2020-01-01, because: invalid licencereplacement_formula: / replacement_cask:这两个可选参数接受一个字符串用于向用户推荐替代包。例如deprecate! date: 2026-09-09, because: :discontinued, replacement_formula: another disable! date: 2026-09-09, because: :unmaintained, replacement_cask: alternative确认弃用或禁用已生效文档定义的验证方式是观察brew install或升级时的行为与提示内容含deprecate!的包仍可安装安装或升级时会打印警告消息含disable!的包无法安装或升级会打印错误消息。消息由 DeprecateDisable 模块 的message方法拼装规则是包名 has been deprecated/disabled because it 原因!。如果设置了禁用日期还会追加 It was disabled on …已过该日期或 It will be disabled on …未到该日期如果提供了replacement_formula:或replacement_cask:消息末尾会附上Replacement: brew install 替代包注意message中替代包一行的写法由replacement_with_type决定替代 formula 显示为brew install --formula 名称替代 cask 显示为brew install --cask 名称两者同名时不加修饰词。所以验证时看到的提示行与参数值不完全逐字相同属于正常现象。提交前还可以用brew audit --new --formula formula跑一遍检查BrewTestBot 对新提交的自动化构建会执行同样的检查用于发现包括弃用声明在内的更多潜在问题brew audit --strict --online则用于检查对 Homebrew house style 的遵循情况。后续义务与自动删除弃用和禁用不是终点文档对后续行为有明确要求被弃用的 formula 应继续维护保证仍能从源码构建、bottle 继续可用若做不到应改为禁用。被弃用的 cask 只要仍可以安装就应继续维护否则应立即禁用。被弃用或禁用超过一年的条目应当删除homebrew/core中被禁用的 formula 和homebrew/cask中被禁用的 cask 会在禁用日期满一年后自动删除DeprecateDisable 模块 中的REMOVE_DISABLED_TIME_WINDOW 12月与此规则对应。不受欢迎的包可以直接禁用并在禁用日期 3 个月后手动删除。注意Homebrew 自身代码不走 deprecate! / disable!如果你的对象是 Homebrew 自己的代码Ruby 方法、CLI 参数、环境变量文档规定使用另一套机制odeprecated/odisabled而不是包文件里的deprecate!/disable!DSL。两者不要混用——deprecate!/disable!只用于 formula 和 cask 的包文件。相关文档Deprecating, Disabling and Removing三阶段生命周期、判断标准与代码弃用机制的完整说明Formula Cookbookformula 写法其中Deprecating and disabling a formula一节指向上面的生命周期文档Cask Cookbookdeprecate!/disable!语段的date:、because:、replacement_*:参数细节DeprecateDisable 模块预置原因符号到提示文案的映射以及消息拼装逻辑【免费下载链接】brew The Package Manager for Everywhere项目地址: https://gitcode.com/GitHub_Trending/br/brew创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考