如何在自制软件中安装特定版本的公式?例如,postgresql-8.4.4 而不是最新的 9.0。
postgresql
很奇怪,因为它在 Homebrew 中曾经有单独的版本,像 bash
这样的东西可能是一个更好的例子,因为它在相同的公式名称中从 4.x 变为 5.x。请参阅stackoverflow.com/a/55764594/3794873
TLDR: brew install postgresql@8.4.4
有关详细信息,请参阅 answer below。
*(我已经重新编辑了我的答案,以提供更彻底的工作流程来安装/使用带有自制软件的旧软件版本。如果您发现旧版本更好,请随时添加注释。)
让我们从最简单的情况开始:
1)检查,版本是否已经安装(但未激活)
当 homebrew 安装一个新公式时,它会将它放在一个版本化的目录中,例如 /usr/local/Cellar/postgresql/9.3.1
。然后全局安装此文件夹的符号链接。原则上,这使得在两个已安装版本之间切换非常容易。 (*)
如果您使用自制软件的时间较长并且从未删除过旧版本(例如使用 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 tap
& homebrew versions 存储库。
该版本存储库可能包含多个公式的旧版本的反向移植。 (大多数只有大的和著名的,但当然他们也会有几个用于 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)尝试一些过去的公式
列出以下方法主要是为了完整性。两者都试图从 brew 存储库中复活一些不死公式。由于更改的依赖项、公式规范中的 API 更改或只是下载 URL 的更改,事情可能会或可能不会起作用。
由于整个公式目录是一个 git 存储库,因此可以使用普通的 git 命令安装特定版本。但是,我们需要找到一种方法来获得旧版本可用的提交。
a) 历史时期
在 2011 年 8 月到 2014 年 10 月之间,homebrew 有一个 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) 史前时代
对于特殊需求,我们也可以尝试自己挖掘 homebrew repo。
$ 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 存储库中。
注意事项:签出较旧的提交时,您会暂时降级您的自制软件安装。因此,您应该小心,因为 homebrew 中的某些命令可能与最新版本不同。
4)手动编写公式
It’s not too hard 然后您可以将其上传到您自己的存储库。以前是 Homebrew-Versions,但现在已停止使用。
A.) 奖金:固定
如果您想在执行自然 brew update; brew upgrade
过程时保留某个版本(例如 postgresql)并阻止其更新,您可以pin 一个公式:
$ 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
fatal: Not a git repository (or any of the parent directories): .git
。我只是 cd
进入目录(没有 FORMULANAME.rb),然后执行 git checkout 120938
cd /usr/local
。
brew unlink FORMULANAME
brew versions <formula>
不再受支持。
brew link --force postgresql@9.5
创建符号链接。如果您已经安装了较新的版本并希望将较旧的版本作为您的默认版本,那么您还需要在其中添加一个 --overwrite
。
⚠ 此答案在 2020 年 12 月之后将不再有效:
brew switch
得到 disabled in HomeBrew 2.7.0 (deprecated in 2.6.0)
现在有一种更简单的方法来安装您之前安装的旧版本的公式。只需使用
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
只是更改符号链接,因此速度非常快。请参阅 External Commands 下 Homebrew Wiki 上的更多文档。
brew switch
现在似乎坏了。我得到:Error: Calling `brew switch` is disabled! Use `brew link` @-versioned formulae instead.
更新: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
酿造开关泊坞窗1.3.3
切换回 docker 1.4.1 brew switch docker 1.4.1
从这个gist
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
brew install <url>
之前,brew unlink <formulaname>
。否则,这是(到目前为止)切换到特定版本的公式的最简单、最简洁的方法。
brew log <formula>
轻松找到了地址
按照@halfcube 的建议,这非常有效:
在 https://github.com/Homebrew/homebrew-core/tree/master/Formula 找到您要查找的库 点击它:https://github.com/Homebrew/homebrew-core/blob/master/Formula /postgresql.rb 点击“历史”按钮查看旧的提交:https://github.com/Homebrew/homebrew-core/commits/master/Formula/postgresql.rb 点击你想要的:“postgresql: update version到 8.4.4",https://github.com/Homebrew/homebrew-core/blob/8cf29889111b44fd797c01db3cf406b0b14e858c/Formula/postgresql.rb 点击“原始”链接:https://raw.githubusercontent.com/Homebrew/homebrew- core/8cf29889111b44fd797c01db3cf406b0b14e858c/Formula/postgresql.rb brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/8cf29889111b44fd797c01db3cf406b0b14e858c/Formula/postgresql.rb
package@version
git log master -- Formula/PACKAGENAME.rb
获取提交历史记录,检查正确的提交,然后运行 brew install Formula/PACKAGENAME.rb
安装它。
brew install
之前需要 brew unlink
。
brew install https://github.com/Homebrew/homebrew-core/raw/afc10f17af8023906b87363a8340aeb62284329f/Formula/postgresql%409.6.rb
但收到错误,可能是由于 @
符号:Error: No available formula with the name "postgresql%409.6" In formula file: /Users/maciek/Library/Caches/Homebrew/Formula/postgresql%409.6.rb Expected to find class Postgresql%4096, but only found: PostgresqlAT96.
有什么想法吗?
Invalid usage: Installation of carthage from a GitHub commit URL is unsupported!
brew extract carthage` 到 GitHub 上的稳定点击。`
我发现了比其他复杂解决方案更好的替代解决方案。
brew install https://raw.github.com/Homebrew/homebrew-versions/master/postgresql8.rb
这将下载并安装 PostgreSQL 8.4.8
我通过开始按照在 repo 中搜索 repo 和 comment 的步骤找到了这个解决方案。
经过一番研究,发现有人收藏了一系列稀有的配方。
如果您正在寻找 MySQL 5.1.x,请尝试一下。
brew install https://raw.github.com/Homebrew/homebrew-versions/master/mysql51.rb
brew install https://github.com/Homebrew/homebrew-versions/blob/master/node06.rb
似乎因语法错误而失败。
raw
homebrew-versions
消失了,现在一切都在 core
上,所以一般情况是:brew install https://raw.github.com/Homebrew/homebrew-core/<COMMIT>/Formula/<FORMULA>.rb
。前往 github.com/Homebrew/homebrew-core/commits/master/Formula/… 可以找到 COMMIT
。
Warning: Calling Installation of sshuttle from a GitHub commit URL is deprecated! Use 'brew extract sshuttle' to stable tap on GitHub instead.
更新:此方法已弃用,不再有效。
此方法会导致错误:不支持从 GitHub 提交 URL 安装 mysql! brew extract mysql
改为稳定地点击 GitHub。 (使用错误)
$ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/c77882756a832ac1d87e7396c114158e5619016c/Formula/mysql.rb
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
...
Traceback (most recent call last):
9: from /usr/local/Homebrew/Library/Homebrew/brew.rb:122:in `<main>'
8: from /usr/local/Homebrew/Library/Homebrew/cmd/install.rb:132:in `install'
7: from /usr/local/Homebrew/Library/Homebrew/cli/parser.rb:302:in `parse'
6: from /usr/local/Homebrew/Library/Homebrew/cli/parser.rb:651:in `formulae'
5: from /usr/local/Homebrew/Library/Homebrew/cli/parser.rb:651:in `map'
4: from /usr/local/Homebrew/Library/Homebrew/cli/parser.rb:655:in `block in formulae'
3: from /usr/local/Homebrew/Library/Homebrew/formulary.rb:351:in `factory'
2: from /usr/local/Homebrew/Library/Homebrew/formulary.rb:138:in `get_formula'
1: from /usr/local/Homebrew/Library/Homebrew/formulary.rb:142:in `klass'
/usr/local/Homebrew/Library/Homebrew/formulary.rb:227:in `load_file': Invalid usage: Installation of mysql from a GitHub commit URL is unsupported! `brew extract mysql` to a stable tap on GitHub instead. (UsageError)
12: from /usr/local/Homebrew/Library/Homebrew/brew.rb:155:in `<main>'
11: from /usr/local/Homebrew/Library/Homebrew/brew.rb:157:in `rescue in <main>'
10: from /usr/local/Homebrew/Library/Homebrew/help.rb:64:in `help'
9: from /usr/local/Homebrew/Library/Homebrew/help.rb:83:in `command_help'
8: from /usr/local/Homebrew/Library/Homebrew/help.rb:103:in `parser_help'
7: from /usr/local/Homebrew/Library/Homebrew/cli/parser.rb:302:in `parse'
6: from /usr/local/Homebrew/Library/Homebrew/cli/parser.rb:651:in `formulae'
5: from /usr/local/Homebrew/Library/Homebrew/cli/parser.rb:651:in `map'
4: from /usr/local/Homebrew/Library/Homebrew/cli/parser.rb:655:in `block in formulae'
3: from /usr/local/Homebrew/Library/Homebrew/formulary.rb:351:in `factory'
2: from /usr/local/Homebrew/Library/Homebrew/formulary.rb:138:in `get_formula'
1: from /usr/local/Homebrew/Library/Homebrew/formulary.rb:142:in `klass'
/usr/local/Homebrew/Library/Homebrew/formulary.rb:227:in `load_file': Invalid usage: Installation of mysql from a GitHub commit URL is unsupported! `brew extract mysql` to a stable tap on GitHub instead. (UsageError)
我尝试使用推荐的命令进行安装,但它在 MySQL 5.7.10 的这个特定实例中不起作用。使用更新的公式可能会带来更好的运气。
$ brew extract --version=5.7.10 mysql homebrew/cask
==> Searching repository history
==> Writing formula for mysql from revision 0fa511b to:
/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask/Formula/mysql@5.7.10.rb
$
$ brew install /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask/Formula/mysql@5.7.10.rb
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
Updated 1 formula.
Error: undefined method `core_tap?' for nil:NilClass
Error: Failed to load cask: /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask/Formula/mysql@5.7.10.rb
Cask 'mysql@5.7.10' is unreadable: wrong constant name #<Class:0x00007f9b9498cad8>
Warning: Treating /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask/Formula/mysql@5.7.10.rb as a formula.
==> Installing mysql@5.7.10 from homebrew/cask
==> Downloading https://homebrew.bintray.com/bottles/cmake-3.19.4.big_sur.bottle.tar.gz
==> Downloading from https://d29vzk4ow07wi7.cloudfront.net/278f2ad1caf664019ff7b4a7fc5493999c06adf503637447af13a617d45cf484?response-content-disposition=attachment%3Bfilenam
######################################################################## 100.0%
==> Downloading https://downloads.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.bz2
==> Downloading from https://phoenixnap.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.bz2
######################################################################## 100.0%
==> Downloading https://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.10.tar.gz
curl: (22) The requested URL returned error: 404 Not Found
Error: Failed to download resource "mysql@5.7.10"
Download failed: https://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.10.tar.gz
您可以修改上述路径中的公式(用 ruby 编写)以尝试达到您想要的结果(例如,在最近的 macOS 版本上安装 MySQL 5.7.10)。
您可以使用识别公式的策略以及公式历史中与您要安装的软件包版本匹配的特定提交。
转到 https://github.com/Homebrew/homebrew-core 按键盘上的 t 激活文件查找器。确定一个看起来最相关的公式,可能是:Formula/mysql.rb,将您带到一个论坛文件位置:https://github.com/Homebrew/homebrew-core/blob/master/Formula/mysql.rb。通过单击位于 https://github.com/Homebrew/homebrew-core/commits/master/Formula/mysql.rb 的 History 按钮查看修订历史记录。如果您对 MySQL 5.7.10 感兴趣,您可能需要单击 5.7.11 之前的最新版本,它会导航到 GitHub 提交:
注意:如果浏览器中未加载提交历史记录,您可能必须根据 GitHub 的建议在控制台中查看提交历史记录。如果您有兴趣在 GitHub 上查看该提交,请在 URL 中替换上面的提交 SHA。或者,跳到下面的步骤 7。
应用提交后,单击“查看”按钮查看 mysql.rb 文件的源代码。然后单击“原始”按钮以查看原始源。复制网址。或者,使用 mysql.rb 文件名自己构建 URL 以标识您的公式和该公式的特定版本(由下面 URL 中的 commmit SHA 标识)。
使用 $ brew install [步骤 7 中的 URL] 安装它 $ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/c77882756a832ac1d87e7396c114158e5619016c/Formula/mysql.rb
解决方案
brew extract --version=8.4p1 openssh homebrew/cask
brew install openssh@8.4p1
最新的openssl@8.5p1
在我运行brew upgrade
后有bug,所以我通过上述方式成功回退到以前的版本。
brew unlink
。
大多数其他答案现在已经过时了。不幸的是,Homebrew 仍然没有安装过时版本的内置方法,除非该版本作为单独的公式存在(例如 python@2
、postgresql@9.4
...)。
幸运的是,对于其他公式,有一种比过去需要的复杂混乱更简单的方法。以下是完整说明:
在日志中搜索正确的版本: brew log formula # 使用 j/k 或箭头键向下/向上滚动 # 或使用例如。 /4\.4\.23 搜索特定版本 # 此语法仅适用于 2.0 之前的 Homebrew 版本 brew log --format=format:%H\ %s -F --grep=‹version› ‹formula› This将显示提交哈希列表。取一个合适的(大多数情况下应该很明显,通常是最新的(即顶部)。在上游存储库中找到公式所在的 URL: brew info ‹formula› | grep ^From: Fix the URL:将 github.com 替换为 raw.githubusercontent.com 将 blob/master 替换为我们在第一步中找到的提交哈希。通过将先前找到的 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 或任何其他公式。
brew log
的语法,因此任何额外的 -F
或 --grep
选项对我来说都失败了。
brew log
。我现在懒得写新版本了,因为这需要正确解析 git log 消息,或者直接在相应的存储库上运行 git log
。而变更日志似乎甚至没有提到这个重大变化。烦人之余。
External Command
在 brew
的结构中运行才能获得该类型的 git log
过滤。 docs.brew.sh/External-Commands
brew extract
用法的地方,谢谢!
官方方法(从对 https://github.com/Homebrew/brew/issues/6028 的回复来看)
不幸的是,Homebrew 仍然没有明显的内置方式来安装旧版本。
幸运的是,对于大多数公式来说,有一种比过去需要的复杂混乱更简单的方法。以下是以 bash
为例的完整说明:
brew tap-new $USER/local-tap
# extract with a version seems to run a `git log --grep` under the hood
brew extract --version=4.4.23 bash $USER/local-tap
# Install your new version from the tap
brew install bash@4.4.23
# Note this "fails" 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(或任何其他您拥有最新和已安装旧版本)。
这种方法的一个潜在缺点是您不能轻松地在版本之间来回切换,因为根据 brew
,它是一个“不同的公式”。
如果您希望能够使用 brew switch $FORMULA $VERSION
,您应该使用下一个方法。
脚本方法(推荐)
此示例显示了安装较旧的 bash 4.4.23,这是一个有用的示例,因为 bash
公式当前安装的是 bash 5。
首先用 brew install bash 安装最新版本的公式
然后 brew unlink bash
然后根据下面的片段安装您想要的旧版本
最后使用 brew switch bash 4.4.23 设置符号链接到您的版本
如果您在安装旧版本后执行 brew upgrade
而没有先安装最新版本,则安装最新版本会破坏旧版本,除非您先执行 brew pin bash
。
此处的步骤避免固定,因为它很容易忘记,并且您可能会固定到将来变得不安全的版本(请参阅 Shellshock/etc)。使用此设置,brew upgrade
应该不会影响您的 Bash 版本,您始终可以运行 brew switch bash
来获取可切换到的版本列表。
复制并粘贴并编辑下面代码片段中的 export
行以使用所需的版本和公式名称进行更新,然后按原样复制并粘贴其余部分,它将使用这些变量来发挥作用。
# This search syntax works with newer Homebrew
export BREW_FORMULA_SEARCH_VERSION=4.4.23 BREW_FORMULA_NAME=bash
# This will print any/all commits that match the version and formula name
git -C $(brew --repo homebrew/core) log \
--format=format:%H\ %s -F --all-match \
--grep=$BREW_FORMULA_SEARCH_VERSION --grep=$BREW_FORMULA_NAME
当您确定公式中存在版本时,您可以使用以下内容:
# Gets only the latest Git commit SHA for the script further down
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
按照公式输出中的说明将其放入 PATH 或将其设置为默认 shell。
brew extract
docs.brew.sh/Manpage#extract-options-formula-tap 的官方文档
brew
ABI/API 更改。 stackoverflow.com/questions/3987683/…
我刚刚使用 Homebrew 回到 Maven 2.2.1,因为简单的 brew install maven
安装了 Maven 3.0.3。
首先,您必须将 maven 目录留在那里
$ brew unlink maven
使用 brew tap 命令
$ 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 项目重新组织了他们的仓库。更新了此答案以解决此更改。
意外升级 Postgres?
我的情况:
postgresql 意外从 11 升级到 12(在运行 brew upgrade 后不带参数)
我想保留 Postgres 11。
解决方案:
停止数据库:
brew services stop postgresql
安装 Postgres 11:
brew install postgresql@11
启用它:
brew link postgresql@11 --force
(可选)将数据库数据目录从 postgres 重命名为 postgres@11:
cd /usr/local/var
ls -lh
mv postgresql@11 postgresql@11-fresh-backup
mv postgres postgresql@11
启动数据库:
brew services start postgresql@11
如果您有任何错误,请检查 /usr/local/var/log/postgresql@11.log
(注意 @11)。
brew postgresql-upgrade-database
执行)。这个答案对几乎任何其他公式都没有用。
brew postgresql-upgrade-database
是用于升级。我的回答是关于使用 older Postgres 版本。简单地切换二进制文件是行不通的。
nvm
,仅供参考,我很幸运地将这种技术用于较旧的 LTS 版本。至少在编写 v10 时v12 应该可用,例如 brew install node@12
formulae.brew.sh/formula/node
家酿最近发生了变化。曾经有效的东西不再有效。我发现最简单的工作方式(2021 年 1 月)是:
找到我的软件的 .rb 文件(首先转到公式,找到我需要的文件,然后单击“历史记录”;对于 CMake,位于 https://github.com/Homebrew/homebrew-core/commits/master/ Formula/cmake.rb) 在修订中选择所需的版本,例如 3.18.4,单击 .rb 文件 diff (...) 右上角的三个点,然后单击 Raw。复制网址。
在修订中选择所需的版本,例如 3.18.4,单击 .rb 文件 diff (...) 右上角的三个点,然后单击 Raw。复制网址。
取消链接旧版本 brew unlink cmake
直接从 git URL 安装不再起作用(brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/2bf16397f163187ae5ac8be41ca7af25b5b2e2cc/Formula/cmake.rb 将失败)相反,下载它并从本地文件 curl 安装-O https://raw.githubusercontent.com/Homebrew/homebrew-core/2bf16397f163187ae5ac8be41ca7af25b5b2e2cc/Formula/cmake.rb && brew install ./cmake.rb
相反,从本地文件下载并安装 curl -O https://raw.githubusercontent.com/Homebrew/homebrew-core/2bf16397f163187ae5ac8be41ca7af25b5b2e2cc/Formula/cmake.rb && brew install ./cmake.rb
瞧!您现在可以删除下载的 .rb
文件。
根据 @tschundeee 和 @Debilski’s update 1 描述的工作流程,我自动化了该过程并在 this script 中添加了清理。
Download it,把它放在你的路径和 brewv <formula_name> <wanted_version>
。对于特定的 OP,它将是:
cd path/to/downloaded/script/
./brewv postgresql 8.4.4
:)
一个更新的答案,因为这增加了@lance-pollard 已经发布的工作答案。
如何安装特定版本的公式(本示例中使用的公式为 terraform
):
找到您的公式文件,例如:https://github.com/Homebrew/homebrew-core/blob/master/Formula/terraform.rb 使用 https://github.com/Homebrew/homebrew- 从 github 的历史记录中获取提交版本core/commits/master/Formula/terraform.rb 或 git log master -- Formula/terraform.rb 如果你已经在本地克隆了 repo。使用公式的提交版本获取原始 git URL:如果 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/e4ca4d2c41d4c1412994f9f1cb14993be5b25c /terraform.rb
在最新版本的自制软件(撰写本文时为 0.9.5)上,您要安装的自制软件桶版本将有一个特定的配方。例子:
$ brew search mongodb
mongodb mongodb24 mongodb26
然后像往常一样做brew install mongodb26
。
如果您已经安装了最新版本,请确保取消链接最新版本并链接所需版本:brew unlink mongodb && brew link mongodb26
。
homebrew/versions
的问题在于,必须有人在存储库中列出该特定版本的软件,您才能使用它。此外,由于不再支持 brew versions
,因此需要另一种解决方案。对于指示使用 brew switch
的解决方案,这仅在您尚未执行 brew cleanup
时才有效,因为该版本需要存在于您的计算机上。
我想安装 homebrew/versions
中未列出的特定旧版本 docker-machine
时遇到问题。我使用下面的方法解决了这个问题,它也应该适用于任何 brew 安装的软件。下面的示例将使用 docker-machine
作为我要从版本 0.5.0 降级到 0.4.1 的包。
转到您的自制公式目录。您可以通过运行 brew info [any package name] 来确定这一点。例如, brew info docker-machine 给了我一行显示路径 - /usr/local/Cellar/docker-machine/0.5.0。这告诉我,在我的机器上,homebrew 安装在 /usr/local 并且我的 Formula 目录默认位于 /usr/local/Library/Formula 为您的包找到特定的公式文件 (.rb)。由于我想降级docker-machine,我可以看到一个docker-machine.rb 文件。获取此公式文件的版本历史记录。输入 git log docker-machine.rb。这将列出该文件的完整提交历史记录。你会看到这样的输出:
...more commit 20c7abc13d2edd67c8c1d30c407bd5e31229cacc Author: BrewTestBot Date: Thu Nov 5 16:14:18 2015 +0000 docker-machine: update 0.5.0 bottle. commit 8f615708184884e501bf5c16482c95eff6aea637 Author: Vincent Lesierse Date: Tue Oct 27 22:25:30 2015 +0100 docker-machine 0.5.0 Updated docker-machine to 0.5.0 Closes #45403. Signed-off-by: Dominyk Tiller commit 5970e1af9b13dcbeffd281ae57c9ab90316ba423 Author: BrewTestBot Date: Mon Sep 21 14:04:04 2015 +0100 docker-machine: update 0.4.1 bottle. commit 18fcbd36d22fa0c19406d699308fafb44e4c8dcd Author: BrewTestBot Date: Sun Aug 16 09:05:56 2015 +0100 docker-machine: update 0.4.1 bottle. ...more
棘手的部分是找到您想要的特定版本的最新提交。在上面,我可以看出最新的 0.4.1 版本是使用这个提交标记提交的:commit 5970e1af9b13dcbeffd281ae57c9ab90316ba423
。上面的提交开始使用 0.5.0 版本(git 日志条目从最新到最早的日期列出)。
获取以前版本的公式文件。使用第 3 步中的提交标记(您可以使用前 6 个字符),您可以使用以下命令获取旧版本的公式文件: git checkout 5970e1 docker-machine.rb 卸载您当前的包版本。只需运行正常的 brew 命令即可卸载当前版本的软件包。前任。 brew uninstall docker-machine 安装较旧的软件包版本现在,您只需运行正常的 brew install 命令,它将安装您已签出的公式。前任。酿造安装码头机器
如有必要,您可能需要使用 brew link docker-machine
重新链接。
如果您在任何时候想要恢复到特定包的最新版本,请进入公式目录并在您的公式文件 (.rb) 上发出以下命令
git reset HEAD docker-machine.rb
git checkout -- docker-machine.rb
然后您可以 brew uninstall docker-machine
和 brew install docker-machine
获取最新版本并保持这种状态。
git log --grep 0.4.1 docker-machine.rb
。
/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
cairo
brew 找到足够的版本历史记录。出于某种原因,@sealocal 的答案显示得更多。
编辑:2021,由于不推荐使用 github 安装,此答案不再起作用。 (感谢蒂姆史密斯的更新)。
安装旧的 brew 包版本(Flyway 4.2.0 示例)
在本地找到本地 homebrew git 目录或克隆 Homebrew/homebrew-core
cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/
或者
git clone git@github.com:Homebrew/homebrew-core.git
列出所有可用版本
git log master -- Formula/flyway.rb
复制你想要的版本的提交 ID 并直接安装
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/793abfa325531415184e1549836c982b39e89299/Formula/flyway.rb
homebrew-core
目录运行 brew install Formula/flyway.rb
?它在不使用 raw.github..
地址的情况下对我有用
Homebrew 2.4.0-93-g634c457
)唯一有效的答案
brew log some_package
即可
brew install
失败并显示不支持从 GitHub 提交 URL 安装的消息。
我在这里尝试了大多数解决方案,但它们已经过时了。我不得不将这里的一些想法与我自己的工作结合起来。因此,我创建了一个脚本来帮助我完成繁重的工作,您可以找到 here
用法:
brewv.sh formula_name desired_version
这里的其他答案很好,但是如果您需要安装旧版本的软件包并确保修改了软件包名称,您将需要一种不同的方法。这在使用使用 brew --prefix package_name
来确定用于编译的目录的脚本(在我的例子中是 PHP 构建脚本)时很重要。
如果您使用的是 brew extract
,则会在包名称的末尾添加一个版本,这将中断 brew --prefix
查找。
以下是在保持原始包名称的同时安装旧包版本的方法:
# uninstall the newer version of the package that you accidentally installed
brew uninstall --ignore-dependencies icu4c
# `extract` the version you'd like to install into a custom tap
brew tap-new $USER/local-tap
brew extract --version=68.2 icu4c $USER/local-tap
# jump into the new tap you created
cd $(brew --repository $USER/local-tap)/Formula
# rename the formula
mv icu4c@68.2.rb icu4c.rb
# change the name of the formula by removing "AT682" from the `class` definition
# the exact text you'll need to remove will be different
# depending on the version you extracted
nano icu4c.rb
# then, install this specific formula directly
brew install $(brew --repository $USER/local-tap)/Formula/icu4c.rb
对于 brew 的最新版本,它可以很容易地完成。
brew tap homebrew/versions
brew install subversion17 # for svn 1.7 branch instead of last available
brew install postgresql8 # for postgresql 8 (which you ask)
这些都不适用于我的案例(Python),所以我将添加我的 2 美分:
cd `brew --prefix`
git log Library/Formula/python.rb
输出如下所示:
commit 9ff2d8ca791ed1bd149fb8be063db0ed6a67a6de Author: Dominyk Tiller
我想要版本 2.7.11
,所以我的哈希是 cf5da0547cd261f79d69e7ff62fdfbd2c2d646e9
(或简称为 cf5da05
)。接下来,我检查该版本并安装公式 python
:
git checkout cf5da05
brew install python
最后,清理:
git checkout master
HOMEBREW_NO_AUTO_UPDATE
并阅读github.com/Homebrew/brew/issues/1188
cd
brew --prefix/Homebrew
和 git log Library/Taps/homebrew/homebrew-core/Formula/python.rb
/Library/Taps
被忽略了。
HOMEBREW_NO_AUTO_UPDATE
。是的,在在你发现你需要它之前不要忘记你需要的东西。 xD
HOMEBREW_NO_INSTALL_CLEANUP
这不是您需要记住的吗?
目前,安装特定公式版本的旧方法已被弃用。所以看起来我们必须使用brew edit [formula]
。例如,假设我们要安装 icu4c
的 62.1
版本(例如 postgresql 10.5
需要)。那么你必须
> brew edit icu4c
# drops you to editor
在这里,您必须将 url
、version
和 sha256
(也可能是 mirror
)更改为相应的 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 reinstall icu4c
以最终下载 62.1
版本。
sha256
?就我而言https://storage.googleapis.com/dart-archive/channels/stable/release/1.24.3/sdk/dartsdk-macos-x64-release.zip
如果使用 brew search <formula>
找不到您的版本,您还可以尝试查看公式的提交日志以找到您想要的版本:
这是通过 brew 安装旧版本 nginx 的示例:
ngxnx 公式提交日志
见 nginx:更新 1.6.3 瓶 eba75b9a1a474b9fc4df30bd0a32637fa31ec049
从那里,我们可以使用 sha 和原始 git url 安装 1.6.3
:
brew install https://raw.githubusercontent.com/Homebrew/homebrew/eba75b9a1a474b9fc4df30bd0a32637fa31ec049/Library/Formula/nginx.rb
在这里,我对此的简单回答 - 真的很恼火没有内置的解决方案,所以我构建了自己的懒惰“脚本”。随意贡献😃👍🏻
# Please define variables
packageName=<packageName>
packageVersion=<packageVersion>
# Create a new tab
brew tap-new local/$packageName
# Extract into local tap
brew extract --version=$packageVersion $packageName local/$packageName
# Verify packages is present
brew search $packageName@
# Run brew install@version as usual
brew install local/$packageName/$packageName@$packageVersion
https://gist.github.com/ArgonQQ/cff4834dab6b254cc2140bb1454b47ef
我创建 a tool 是为了简化 this answer 中规定的过程。
要查找版本为 a.b.c
的软件包 pkg
,请运行:
$ brew-install-specific pkg@a.b.c
这将列出 pkg
自制公式中提及给定版本及其 GitHub 网址的提交。
Matching versions:
1. pkg: update a.b.c bottle.
https://github.com/Homebrew/homebrew-core/commit/<COMMIT-SHA>
2. pkg: release a.b.c-beta
https://github.com/Homebrew/homebrew-core/commit/<COMMIT-SHA>
3. pkg a.b.c
https://github.com/Homebrew/homebrew-core/commit/<COMMIT-SHA>
Select index:
验证来自给定 URL 的提交,并输入所选提交的索引。
Select index: 2
Run:
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/<COMMIT-SHA>/Formula/pkg.rb
复制并运行给定的命令进行安装。
将 Library/Formula/postgresql.rb 第 8 行更新为
http://ftp2.uk.postgresql.org/sites/ftp.postgresql.org/source/v8.4.6/postgresql-8.4.6.tar.bz2
和第 9 行的 MD5 到
fcc3daaf2292fa6bf1185ec45e512db6
保存并退出。
brew install postgres
initdb /usr/local/var/postgres
现在在这个阶段,您可能会遇到 postgresql could not create shared memory segment
错误,要像这样解决更新 /etc/sysctl.conf
的问题:
kern.sysv.shmall=65536
kern.sysv.shmmax=16777216
再试一次initdb /usr/local/var/postgres
,它应该可以顺利运行。
在启动时运行 postgresql
launchctl load -w /usr/local/Cellar/postgresql/8.4.6/org.postgresql.postgres.plist
希望有帮助:)
我刚刚将旧版本的 elasticsearch 复制到 /usr/local/Cellar/elasticsearch
目录中。
$ mkdir /usr/local/Cellar/elasticsearch/5.4.3/bin
$ cp elasticsearch /usr/local/Cellar/elasticsearch/5.4.3/bin
$ brew switch elasticsearch 5.4.3
而已。也许它对任何人都有用。
这是我降级 KOPS(不支持版本控制)的方法
# brew has a git repo on your localhost
cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
git remote -v
origin https://github.com/Homebrew/homebrew-core (fetch)
origin https://github.com/Homebrew/homebrew-core (push)
# find the version of kops.rb you need
git log Formula/kops.rb
# checkout old commit
# kops: update 1.18.1 bottle.
git checkout 2f0ede7f27dfc074d5b5493894f3468f27cc73f0 -- Formula/kops.rb
brew unlink kops
brew install kops
# now we have old version installed
ls -1 /usr/local/Cellar/kops/
1.18.1
1.18.2
which kops
/usr/local/bin/kops
ls -l /usr/local/bin/kops
/usr/local/bin/kops -> ../Cellar/kops/1.18.1/bin/kops
kops version
Version 1.18.1
# revert to the newest version
brew uninstall kops
git checkout -f
brew link kops
kops version
Version 1.18.2
我决定根据自己的判断,为 Maven 3.1.1 创建一个公式,而 homebrew/versions
没有。去做这个:
我在 github 上分叉了 homebrew/versions。我从 $(brew --prefix)/Library/Taps 符号链接到我的 fork 的本地工作副本。我将其称为 my-homebrew/versions。我通过将公式指定为 my-homebrew/versions/
耶。
git checkout fa992 -- Library/Formula/postgresql.rb
检查公式。完成后,您可以使用git revert HEAD Library/Formula/postgresql.rb && git checkout -- Library/Formula/postgresql.rb
撤消对公式的更改。brew update
来建立其 Git 存储库。cd $(brew --repository)/Library/Taps/homebrew/homebrew-core
,然后您可以使用git checkout 4cce79d -- Formula/go.rb
和HOMEBREW_NO_AUTO_UPDATE=1 brew install go
。