自制安装特定版本的公式?

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

1683616 次浏览

TLDR:brew install postgresql@8.4.4更多细节见下面的答案


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

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

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

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

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

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

$ brew info postgresqlpostgresql: 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 bottleFrom: https://github.com/Homebrew/homebrew/commits/master/Library/Formula/postgresql.rb# … and some more

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

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

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

$ brew info postgresqlpostgresql: 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 bottleFrom: https://github.com/Homebrew/homebrew/commits/master/Library/Formula/postgresql.rb# … and some more

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

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

2)检查,版本是否可作为水龙头

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

该版本存储库可能包括几个公式的旧版本的backport。(主要是大型和著名的,但当然他们也会有几个postgresql的公式。)

brew search postgresql会告诉你在哪里看:

$ brew search postgresqlpostgresqlhomebrew/versions/postgresql8    homebrew/versions/postgresql91homebrew/versions/postgresql9    homebrew/versions/postgresql92

我们可以通过键入简单地安装它

$ brew install homebrew/versions/postgresql8Cloning 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命令安装特定版本。但是,我们需要找到一种方法来获取旧版本可用的提交。

(一)历史时期

2011年8月和2014年10月之间,自制有一个brew versions命令,它用各自的SHA哈希输出所有可用的版本。截至2014年10月,你必须执行brew tap homebrew/boneyard才能使用它。正如水龙头的名称所暗示的,你可能只应该作为最后的手段这样做。

例如。

$ brew versions postgresqlWarning: brew-versions is unsupported and may be removed soon.Please use the homebrew-versions tap instead:https://github.com/Homebrew/homebrew-versions9.3.2    git checkout 3c86d2b Library/Formula/postgresql.rb9.3.1    git checkout a267a3e Library/Formula/postgresql.rb9.3.0    git checkout ae59e09 Library/Formula/postgresql.rb9.2.4    git checkout e3ac215 Library/Formula/postgresql.rb9.2.3    git checkout c80b37c Library/Formula/postgresql.rb9.2.2    git checkout 9076baa Library/Formula/postgresql.rb9.2.1    git checkout 5825f62 Library/Formula/postgresql.rb9.2.0    git checkout 2f6cbc6 Library/Formula/postgresql.rb9.1.5    git checkout 6b8d25f Library/Formula/postgresql.rb9.1.4    git checkout c40c7bf Library/Formula/postgresql.rb9.1.3    git checkout 05c7954 Library/Formula/postgresql.rb9.1.2    git checkout dfcc838 Library/Formula/postgresql.rb9.1.1    git checkout 4ef8fb0 Library/Formula/postgresql.rb9.0.4    git checkout 2accac4 Library/Formula/postgresql.rb9.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 7dc7ccef9e1ab7d2fc351d7935c96a0e0b031552Author: Aku KotkavuoDate:   Sun Sep 19 18:03:41 2010 +0300
Update PostgreSQL to 9.0.0.
Signed-off-by: Adam Vandenberg
commit fa992c6a82eebdc4cc36a0c0d2837f4c02f3f422Author: David HöppnerDate:   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 update; brew upgrade过程时阻止它更新,您可以引脚公式:

$ brew pin postgresql

固定公式在/usr/local/Library/PinnedKegs/中列出,一旦您想引入最新的更改和更新,您可以再次unpin

$ brew unpin postgresql

更新库/公式/postgresql.rb行8到

http://ftp2.uk.postgresql.org/sites/ftp.postgresql.org/source/v8.4.6/postgresql-8.4.6.tar.bz2

MD5在9号线

fcc3daaf2292fa6bf1185ec45e512db6

保存并退出。

brew install postgresinitdb /usr/local/var/postgres

现在在这个阶段,您可能会面临postgresql could not create shared memory segment错误,要解决更新/etc/sysctl.conf的问题,如下所示:

kern.sysv.shmall=65536kern.sysv.shmmax=16777216

再试一次initdb /usr/local/var/postgres,它应该运行平稳。

在启动时运行postgresql

launchctl load -w /usr/local/Cellar/postgresql/8.4.6/org.postgresql.postgres.plist

希望有帮助:)

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

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/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: date version to 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

⚠这个答案在2020年12月之后不再有效:
brew switch得到在HomeBrew 2.7.0中禁用已在2.6.0中弃用


