如何在自制程序中安装特定版本的公式?例如,postgresql-8.4.4而不是最新的9.0。


当前回答

大多数其他答案现在已经过时了。不幸的是,Homebrew仍然没有内置的方式来安装过时的版本,除非该版本作为一个单独的公式(例如。python@2, postgresql@9.4 …).

幸运的是,对于其他公式,有一种比过去需要的复杂混乱更容易的方法。以下是完整的说明:

在日志中搜索正确的版本:酿造对数公式#使用j/k或箭头键向下/向上滚动#或使用例如/4\.4\.23搜索特定版本#此语法仅适用于2.0之前的Homebrew版本brew log--format=格式:%H\%s-F--grep=♥版本›♥公式›这将显示提交哈希列表。选择一个合适的(通常应该非常明显,并且通常是最近的(即最上面的)。查找公式在上游存储库中驻留的URL:brew info♥formula›|grep^发件人:修复URL:将github.com替换为raw.githubusercontent.com用我们在第一步中找到的提交哈希替换blob/master。通过用提交哈希替换先前找到的URL中的master来安装所需版本,例如:brew安装https://raw.githubusercontent.com/Homebrew/homebrew-core/♥哈希›/公式/♥公式›.rb

(最后一步可能需要在之前运行brew unlink♥formula›。)


如果复制了要使用的提交哈希,可以使用类似于此示例的方法安装该版本,用提交哈希和所需公式替换值和bash。

BREW_VERSION_SHA=32353d2286f850fd965e0a48bcf692b83a6e9a41
BREW_FORMULA_NAME=bash
brew info $BREW_FORMULA_NAME \
| sed -n \
    -e '/^From: /s///' \
    -e 's/github.com/raw.githubusercontent.com/' \
    -e 's%blob/%%' \
    -e "s/master/$BREW_VERSION_SHA/p" \
| xargs brew install

这个示例安装的是bash 4.4.23而不是bash 5,但如果您随后执行了brew升级,则bash 5将安装在顶部,除非您首先执行了brew-pin bash。相反,为了在没有固定的情况下更流畅,您应该首先使用brew install bash安装最新版本,然后使用brew unlink bash,然后按照上面的脚本安装所需的旧版本,然后用brew switch bash 4.4.23设置到旧版本的符号链接。现在,brew升级不会影响您的Bash版本。您可以编写switch bash以获取可切换到的版本列表。


另一种选择是使用自定义的仅本地抽头

实现相同目标的另一种方式似乎是:

brew tap-new username/repo-name
# extract with a version seems to run a grep under the hood
brew extract --version='4.4.23' bash username/repo-name
brew install bash@4.4.23
# Note this "fails" when trying to grab a bottle for the package and seems to have
# some odd doubling of the version in that output, but this isn't fatal.

这将创建formula@version在您可以按照上面的示例安装的自定义抽头中。缺点是您可能仍然需要编写unlink bash,然后编写linkbash@4.4.23以便使用特定版本的Bash或任何其他公式。

其他回答

自那以后,一个更新的答案补充了@lance pollard已经发布的有效答案。

如何安装特定版本的公式(本示例中使用的公式为地形):

查找公式文件,例如:https://github.com/Homebrew/homebrew-core/blob/master/Formula/terraform.rb使用获取github历史记录中的提交版本https://github.com/Homebrew/homebrew-core/commits/master/Formula/terraform.rb或git-log-master--Formula/traform.rb(如果您在本地克隆了repo)。获取带有公式提交版本的原始gitURL:如果github.com中的公式链接是https://github.com/Homebrew/homebrew-core/blob/e4ca4d2c41d4c1412994f9f1cb14993be5b2c59a/Formula/terraform.rb,原始URL将为:https://raw.githubusercontent.com/Homebrew/homebrew-core/e4ca4d2c41d4c1412994f9f1cb14993be5b2c59a/Formula/terraform.rb使用:brew Install安装https://raw.githubusercontent.com/Homebrew/homebrew-core/e4ca4d2c41d4c1412994f9f1cb14993be5b2c59a/Formula/terraform.rb

家庭酿造最近发生了变化。以前有用的东西现在不管用了。我发现最简单的工作方式(2021 1月)是:

找到我的软件的.rb文件(首先转到公式,找到我需要的文件,然后单击“历史”;对于CMake,这是在https://github.com/Homebrew/homebrew-core/commits/master/Formula/cmake.rb)从修订中选择所需版本,例如3.18.4,单击.rb文件diff(…)右上角的三个点,然后单击Raw。复制URL。取消链接旧版本brew取消链接cmake直接从gitURL安装不再有效(brew-installhttps://raw.githubusercontent.com/Homebrew/homebrew-core/2bf16397f163187ae5ac8be41ca7af25b5b2e2cc/Formula/cmake.rb将失败)相反,下载它并从本地文件curl-O安装https://raw.githubusercontent.com/Homebrew/homebrew-core/2bf16397f163187ae5ac8be41ca7af25b5b2e2cc/Formula/cmake.rb&&brew安装/克马克.rb

瞧!现在可以删除下载的.rb文件。

TLDR:brew安装postgresql@8.4.4有关更多详细信息,请参阅下面的答案。


*(我已经重新编辑了我的答案,以便为安装/使用自制软件的旧版本提供更全面的工作流程。如果您发现旧版本更好,请随时添加备注。)

让我们从最简单的案例开始:

1) 检查版本是否已安装(但未激活)

