自制程序是否安装特定版本的公式?

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

答案

TLDR: brew install postgresql@8.4.4有关更多详细信息,请参见下面答案


*( 我对答案进行了重新编辑,以提供更彻底的工作流程,以便使用自制软件安装 / 使用较旧的软件版本。如果发现较旧的版本更好,请随时添加注释。

让我们从最简单的情况开始:

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

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

如果您使用 Homebrew 的时间更长,并且从未删除过旧版本(例如使用brew cleanup ),则可能是程序的某些旧版本仍然存在。如果您只想激活该先前版本,则brew switch是执行此操作的最简单方法。

使用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 switch激活它:

$ 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 switch才起作用。在某些情况下,可能需要重建较旧的版本。因此,当一个人想在相距不远的两个版本之间切换时,使用brew switch最有用。

2)检查是否可以点击该版本

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

该版本存储库可能包括一些公式的旧版本的反向移植。 (通常只有大型的和著名的,但是它们当然也会有几个 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
# …

请注意,这已自动点击homebrew/versions分接头。 (用brew tap检查,用brew untap homebrew/versions删除。)以下内容是等效的:

$ brew tap homebrew/versions
$ brew install postgresql8

只要向后移植的版本公式保持最新,此方法就可能是处理较旧软件的最佳方法。

3)尝试一些过去的公式

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

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

a)历史时期

20118 月至 2014 年 10 月之间 ,自制软件有一个brew versions命令,该命令会吐出所有可用版本及其各自的 SHA 哈希值。自 2014 年 10 月起,您必须先进行brew tap homebrew/boneyard然后才能使用它。就像水龙头的名称所暗示的那样,您可能应该只在万不得已时才这样做。

例如

$ 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

git log -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)手动编写公式

这并不难 ,您可以将其上传到自己的存储库中。曾经是Homebrew-Versions ,但现在已停产。

A.)奖金:固定

如果您想保留某个特定版本,例如 postgresql,并在进行自然brew update; brew upgrade时阻止其brew update; brew upgrade程序,您可以固定一个公式:

$ 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 switch [formula] [version]

例如,我定期在 Node.js 0.4.12 和 0.6.5 之间切换:

brew switch node 0.4.12
brew switch node 0.6.5

由于brew switch仅更改符号链接,因此速度非常快。请参阅 “ 外部命令”下 Homebrew Wiki 上的更多文档。