现在有一种更简单的方法来安装您之前安装的公式的旧版本

brew switch [formula] [version]

例如,我经常在Node.js0.4.12和0.6.5之间交替:

brew switch node 0.4.12brew switch node 0.6.5

由于brew switch只是更改符号链接,所以速度非常快。请参阅Homebrew Wiki上外部命令下的进一步留档。

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

首先,你必须把maven dir留在那里

$ brew unlink maven

使用brew点击命令

$ brew tap homebrew/versionsCloning 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 --versionApache Maven 2.2.1 (r801777; 2009-08-06 12:16:01-0700)Java version: 1.6.0_37Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/HomeDefault locale: en_US, platform encoding: MacRomanOS name: "mac os x" version: "10.7.4" arch: "x86_64" Family: "mac"

编辑:您也可以只brew switch maven 2.2.1切换到不同的版本。

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

简单的工作流程

现在Homebrew/version已被弃用,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

基于@刘德华@Debilski的更新1描述的工作流程,我自动化了过程并在这个脚本中添加了清理。

下载吧,把它放在你的路径和brewv <formula_name> <wanted_version>中。对于特定的OP,它将是:

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

:)

更新:2015年1月15日

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

从这里要点

brew updatebrew versions FORMULAcd `brew --prefix`git checkout HASH Library/Formula/FORMULA.rb  # use output of "brew versions"brew install FORMULAbrew switch FORMULA VERSIONgit 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

我决定,违背我更好的判断,为Maven 3.1.1创建一个公式,homebrew/versions没有。为此:

  1. 我在github上分叉了homebrew/versions
  2. 我将$(brew --prefix)/Library/Taps符号链接到我的分叉的本地工作副本。我将此称为my-homebrew/versions
  3. 我通过将公式指定为my-homebrew/versions/<formula>进行测试。
  4. 我向homebrew/versions发送了一个拉取请求以获取我的新公式。

对于brew的最后一个版本,这可以非常容易地完成。

brew tap homebrew/versionsbrew install subversion17 # for svn 1.7 branch instead of last availablebrew install postgresql8  # for postgresql 8 (which you ask)

在最新版本的自制啤酒(撰写本文时为0.9.5)上,将有一个您要安装的自制啤酒桶版本的特定配方。示例:

$ brew search mongodbmongodb    mongodb24  mongodb26

然后像正常一样做brew install mongodb26

如果您已经安装了最新版本,请确保解除关联最新版本并链接所需版本:brew unlink mongodb && brew link mongodb26

如果找不到使用brew search <formula>的版本,您还可以尝试查看公式的提交日志以找到所需的版本:

以下是通过brew安装旧版本nginx的示例:

从那里,我们可以使用sha和原始git url安装1.6.3

brew install https://raw.githubusercontent.com/Homebrew/homebrew/eba75b9a1a474b9fc4df30bd0a32637fa31ec049/Library/Formula/nginx.rb

homebrew/versions的问题在于,必须有人在存储库中列出了该软件的特定版本才能让您使用它。此外,由于不再支持brew versions,因此需要另一种解决方案。对于指示使用brew switch的解决方案,这仅在您没有执行brew cleanup的情况下有效,因为该版本需要存在于您的计算机上。

我在想要安装homebrew/versions中没有列出的特定旧版本docker-machine时遇到了问题。我使用下面的方法解决了这个问题,它也应该适用于任何brew安装的软件。下面的示例将使用docker-machine作为我要从版本0.5.0降级到0.4.1的包。

  1. 转到您的自制#0目录。
    您可以通过运行brew info [any package name]来确定这一点。例如,brew info docker-machine给我一条线,显示我路径-/usr/local/Cellar/docker-machine/0.5.0。这告诉我在我的机器上,自制安装在/usr/localFormula目录默认位于/usr/local/Library/Formula

  2. 找到包的特定公式文件(. rb)。因为我想降级docker-machine,我可以看到一个docker-machine.rb文件。

  3. 获取此公式文件的版本历史记录.输入git log docker-machine.rb。这将列出此文件的完整提交历史记录。您将看到如下输出:

...more
commit 20c7abc13d2edd67c8c1d30c407bd5e31229caccAuthor: BrewTestBotDate:   Thu Nov 5 16:14:18 2015 +0000
docker-machine: update 0.5.0 bottle.
commit 8f615708184884e501bf5c16482c95eff6aea637Author: Vincent LesierseDate:   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 5970e1af9b13dcbeffd281ae57c9ab90316ba423Author: BrewTestBotDate:   Mon Sep 21 14:04:04 2015 +0100
docker-machine: update 0.4.1 bottle.
commit 18fcbd36d22fa0c19406d699308fafb44e4c8dcdAuthor: BrewTestBotDate:   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日志条目从最新到最早的日期列出)。

  1. 获取公式文件的先前版本。使用步骤#3中的提交标记(您可以使用前6个字符),您可以使用以下命令获取公式文件的旧版本:

    git checkout 5970e1 docker-machine.rb

  2. 卸载您当前的软件包版本。只需运行普通的brew命令即可卸载当前版本的软件包。
    例。brew uninstall docker-machine

  3. 安装旧版本的软件包现在,您可以运行普通的brew install命令,它将安装您签出的公式。例。brew install docker-machine

如果需要,您可能需要使用brew link docker-machine重新链接。

如果您想随时恢复到特定包的最新版本,请进入公式目录并在公式文件(. rb)上发出以下命令

git reset HEAD docker-machine.rbgit checkout -- docker-machine.rb

然后,您可以brew uninstall docker-machinebrew install docker-machine获取最新版本并保持这种方式。

更新:此方法已弃用,不再有效。

此方法导致错误:不支持从GitHub提交URL安装mysql!#0改为GitHub上的稳定点击。(UsageError)

$ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/c77882756a832ac1d87e7396c114158e5619016c/Formula/mysql.rbUpdating 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.rbUpdating Homebrew...==> Auto-updated Homebrew!Updated 1 tap (homebrew/core).==> Updated FormulaeUpdated 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.rbCask '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 FoundError: 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)。


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

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

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

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

  4. 通过单击位于https://github.com/Homebrew/homebrew-core/commits/master/Formula/mysql.rbHistory按钮查看修订历史记录。如果您对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. 点击"View"按钮查看提交后mysql.rb文件的源代码。

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

  3. 复制URL。或者,使用mysql.rb文件名自己构建URL以标识您的公式和该公式的特定版本(由下面URL中的提交SHA标识)。

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

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

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

这些都不适用于我的案例(Python),所以我将添加我的2美分:

cd `brew --prefix`git log Library/Formula/python.rb

输出看起来像这样:

commit 9ff2d8ca791ed1bd149fb8be063db0ed6a67a6deAuthor: Dominyk Tiller <dominyktiller@gmail.com>Date:   Thu Jun 30 17:42:18 2016 +0100
python: clarify pour_bottle reason
commit cb3b29b824a264895434214e191d0d7ef4d51c85Author: BrewTestBot <brew-test-bot@googlegroups.com>Date:   Wed Jun 29 14:18:40 2016 +0100
python: update 2.7.12 bottle.
commit 45bb1e220341894bbb7de6fd3f6df20987dc14f0Author: Rakesh <rakkesh@users.noreply.github.com>Date:   Wed Jun 29 10:02:26 2016 +0530
python 2.7.12
Closes #2452.
Signed-off-by: Tim D. Smith <git@tim-smith.us>
commit cf5da0547cd261f79d69e7ff62fdfbd2c2d646e9Author: BrewTestBot <brew-test-bot@googlegroups.com>Date:   Fri Jun 17 20:14:36 2016 +0100
python: update 2.7.11 bottle.
...

我想要版本2.7.11,所以我的哈希值是cf5da0547cd261f79d69e7ff62fdfbd2c2d646e9(或简称cf5da05)。接下来,我检查该版本并安装公式python

git checkout cf5da05brew install python

最后,清理:

git checkout master

对于当前不在默认brew公式中的版本,您可以使用https://github.com/buildtools-version-taps/homebrew-versions-tap-tool中的工具轻松创建自己的水龙头

我刚刚将一个较旧版本的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

就是这样。这对每个人都有好处