当自制程序安装一个新公式时,它会将其放在版本化的目录中,如/usr/local/Cellar/postgresql/9.3.1。然后,仅全局安装指向此文件夹的符号链接。原则上,这使得在两个已安装版本之间切换非常容易。(*)

如果您使用自制程序的时间较长,并且从未删除过旧版本(例如,使用brew cleanup),那么您的程序的某些旧版本可能仍然存在。如果您想简单地激活以前的版本,brew开关是最简单的方法。

使用brew-info-postgresql(或brew-switch-postgresql<TAB>)检查是否安装了旧版本:

$ brew info postgresql
postgresql: stable 9.3.2 (bottled)
http://www.postgresql.org/
Conflicts with: postgres-xc
/usr/local/Cellar/postgresql/9.1.5 (2755 files, 37M)
  Built from source
/usr/local/Cellar/postgresql/9.3.2 (2924 files, 39M) *
  Poured from bottle
From: https://github.com/Homebrew/homebrew/commits/master/Library/Formula/postgresql.rb
# … and some more

我们看到已经安装了一些旧版本。我们可以使用brew开关激活它:

$ brew switch postgresql 9.1.5
Cleaning /usr/local/Cellar/postgresql/9.1.5
Cleaning /usr/local/Cellar/postgresql/9.3.2
384 links created for /usr/local/Cellar/postgresql/9.1.5

让我们仔细检查激活的内容:

$ brew info postgresql
postgresql: stable 9.3.2 (bottled)
http://www.postgresql.org/
Conflicts with: postgres-xc
/usr/local/Cellar/postgresql/9.1.5 (2755 files, 37M) *
  Built from source
/usr/local/Cellar/postgresql/9.3.2 (2924 files, 39M)
  Poured from bottle
From: https://github.com/Homebrew/homebrew/commits/master/Library/Formula/postgresql.rb
# … and some more

请注意,星号*已移至新激活的版本

(*)请注意,brew开关仅在旧版本的所有依赖项仍然存在的情况下工作。在某些情况下,可能需要重建旧版本。因此,当想要在两个相距不太远的版本之间切换时,使用brew开关最有用。

2) 检查版本是否可用

特别是对于大型软件项目,很可能对某个软件的几个(可能不兼容API)主要版本有足够高的需求。截至2012年3月,Homebrew 0.9提供了一种机制:brew tap和自制版本存储库。

该版本存储库可能包含多个公式的旧版本的后端。(大多数只有大型和著名的,但当然,它们也有几个postgresql公式。)

brew search postgresql将向您显示查找位置:

$ brew search postgresql
postgresql
homebrew/versions/postgresql8    homebrew/versions/postgresql91
homebrew/versions/postgresql9    homebrew/versions/postgresql92

我们可以通过键入

$ brew install homebrew/versions/postgresql8
Cloning into '/usr/local/Library/Taps/homebrew-versions'...
remote: Counting objects: 1563, done.
remote: Compressing objects: 100% (943/943), done.
remote: Total 1563 (delta 864), reused 1272 (delta 620)
Receiving objects: 100% (1563/1563), 422.83 KiB | 339.00 KiB/s, done.
Resolving deltas: 100% (864/864), done.
Checking connectivity... done.
Tapped 125 formula
==> Downloading http://ftp.postgresql.org/pub/source/v8.4.19/postgresql-8.4.19.tar.bz2
# …

请注意,这已经自动点击自制程序/版本。(使用brew tap进行检查,使用brew untap自制程序/版本进行删除。)以下内容等效:

$ brew tap homebrew/versions
$ brew install postgresql8

只要后端口版本公式保持最新,这种方法可能是处理旧软件的最佳方法。

3) 尝试一些过去的公式

列出以下方法主要是为了完整性。两人都试图从酿造库中复活一些不死配方。由于依赖关系的改变,公式规范中的API改变,或者下载URL的改变,事情可能会发生,也可能不会发生。

由于整个公式目录是一个git存储库,因此可以使用普通的git命令安装特定版本。然而,我们需要找到一种方法,在旧版本可用的地方进行提交。

a) 历史性时代

在2011年8月至2014年10月期间,自制程序有一个brew版本命令,它会将所有可用版本与各自的SHA散列一起输出。从2014年10月起,你必须在使用之前先自制/装骨机。正如水龙头的名称所暗示的,你可能只能在万不得已的情况下这样做。

E.g.

$ brew versions postgresql
Warning: brew-versions is unsupported and may be removed soon.
Please use the homebrew-versions tap instead:
  https://github.com/Homebrew/homebrew-versions
