Homebrew 降级安装指定版本应用

总是习惯性地把所有软件都更新到最新,然后在写博客的时候发现,Hugo 更新后,本地运行出问题了。

ERROR deprecated: site config key paginate was deprecated in Hugo v0.128.0 and subsequently removed. Use pagination.pagerSize instead.
ERROR deprecated: resources.ToCSS was deprecated in Hugo v0.128.0 and subsequently removed. Use css.Sass instead.
ERROR deprecated: .Site.IsMultiLingual was deprecated in Hugo v0.124.0 and subsequently removed. Use hugo.IsMultilingual instead.
ERROR deprecated: .Site.Author was deprecated in Hugo v0.124.0 and subsequently removed. Implement taxonomy 'author' or use .Site.Params.Author instead.

从报错提示来看,就是 Hugo 更新搞出了 breaking changes,升级后直接一些把字段和方法移除掉了。一开始看它的提示,还很贴心地给出替代的字段,然后直接简单替换后发现,跑不起来,并不是那么简单替换就行。于是只能把 Hugo 的版本降回原来的版本。

具体操作如下

  1. brew info hugo. 找出需要降级应用所在的 repo 和路径
    1. 我这里用了镜像,原始的 repo 在 GitHub 上
  2. 到 GitHub 上找到对应 repo 的对应文件
    1. 路径可以参考 https://github.com/Homebrew/homebrew-core/blob/master/Formula/h/hugo.rb
  3. 找这个文件的提交历史,找到需要降级版本的提交 id
    1. 根据 commit 的 id 可以判断出来版本,是由 bot BrewTestBot 提交的
  4. 拿到 commit id 后可以拿到这个安装文件的 url,同时也可以拿到文件的内容
    1. https://github.com/Homebrew/homebrew-core/blob/2fd8dba871a6a5412fa7c00b12ac99b5738cd199/Formula/h/hugo.rb
    2. https://raw.githubusercontent.com/Homebrew/homebrew-core/2fd8dba871a6a5412fa7c00b12ac99b5738cd199/Formula/h/hugo.rb
    3. 把 commit id 和 app 的名字替换一下就可以了
  5. 按照网上看到的办法,可以直接根据 url 来安装 brew install url
    1. 但实际试了一把后发现,会报错 Error: Non-checksummed download of hugo formula file from an arbitrary URL is unsupported! brew extract or brew create and brew tap-new to create a formula file in a tap on GitHub instead.
  6. 于是直接把文件内容 copy 下来保存到本地,然后 brew install ./hugo.rb,安装成功

brew 应用降级成功之后,可以通过 brew pin hugo 锁定版本,避免后续又把它升级了。


在通过 install url 失败之后,又看到一个办法可以降级,看着也很可行,但是构建脚本本地执行的时候出错了,也可以参考下。

1
2
3
4
brew tap-new $USER/local-cmake
brew tap homebrew/core --force
brew extract --version=3.31.1 cmake $USER/local-cmake
brew install $USER/local-cmake/cmake@3.31.1

以下是 AI 的解释:

这四条 Homebrew 命令的目的是创建一个本地 tap 并安装特定版本的 CMake。我来逐条解释每个命令的作用:

1. brew tap-new $USER/local-cmake

这条命令创建一个新的 tap(软件仓库)。$USER 是当前用户名的环境变量,所以这个 tap 的名称会是 "你的用户名/local-cmake"。

  • 作用:创建一个新的本地 tap,用于存放自定义的软件包公式
  • 结果:在 $(brew --repo)/Library/Taps/$USER/homebrew-local-cmake 目录下创建一个新的 tap 结构

2. brew tap homebrew/core --force

这条命令强制重新 tap Homebrew 的核心仓库。

  • 作用:确保 homebrew/core 仓库(包含官方软件包公式的主仓库)被正确 tap,--force 参数强制执行,即使该 tap 已经存在
  • 结果:确保可以访问 homebrew/core 中的软件包公式,这是后续提取 CMake 公式所必需的

3. brew extract --version=3.31.1 cmake $USER/local-cmake

这条命令从 homebrew/core 中提取特定版本的 CMake 公式到你的本地 tap 中。

  • 作用:从官方仓库提取 CMake 3.31.1 版本的公式,并将其放入你刚创建的本地 tap 中
  • 结果:在你的本地 tap 中创建一个 cmake@3.31.1.rb 公式文件

4. brew install $USER/local-cmake/cmake@3.31.1

这条命令安装你本地 tap 中的特定版本 CMake。

  • 作用:使用刚刚提取的公式安装 CMake 3.31.1 版本
  • 结果:在你的系统上安装 CMake 3.31.1 版本