Homebrew安装特定版本的软件包

Homebrew安装特定版本的软件包

技术背景

在使用Homebrew管理软件包时,有时需要安装特定版本的软件,而非最新版本。可能是因为软件的新版本存在兼容性问题,或者某些功能只在旧版本中可用。本文将介绍多种在Homebrew中安装特定版本软件包的方法。

实现步骤

1. 检查该版本是否已安装但未激活

当Homebrew安装新的软件包时,会将其放在带版本号的目录中,如/usr/local/Cellar/postgresql/9.3.1,只有指向该文件夹的符号链接会被全局安装。因此,若之前使用Homebrew安装过软件且未清理旧版本,可使用brew switch激活旧版本。

1
2
3
4
# 检查旧版本是否已安装
brew info postgresql
# 激活旧版本
brew switch postgresql 9.1.5

2. 检查该版本是否作为tap可用

对于大型软件项目,可能有多个(可能API不兼容)主要版本的需求。Homebrew 0.9提供了brew taphomebrew versions仓库机制。

1
2
3
4
# 搜索可用版本
brew search postgresql
# 安装特定版本
brew install homebrew/versions/postgresql8

3. 尝试使用过去的配方

a) 历史时期(2011年8月 - 2014年10月)

此期间Homebrew有brew versions命令,可列出所有可用版本及其对应的SHA哈希值。2014年10月后,需先执行brew tap homebrew/boneyard

1
2
3
4
5
6
7
8
9
10
# 列出可用版本
brew versions postgresql
# 进入Homebrew基础目录
cd $(brew --prefix)
# 检出旧配方
git checkout 6b8d25f Library/Formula/postgresql.rb
# 安装旧版本
brew install postgresql
# 恢复最新配方
git checkout -- Library/Formula/postgresql.rb

b) 史前时期

可手动在Homebrew仓库中查找特定版本的提交。

1
2
3
4
5
6
7
8
9
10
# 查找包含特定版本字符串的提交
cd Library/Taps/homebrew/homebrew-core && git log -S'8.4.4' -- Formula/postgresql.rb
# 检出特定提交
git checkout -b postgresql-8.4.4 fa992c6a82eebdc4cc36a0c0d2837f4c02f3f422
# 安装旧版本
brew install postgresql
# 恢复到主分支
git checkout master
# 删除分支
git branch -d postgresql-8.4.4

4. 手动编写配方

可参考文档手动编写配方并上传到自己的仓库。

5. 使用新命名格式安装特定版本

现在Homebrew/core支持使用新命名格式安装特定版本。

1
2
3
4
# 安装特定版本
brew install [email protected]
# 列出可用版本
brew search postgresql@

6. 脚本化方法(推荐)

以安装旧版本bash 4.4.23为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 导出搜索版本和公式名称
export BREW_FORMULA_SEARCH_VERSION=4.4.23 BREW_FORMULA_NAME=bash
# 查找匹配的提交
git -C $(brew --repo homebrew/core) log \
--format=format:%H\ %s -F --all-match \
--grep=$BREW_FORMULA_SEARCH_VERSION --grep=$BREW_FORMULA_NAME
# 获取最新提交的SHA
export BREW_FORMULA_VERSION_SHA=$(git -C $(brew --repo homebrew/core) log \
--format=format:%H\ %s -F --all-match \
--grep=$BREW_FORMULA_SEARCH_VERSION --grep=$BREW_FORMULA_NAME | \
head -1 | awk '{print $1}')
# 安装特定版本
brew info $BREW_FORMULA_NAME \
| sed -n \
-e '/^From: /s///' \
-e 's/github.com/raw.githubusercontent.com/' \
-e 's%blob/%%' \
-e "s/master/$BREW_FORMULA_VERSION_SHA/p" \
| xargs brew install

7. 替代方法:使用自定义本地tap

1
2
3
4
5
6
# 创建自定义tap
brew tap-new username/repo-name
# 提取特定版本的公式
brew extract --version='4.4.23' bash username/repo-name
# 安装特定版本
brew install [email protected]

核心代码

以下是使用脚本化方法安装特定版本软件包的核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 导出搜索版本和公式名称
export BREW_FORMULA_SEARCH_VERSION=4.4.23 BREW_FORMULA_NAME=bash
# 查找匹配的提交
git -C $(brew --repo homebrew/core) log \
--format=format:%H\ %s -F --all-match \
--grep=$BREW_FORMULA_SEARCH_VERSION --grep=$BREW_FORMULA_NAME
# 获取最新提交的SHA
export BREW_FORMULA_VERSION_SHA=$(git -C $(brew --repo homebrew/core) log \
--format=format:%H\ %s -F --all-match \
--grep=$BREW_FORMULA_SEARCH_VERSION --grep=$BREW_FORMULA_NAME | \
head -1 | awk '{print $1}')
# 安装特定版本
brew info $BREW_FORMULA_NAME \
| sed -n \
-e '/^From: /s///' \
-e 's/github.com/raw.githubusercontent.com/' \
-e 's%blob/%%' \
-e "s/master/$BREW_FORMULA_VERSION_SHA/p" \
| xargs brew install

最佳实践

  • 在安装特定版本前,先备份重要数据,以防安装过程中出现问题。
  • 使用brew pin固定特定版本,防止在brew upgrade时被更新。
1
2
3
4
# 固定特定版本
brew pin postgresql
# 取消固定
brew unpin postgresql

常见问题

1. brew switch不可用

brew switch在HomeBrew 2.7.0中已被禁用,可使用其他方法安装特定版本。

2. 从GitHub提交URL安装失败

现在从GitHub提交URL安装软件包可能会失败,可尝试下载.rb文件并从本地安装。

1
2
3
4
# 下载.rb文件
curl -O https://raw.githubusercontent.com/Homebrew/homebrew-core/2bf16397f163187ae5ac8be41ca7af25b5b2e2cc/Formula/cmake.rb
# 从本地安装
brew install ./cmake.rb

3. 安装过程中出现依赖问题

若安装过程中出现依赖问题,可尝试先安装缺失的依赖,或使用brew install --ignore-dependencies忽略依赖安装,但这可能会导致软件无法正常运行。


Homebrew安装特定版本的软件包
https://119291.xyz/posts/2025-05-12.homebrew-install-specific-version-of-formula/
作者
ww
发布于
2025年5月12日
许可协议