9.3.2    git checkout 3c86d2b Library/Formula/postgresql.rb
9.3.1    git checkout a267a3e Library/Formula/postgresql.rb
9.3.0    git checkout ae59e09 Library/Formula/postgresql.rb
9.2.4    git checkout e3ac215 Library/Formula/postgresql.rb
9.2.3    git checkout c80b37c Library/Formula/postgresql.rb
9.2.2    git checkout 9076baa Library/Formula/postgresql.rb
9.2.1    git checkout 5825f62 Library/Formula/postgresql.rb
9.2.0    git checkout 2f6cbc6 Library/Formula/postgresql.rb
9.1.5    git checkout 6b8d25f Library/Formula/postgresql.rb
9.1.4    git checkout c40c7bf Library/Formula/postgresql.rb
9.1.3    git checkout 05c7954 Library/Formula/postgresql.rb
9.1.2    git checkout dfcc838 Library/Formula/postgresql.rb
9.1.1    git checkout 4ef8fb0 Library/Formula/postgresql.rb
9.0.4    git checkout 2accac4 Library/Formula/postgresql.rb
9.0.3    git checkout b782d9d Library/Formula/postgresql.rb

正如你所看到的,它建议不要使用它。Homebrew用它的内部启发式方法吐出了它能找到的所有版本,并向你展示了一种检索旧公式的方法。让我们试试看。

# First, go to the homebrew base directory
$ cd $( brew --prefix )
# Checkout some old formula
$ git checkout 6b8d25f Library/Formula/postgresql.rb
$ brew install postgresql
# … installing

现在安装了旧的postgresql版本,我们可以重新安装最新的公式,以保持存储库的清洁:

$ git checkout -- Library/Formula/postgresql.rb

brew switch是你在新旧之间转换的朋友。

b) 史前时代

对于特殊需求,我们也可以尝试自己通过自制回购进行挖掘。

$ cd Library/Taps/homebrew/homebrew-core && git log -S'8.4.4' -- Formula/postgresql.rb

gitlog-S查找文件Library/Taps/homebrew/homebrew core/Formula/postgresql.rb中添加或删除了字符串“8.4.4”的所有提交。结果得到两次提交。

commit 7dc7ccef9e1ab7d2fc351d7935c96a0e0b031552
Author: Aku Kotkavuo
Date:   Sun Sep 19 18:03:41 2010 +0300

    Update PostgreSQL to 9.0.0.

    Signed-off-by: Adam Vandenberg

commit fa992c6a82eebdc4cc36a0c0d2837f4c02f3f422
Author: David Höppner
Date:   Sun May 16 12:35:18 2010 +0200

    postgresql: update version to 8.4.4

显然,fa992c6a82eebdc4cc36a0c0d2837f4c02f3f422是我们感兴趣的提交。由于这个提交很旧,我们将尝试降级完整的自制程序安装(这样,公式API或多或少保证有效):

$ git checkout -b postgresql-8.4.4 fa992c6a82eebdc4cc36a0c0d2837f4c02f3f422
$ brew install postgresql
$ git checkout master
$ git branch -d postgresql-8.4.4

您可以跳过最后一个命令,将引用保存在git存储库中。

一个注意事项:在检查旧的提交时,您会暂时降级自制程序的安装。因此,您应该小心,因为自制程序中的某些命令可能与最新版本不同。

4) 手动编写公式

这并不太难,然后您可以将其上传到自己的存储库中。以前是自制版本,但现在已经停产。

A.)奖金:固定

如果你想保留的某个版本,比如postgresql,在你进行自然酿造更新时停止更新;brew升级程序,您可以固定公式:

$ brew pin postgresql

固定公式列在/usr/local/Library/PinnedKegs/中,一旦您希望引入最新的更改和更新,就可以再次取消固定:

$ brew unpin postgresql

简单工作流

现在Homebrew/versions已经被弃用,Homebrew/core支持一些具有新命名格式的公式版本。

要安装特定版本,例如postgresql 9.5,只需运行:

$ brew install postgresql@9.5

要列出可用版本,请使用@进行搜索:

$ brew search postgresql@
==> Searching local taps...
postgresql@10.1 ✔     postgresql@9.4        postgresql@9.5        postgresql@9.6

目前,安装特定公式版本的旧方法已被弃用。因此,我们似乎必须使用brew edit[公式]。例如,假设我们要安装icu4c的62.1版本(例如postgresql10.5需要)

> brew edit icu4c
# drops you to editor

在这里,您必须将url、version和sha256(可能也是镜像)更改为相应的62.1字符串。

url "https://ssl.icu-project.org/files/icu4c/62.1/icu4c-62_1-src.tgz"
mirror "https://github.com/unicode-org/icu/releases/download/release-62-1/icu4c-62_1-src.tgz"
version "62.1"
sha256 "3dd9868d666350dda66a6e305eecde9d479fb70b30d5b55d78a1deffb97d5aa3"

然后运行brew重新安装icu4c,最终下载62.1版本。