更新:2015 年 1 月 15 日

  • 查找所需软件和版本的提交历史记录。例如我需要从 Docker 版本 1.4.1 切换到 1.3.3: https : //github.com/Homebrew/homebrew-core/commits/master/Formula/docker.rb
  • 使用此按钮查看文件: 在此处输入图片说明
  • 单击原始按钮: 项目清单
  • 从地址栏中复制URL (在此示例中为 docker.rb url)
  • brew install <url> (可能必须先进行brew unlink ,例如brew unlink docker
  • brew switch docker 1.3.3
  • 切换回 docker 1.4.1 brew switch docker 1.4.1

从这个要点

brew update
brew versions FORMULA
cd `brew --prefix`
git checkout HASH Library/Formula/FORMULA.rb  # use output of "brew versions"
brew install FORMULA
brew switch FORMULA VERSION
git checkout -- Library/Formula/FORMULA.rb    # reset formula

## Example: Using Subversion 1.6.17
#
# $ brew versions subversion
# 1.7.3    git checkout f8bf2f3 /usr/local/Library/Formula/subversion.rb
# 1.7.2    git checkout d89bf83 /usr/local/Library/Formula/subversion.rb
# 1.6.17   git checkout 6e2d550 /usr/local/Library/Formula/subversion.rb
# 1.6.16   git checkout 83ed494 /usr/local/Library/Formula/subversion.rb
# 1.6.15   git checkout 809a18a /usr/local/Library/Formula/subversion.rb
# 1.6.13   git checkout 7871a99 /usr/local/Library/Formula/subversion.rb
# 1.6.12   git checkout c99b3ac /usr/local/Library/Formula/subversion.rb
# 1.6.6    git checkout 8774131 /usr/local/Library/Formula/subversion.rb
# 1.6.5    git checkout a82e823 /usr/local/Library/Formula/subversion.rb
# 1.6.3    git checkout 6b6d369 /usr/local/Library/Formula/subversion.rb
# $ cd `brew --prefix`
# $ git checkout 6e2d550 /usr/local/Library/Formula/subversion.rb
# $ brew install subversion
# $ brew switch subversion 1.6.17
# $ git checkout -- Library/Formula/subversion.rb

按照 @halfcube 的建议,这确实非常有效:

  1. https://github.com/Homebrew/homebrew-core/tree/master/Formula 中找到您要查找的库
  2. 单击它: https : //github.com/Homebrew/homebrew-core/blob/master/Formula/postgresql.rb
  3. 单击 “历史记录” 按钮以查看旧提交: https : //github.com/Homebrew/homebrew-core/commits/master/Formula/postgresql.rb
  4. 单击您想要的一个:“postgresql:将版本更新到 8.4.4”, https://github.com/Homebrew/homebrew-core/blob/8cf29889111b44fd797c01db3cf406b0b14e858c/Formula/postgresql.rb
  5. 单击 “原始” 链接: https : //raw.githubusercontent.com/Homebrew/homebrew-core/8cf29889111b44fd797c01db3cf406b0b14e858c/Formula/postgresql.rb
  6. brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/8cf29889111b44fd797c01db3cf406b0b14e858c/Formula/postgresql.rb

我发现了比其他复杂解决方案更好的替代解决方案。

brew install https://raw.github.com/Homebrew/homebrew-versions/master/postgresql8.rb

这将下载并安装 PostgreSQL 8.4.8


我通过开始遵循在仓库中搜索仓库和评论的步骤找到了解决方案。

经过一番研究后,发现有人收集了一些稀有配方奶粉。


如果您正在寻找 MySQL 5.1.x,请尝试一下。

brew install https://raw.github.com/Homebrew/homebrew-versions/master/mysql51.rb

您可以使用识别公式的策略以及公式历史记录中与您要安装的软件包版本匹配的特定提交。

  1. 转到https://github.com/Homebrew/homebrew-core

  2. 按键盘上的t激活文件查找器。

  3. 确定一个看起来最相关的公式: Formula/mysql.rb ,将您带到 forumla 文件位置: https : //github.com/Homebrew/homebrew-core/blob/master/Formula/mysql.rb

  4. 通过单击 “ History按钮查看修订历史History ,该按钮位于https://github.com/Homebrew/homebrew-core/commits/master/Formula/mysql.rb 。如果您对 MySQL 5.7.10 感兴趣,则可能要单击 5.7.11 之前的最新版本,该版本导航到 GitHub 提交:

    https://github.com/Homebrew/homebrew-core/commit/c77882756a832ac1d87e7396c114158e5619016c#Formula/mysql.rb

注意:如果未在浏览器中加载提交历史记录,则可能必须根据 GitHub 的建议在控制台中查看提交历史记录。如果您有兴趣在 GitHub 上查看该提交,请在 URL 中替换上面的提交 SHA。或者,跳到下面的步骤 7。

  1. 应用提交后,单击 “查看” 按钮以查看 mysql.rb 文件的源。

  2. 然后单击 “原始” 按钮以查看原始源。

  3. 复制 URL。另外,您也可以使用mysql.rb文件名自己构建 URL,以标识您的公式和该公式的特定版本(由以下 URL 中的 COM 标识)。

    https://raw.githubusercontent.com/Homebrew/homebrew-core/c77882756a832ac1d87e7396c114158e5619016c/Formula/mysql.rb

  4. 使用$ brew install [URL from step 7]安装它$ brew install [URL from step 7]

    $ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/c77882756a832ac1d87e7396c114158e5619016c/Formula/mysql.rb

注意:此答案已更新,以说明删除了 braumeister.org 网站。遵循相同的原则,braumeister 只是提供了一种初学者友好的方式来浏览公式版本。

我只使用 Homebrew 返回 Maven 2.2.1,因为简单的brew install maven安装了 Maven 3.0.3。

首先,您必须将 Maven 目录留在那里

$ brew unlink maven

使用酿造水龙头命令

$ brew tap homebrew/versions
Cloning into '/usr/local/Library/Taps/homebrew-versions'...
remote: Counting objects: 590, done.
remote: Compressing objects: 100% (265/265), done.
remote: Total 590 (delta 362), reused 549 (delta 325)
Receiving objects: 100% (590/590), 117.49 KiB | 79 KiB/s, done.
Resolving deltas: 100% (362/362), done.
Tapped 50 formula

现在,您可以安装 maven2 公式:

$ brew install maven2
==> Downloading http://www.apache.org/dist/maven/maven-2/2.2.1/binaries/apache-maven-2.2.1-bin.tar.gz
######################################################################## 100.0%
/usr/local/Cellar/maven2/2.2.1: 10 files, 3.1M, built in 6 seconds
$ mvn --version
Apache Maven 2.2.1 (r801777; 2009-08-06 12:16:01-0700)
Java version: 1.6.0_37
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: en_US, platform encoding: MacRoman
OS name: "mac os x" version: "10.7.4" arch: "x86_64" Family: "mac"

编辑:您也可以只将brew switch maven 2.2.1切换为其他版本。

编辑: Apache Maven 项目重组了他们的仓库。更新了此答案以说明此更改。

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

幸运的是,对于其他公式,有一种比过去必不可少的混乱麻烦的方法。以下是完整的说明:

  1. 在日志中搜索正确的版本:

    brew log formula
    # Scroll down/up with j/k or the arrow keys
    # or use eg. /4\.4\.23 to search a specific version
    
    # This syntax only works on pre-2.0 Homebrew versions
    brew log --format=format:%H\ %s -F --grep=‹version› ‹formula›

    这将显示提交哈希列表。选一个合适的(大多数情况下应该很明显,通常是最新的(即最高))。

  2. 在上游存储库中找到公式所在的 URL:

    brew info ‹formula› | grep ^From:
  3. 修正网址:

    1. github.com替换raw.githubusercontent.com
    2. blob/master替换为我们在第一步中找到的提交哈希。
  4. 通过用提交哈希替换先前找到的 URL 中的master来安装所需版本,例如:

    brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/‹hash›/Formula/‹formula›.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 upgrade ,那么 bash 5 将被安装在顶部,除非您首先执行brew pin bash 。相反,要使此过程更平滑而无需固定,您应该首先使用brew install bash安装最新版本,然后brew unlink bash ,然后根据上述脚本安装所需的旧版本,然后使用brew switch bash 4.4.23设置符号链接。到旧版本。现在, brew upgrade不应影响您的 Bash 版本。您可以brew 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 ,您可以根据上述示例进行安装。缺点是您可能仍需要brew unlink bash ,然后brew link bash@4.4.23才能使用特定版本的 Bash 或任何其他公式。

基于@tschundeee@Debilski 的更新 1所述的工作流程,我使该过程自动化并在此脚本中添加了清理功能。

下载它 ,将其放在您的路径中,然后brewv <formula_name> <wanted_version> 。对于特定的 OP,将为:

cd path/to/downloaded/script/
./brewv postgresql 8.4.4

:)