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 tap
和homebrew 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
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支持使用新命名格式安装特定版本。
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
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
| 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
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
| curl -O https://raw.githubusercontent.com/Homebrew/homebrew-core/2bf16397f163187ae5ac8be41ca7af25b5b2e2cc/Formula/cmake.rb
brew install ./cmake.rb
|
3. 安装过程中出现依赖问题
若安装过程中出现依赖问题,可尝试先安装缺失的依赖,或使用brew install --ignore-dependencies
忽略依赖安装,但这可能会导致软件无法正常运行。