从那以后,一个更新的答案增加了@lance-polard已经发布的工作答案。

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

  1. 找到您的公式文件,例如:https://github.com/Homebrew/homebrew-core/blob/master/Formula/terraform.rb
  2. 如果您在本地克隆了repo,请使用https://github.com/Homebrew/homebrew-core/commits/master/Formula/terraform.rbgit log master -- Formula/terraform.rb从github的历史记录中获取提交版本。
  3. 使用公式的提交版本获取原始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
  4. 安装它:brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/e4ca4d2c41d4c1412994f9f1cb14993be5b2c59a/Formula/terraform.rb

编辑:2021年,由于github安装已弃用,此答案不再起作用。(感谢Tim Smith的更新)。

安装旧的brew包版本(Flyway 4.2.0示例)

查找您当地的自制git dir或在本地克隆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仍然没有内置的安装版本过低的方法,除非该版本作为单独的公式存在(例如python@2postgresql@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 versionsbrew log --format=format:%H\ %s -F --grep=‹version› ‹formula›

    这将显示一个提交哈希列表。取一个合适的(通常它应该非常明显,通常是最近的(即顶部)。

  2. 查找公式位于上游存储库中的URL:

    brew info ‹formula› | grep ^From:
  3. Fix the URL:

    1. Replace github.com with raw.githubusercontent.com
    2. Replace blob/master with the commit hash we found in the first step.
  4. Install the desired version by replacing master in the previously found URL by the commit hash, e.g.:

    brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/‹hash›/Formula/‹formula›.rb

(The last step may necessitate running brew unlink ‹formula› before.)


If you have copied a commit hash you want to use, you can use something like this example to install that version, replacing the value and bash with your commit hash and your desired formula.

BREW_VERSION_SHA=32353d2286f850fd965e0a48bcf692b83a6e9a41BREW_FORMULA_NAME=bashbrew 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 hoodbrew extract --version='4.4.23' bash username/repo-namebrew 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 edit [formula]。例如。假设我们想安装icu4c62.1版本(例如postgresql 10.5需要)。然后你必须

> brew edit icu4c# drops you to editor

在这里,您必须将urlversionsha256(可能还有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版本。

我已经尝试了这里的大多数解决方案,它们已经过时了。我不得不将这里的一些想法与我自己的工作结合起来。因此,我创建了一个脚本来帮助我完成繁重的工作,你可以找到这里

用法:

brewv.sh formula_name desired_version

官方方法(从对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 hoodbrew extract --version=4.4.23 bash $USER/local-tap# Install your new version from the tapbrew 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 Homebrewexport BREW_FORMULA_SEARCH_VERSION=4.4.23 BREW_FORMULA_NAME=bash# This will print any/all commits that match the version and formula namegit -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 downexport 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。

意外升级Postgres?

我的案例:

  • postgresql意外地从11升级到12(在没有参数的情况下运行brew upgrade后)
  • 我想保留Postgres 11。

解决方案:

  1. 停止DB:
brew services stop postgresql
  1. 安装Postgres 11:
brew install postgresql@11
  1. 启用它:
brew link postgresql@11 --force
  1. (可选)将DB数据目录从postgres重命名为postgres@11
cd /usr/local/varls -lhmv postgresql@11 postgresql@11-fresh-backupmv postgres postgresql@11
  1. 启动DB:
brew services start postgresql@11

如果您有任何错误,请选中/usr/local/var/log/postgresql@11.log(注意@11)。

我创建了一个工具来简化这个答案中规定的过程。

要查找版本a.b.c的包pkg,请运行:

$ brew-install-specific pkg@a.b.c

这将列出pkg自制公式上的提交,这些提交提到给定的版本以及它们的GitHub URL。

Matching versions:1. pkg: update a.b.c bottle.https://github.com/Homebrew/homebrew-core/commit/<COMMIT-SHA>2. pkg: release a.b.c-betahttps://github.com/Homebrew/homebrew-core/commit/<COMMIT-SHA>3. pkg a.b.chttps://github.com/Homebrew/homebrew-core/commit/<COMMIT-SHA>
Select index:

验证来自给定URL的提交,并输入所选提交的索引。

Select index: 2Run:brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/<COMMIT-SHA>/Formula/pkg.rb

复制并运行给定的命令进行安装。

现在不支持brew versionsbrew install https://raw.githubusercontent.com/Homebrew/homebrew-core/<COMMIT-HASH>/Formula/<Formula>.rb

你可以试试这样:

$ brew extract --version 5.6.2 gradle vitahlin/core$ brew install gradle@5.6.2

这是我如何降级KOPS(不支持版本控制)

# brew has a git repo on your localhostcd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
git remote -vorigin  https://github.com/Homebrew/homebrew-core (fetch)origin  https://github.com/Homebrew/homebrew-core (push)
# find the version of kops.rb you needgit log Formula/kops.rb
# checkout old commit# kops: update 1.18.1 bottle.git checkout 2f0ede7f27dfc074d5b5493894f3468f27cc73f0 -- Formula/kops.rb
brew unlink kopsbrew install kops
# now we have old version installedls -1 /usr/local/Cellar/kops/1.18.11.18.2
which kops/usr/local/bin/kopsls -l /usr/local/bin/kops/usr/local/bin/kops -> ../Cellar/kops/1.18.1/bin/kopskops versionVersion 1.18.1
# revert to the newest versionbrew uninstall kopsgit checkout -fbrew link kopskops versionVersion 1.18.2

最近Homebrew发生了变化。以前有效的东西不再有效了。我发现最简单的工作方法(2021年1月)是:

  • 找到我的软件的.rb文件(首先转到公式,找到我需要的文件,然后单击“历史记录”;对于CMake,这是在https://github.com/Homebrew/homebrew-core/commits/master/Formula/cmake.rb
    • 在修订版中选择所需的版本,例如3.18.4,单击.rb文件diff()右上角的三个点,然后单击Raw。复制URL。
  • 取消旧版本的链接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安装

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

解决方案

brew extract --version=8.4p1  openssh homebrew/caskbrew install openssh@8.4p1

最新的openssl@8.5p1在我运行brew upgrade后有错误,所以我通过上述方式成功地返回到以前的版本。

在这里,我对它的简单回答-真的很恼火,因为没有内置的解决方案,所以我建立了自己的懒惰“脚本”。随时贡献😃👍🏻

# Please define variablespackageName=<packageName>packageVersion=<packageVersion>
# Create a new tabbrew tap-new local/$packageName
# Extract into local tapbrew extract --version=$packageVersion $packageName local/$packageName
# Verify packages is presentbrew search $packageName@
# Run brew install@version as usualbrew install local/$packageName/$packageName@$packageVersion

https://gist.github.com/ArgonQQ/cff4834dab6b254cc2140bb1454b47ef

这里的其他答案都很棒,但是如果您需要安装较旧版本的包并确保包名称已被修改,则需要另一种方法。当使用脚本(在我的情况下,PHP构建脚本)时,这很重要,这些脚本使用brew --prefix package_name来确定用于编译的目录。

如果您使用的是brew extract,则会在包名的末尾添加一个版本,这将破坏brew --prefix查找。

以下是如何在保持原始软件包名称的同时安装旧版本的软件包:

# uninstall the newer version of the package that you accidentally installedbrew uninstall --ignore-dependencies icu4c
# `extract` the version you'd like to install into a custom tapbrew tap-new $USER/local-tapbrew extract --version=68.2 icu4c $USER/local-tap
# jump into the new tap you createdcd $(brew --repository $USER/local-tap)/Formula
# rename the formulamv 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 extractednano icu4c.rb
# then, install this specific formula directlybrew install $(brew --repository $USER/local-tap)/Formula/icu4c.rb

我在这里写了更多关于这个的内容。

对于2022年,其他答案都没有充分涵盖这一点,所以我添加了这些说明,这些说明改编自Homebrew维护者对安装特定Cask版本的类似问题的回答:https://stackoverflow.com/a/62765875/6310633

卸载你的公式

brew uninstall <formula>

切换到homebrew-core存储库的克隆并重置为包含所需版本的提交。

cd "$(brew --prefix)/Library/Taps/homebrew/homebrew-core/Formula"git log <formula>.rb # examine recent commits for <formula>git reset --hard <commit-sha> # reset clone to last known-good commit for <formula>

为您的版本签出一个新分支,以便brew不会在每个命令后自动刷新master,安装您的公式并固定它。

git checkout -b <formula>-downgrade-<version>brew install <formula>brew pin <formula>

清理干净

git checkout masterbrew update

当你准备好升级你的公式时,你可以brew unpin <formula>并像往常一样升级。