Homebrew 下载软件的指定版本

警告
本文最后更新于 2023-04-19,文中内容可能已过时。

使用 Homebrew 安装软件真的是非常方便,但有的时候,我们对软件版本有要求,需要安装「特定版本」的软件,这篇博文就是解决「Homebrew 下载软件的指定版本」的问题。

认识 Homebrew 的 formula

Homebrew 中的每个软件包都是通过一个 formula.rb 文件来配置软件的源代码URL、依赖、编译规则和选项,例如以下是 Hugo 的formula文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Hugo < Formula
  desc "Configurable static site generator"
  homepage "https://gohugo.io/"
  url "https://github.com/gohugoio/hugo/archive/v0.111.3.tar.gz"
  sha256 "b6eeb13d9ed2e5d5c6895bae56480bf0fec24a564ad9d17c90ede14a7b240999"
  license "Apache-2.0"
  head "https://github.com/gohugoio/hugo.git", branch: "master"

  bottle do
    sha256 cellar: :any_skip_relocation, arm64_ventura:  "0da8e425f1c972eaa3640d4a986433f68e44786d64269e2c04c7eb5ad4c64a52"
    sha256 cellar: :any_skip_relocation, arm64_monterey: "08081951ae2e96f4d896fdc33db305721e726c39b2f3ba2f13a3d72cb31dd678"
    sha256 cellar: :any_skip_relocation, arm64_big_sur:  "6a2a4f19657b8c04783f7529d3005dd8e82a577ad4c7165b39242da0d2e57760"
    sha256 cellar: :any_skip_relocation, ventura:        "18961b27d03817073a645ba7849bd8d01dc6fab51be265b13ee146decdb28499"
    sha256 cellar: :any_skip_relocation, monterey:       "5407b21bc5113d5fe8c109b1e15e8fbd28b25779fda14797826c192ab4580210"
    sha256 cellar: :any_skip_relocation, big_sur:        "74df6ca6822c77a3c84c90315dd9bc7fc5dd884f4308b67ba25a1e48ed8106a9"
    sha256 cellar: :any_skip_relocation, x86_64_linux:   "0e2da89876d6c10e8329735e0c4db8190a5aeae3e93d4df911f674a94ee8c5ed"
  end

  depends_on "go" => :build

  def install
    system "go", "build", *std_go_args(ldflags: "-s -w"), "-tags", "extended"

    generate_completions_from_executable(bin/"hugo", "completion")

    # Build man pages; target dir man/ is hardcoded :(
    (Pathname.pwd/"man").mkpath
    system bin/"hugo", "gen", "man"
    man1.install Dir["man/*.1"]
  end

  test do
    site = testpath/"hops-yeast-malt-water"
    system "#{bin}/hugo", "new", "site", site
    assert_predicate testpath/"#{site}/config.toml", :exist?
  end
end
~
~
"/opt/homebrew/Library/Taps/homebrew/homebrew-core/Formula/hugo.rb" 37L, 1736B

这是一个 ruby 文件,我们可能不懂 ruby,不过无所谓:

  1. deschomepage都是描述性信息,不对软件安装产生什么影响。
  2. url是软件源代码的位置,编译安装时从此位置将源代码下载下来。
  3. sha256是源代码包的校验码,这是保证下载下来的包不被篡改。
  4. bottle记录了各版本 macOS 下预编译的二进制包的校验码,这部分内容是 Homebrew 的自动集成工具自动维护的,我们并不需要编辑修改。

更改上面的urlsha256,即可将formula的配置更新到任意版本。编辑好后,使用brew install或者brew upgrade进行安装或者更新升级。

下载指定版本

步骤一:前往homebrew-core/Formula · Homebrew 官方仓库,找到你要下载的文件,比如 Hugo: 1

步骤二:点击https://github.com/Homebrew/homebrew-core/blob/master/Formula/hugo.rb,前往 History 寻找历史版本: 2

步骤三:找到想要的版本,替换urlsha256到本地 formula 文件: 3

使用brew edit hugo即可编辑本地 formula 文件,之后brew install hugo就下载到对应版本的文件啦~

这种方式很方便,但是如果 History 中没有想要的版本就无能为力了。
实际上,Homebrew 是通过 Git 来管理 formula 配置文件的,因此如果 Git 仓库中没有我们想要的版本,可以自行制作 formula 文件后提交到 Git 仓库,让别人也能够方便地更新软件包。

自己动手制作 formula.rb 文件

这部分以更新gdal到2.3.0版本为例,来说明手动更新 formula 的步骤。(由于版本随时间变化,大家以理解为主)

编辑配置

使用brew edit gdal即可打开gdal.rb开始编辑,我们将url更新为2.3.0版本的源代码链接:

1
2
3
4
5
6
7
8
class Gdal < Formula
  desc "Geospatial Data Abstraction Library"
  homepage "http://www.gdal.org/"
  url "https://download.osgeo.org/gdal/2.3.0/gdal-2.3.0.tar.xz"
  sha256 "6f75e49aa30de140525ccb58688667efe3a2d770576feb7fbc91023b7f552aa2"
  revision 2

  ...

理论上我们还需要更新sha256,使它和url相匹配。但是sha256需要我们使用工具计算或者从发布网站上找,不是很方便。我们可以通过下一步的安装调试,来自动计算sha256

安装调试

使用brew install gdal --verbose --debug --build-from-source来安装调试 gdal 的 formula。

注意
如果已经安装旧版本的gdal,命令改为:brew upgrade gdal --verbose --debug --build-from-source

命令解读:

  • --verbose表示显示详细输出,便于调试;
  • --debug打开调试;
  • --build-from-source强制从源代码编译。

由于在上一步我们并没有修改sha256,所以在安装过程中,会报sha256校验码不匹配的警告,并打印出url所指向的源代码包的sha256校验值

这时我们拿到了正确的sha256校验值,重新使用brew edit gdal打开并编辑 formula 文件,将sha256更改为正确的校验值。

最后,再安装调试,经过漫长的编译,成功地安装上了gdal的最新版本。(使用源代码编译,很耗时)

测试

测试包括对「软件包」的测试和对「formula文件」的测试。

使用brew test gdal可以测试 gdal 的功能是否正常,

使用brew audit --strict gdal测试 formula 文件是否正确。

推送更新

通过上述步骤,我们完成了 gdal 的手动更新,如果将更新推送到 Homebrew 的线上库中,那么其他人就可以方便地更新到最新版本。此外,推送到线上库后,homebrew的自动集成工具会自动地编译生成二进制包,这样就不需要从源代码编译那么耗时了,可谓是利人利己。

由于homebrew是在GitHub上协作的,所以更新一个formula就和发一个Pull request是一样的,基本步骤如下:

  1. 使用cd $(brew --repository homebrew/homebrew-core)切换到本地的 homebrew-core 目录;
  2. 使用git commit提交自己的修改;
  3. https://github.com/Homebrew/homebrew-core fork 一份;
  4. 使用git remote add命令添加自己的 fork 的 homebrew-core 库;
  5. 使用git push推送将本地提交推送到自己的 fork 的 homebrew-core 库中;
  6. 在 GitHub 网页上发起 Pull request。

一键更新

上面一步步完成了编辑配置、安装调试、测试、推送更新,操作起来有些繁琐。但其实homebrew还提供了一个工具,能够一键完成上面4个步骤,命令如下:

1
brew bump-formula-pr gdal --URL=https://download.osgeo.org/gdal/2.3.0/gdal-2.3.0.tar.xz --audit --strict

brew bump-formula-pr 可以自动修改 formula 配置文件、检查文件错误、提交并推送更新,其中提交并推送更新的过程需要使用 hub 来在终端上操作 GitHub,可以使用brew install hub来安装这个工具。


更多超好用的命名行工具教程:各种超好用的命名行工具 - 腐蚀脚本

转载声明:本文允许转载,原文链接:Homebrew 下载软件的指定版本 - 腐蚀脚本


参考:

  1. https://jingsam.github.io/2018/05/23/edit-a-brew-formula.html
  2. https://networm.me/2019/10/27/installing-old-homebrew-formulas/#commento-login-box-container
Buy me a coffee~
室长 支付宝支付宝
室长 微信微信
0%