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


2195

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


2
postgresql之所以很奇怪,是因为它在某一时刻在Homebrew中有不同的版本,bash可能是一个更好的示例,因为它在同一公式名称中从4.x变为5.x。参见stackoverflow.com/a/55764594/3794873
dragon788 '19


2
我读了所有答案。现在是2020年,没有简单的方法或官方命令可以做到这一点
oluckyman,

Answers:


2556

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


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

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

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查找'8.4.4'文件中添加或删除了字符串的所有提交Library/Taps/homebrew/homebrew-core/Formula/postgresql.rb。结果是两次提交。

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 pin postgresql

固定的公式已列出,/usr/local/Library/PinnedKegs/一旦您要引入最新的更改和更新,就可以再次取消固定

$ brew unpin postgresql

18
您也可以使用检出公式git checkout fa992 -- Library/Formula/postgresql.rb。完成后,您可以使用撤消对公式的更改git revert HEAD Library/Formula/postgresql.rb && git checkout -- Library/Formula/postgresql.rb
mipadi

18
注意:在全新安装的Homebrew上,您可能需要brew update建立其Git存储库。
2011年

555
这是非常荒谬的。
Dogweather

29
到今天为止,对存储库执行手动命令的正确目录是cd $(brew --repository)/Library/Taps/homebrew/homebrew-core,然后可以使用git checkout 4cce79d -- Formula/go.rbHOMEBREW_NO_AUTO_UPDATE=1 brew install go
卡林

12
不推荐使用自制软件/版本
Ezekiel Victor

775

简单的工作流程

现在不推荐使用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

8
似乎最简单,但是当我复制粘贴时,得到fatal: Not a git repository (or any of the parent directories): .git。我只是cd进入目录(没有FORMULANAME.rb),然后执行git checkout 120938
Ramon Tayag

8
@RamonTayag,我有同样的问题。一定cd /usr/local要先。
gjb 2012年

13
我发现您需要执行第3.5步:brew unlink FORMULANAME
Intents

37
brew versions <formula>不再受支持。
ejoubaud 2014年

4
@ dem7w2,您可以使用创建符号链接brew link --force postgresql@9.5。如果您已经安装了较新的版本,并且希望将较旧的版本作为默认版本,则也需要--overwrite在其中提供一个。
瑞安

457

现在,有一种更简便的方法来安装以前安装的公式的旧版本。只需使用

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上的更多文档。


2
我尝试了此操作,它成功地显示了消息“为/usr/local/Cellar/node/0.4.7创建了33个链接”,但是当我随后运行节点时,它失败并显示消息-bash:/ usr / local / bin / node:没有这样的文件或目录。知道发生了什么事吗?注意:我手动下载了0.4.7并将其放在地窖目录中,因为我不知道如何使用brew下载最新版本的节点。
Soroush Hakami 2011年

6
希望您知道有一个叫做“ nvm”的东西[ github.com/creationix/nvm]
Gaurav Agarwal

40
我依靠已经安装的软件包版本。如果缺少该版本,则仍然需要应用所选答案。
Nic Strong 2013年

1
特别是对于节点版本mgmt,nvm是更好的解决方案,恕我直言。
cweekly 2014年

5
@NicStrong确实,brew switch依赖于已经安装的抢手版本。但是,不幸的是,当前接受的答案非常无助,令人费解并且过时。 更好的答案,低于该是多少更有帮助。
GDP2

250

更新: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

46
这是唯一对我有用的东西。愚蠢的是,程序包管理器只需要安装以前的版本就需要很多工作。也许我对ruby RVM和bundler感兴趣,但是确实需要简化和抽象该过程。
poetmountain

3
当我尝试使用旧版本的Ansible时,必须按指示取消链接公式,然后再安装旧版本。这样做之前brew install <url>brew unlink <formulaname>。否则,这是迄今为止切换到特定版本公式的最简单,最简洁的方法。
bigsweater 2015年

Raw按了什么文件上的按钮?!
Iulian Onofrei '16

1
它可以工作,但是有时您必须下载原始.rb文件并更改校验和,以避免Homebrew抱怨SHA不匹配。GitHub似乎在2017年的某个时候重新整理了大部分repo树,它们的校验和也发生了变化。(实际上,去年9月当Bazel因哈希不匹配而失败时,这在我的团队中引起了很大的困惑)
张谦

6
我在brew log <formula>
kangkyu

128

按照@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

8
如果所需的软件包版本在核心package@version
仓库中

7
如果无法使用Web界面,则可以克隆存储库并在本地进行:使用git log master -- Formula/PACKAGENAME.rb以获取提交历史记录,签出正确的提交,然后运行brew install Formula/PACKAGENAME.rb以进行安装。
Chipbuster

7
我认为您需要其他版本brew unlink之前brew install
studgeek

这是mxcl谁啊
PJSCopeland

1
我这样做了,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.任何想法?
msciwoj

109

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

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
嗯,brew install https://github.com/Homebrew/homebrew-versions/blob/master/node06.rb似乎因语法错误而失败。
Brian Armstrong

6
@BrianArmstrong您所指的是该文件的html格式版本,而您需要一个原始版本
Nikita Volkov 2013年

转到github.com/Homebrew/homebrew/commits/master/Library/Formula/…,选择您的版本,浏览代码,原始-使用此URL。
jpillora

1
不要忘记rawURL中的
Faber

9
homebrew-versions是走了,一切都上core了,所以一般情况下是:brew install https://raw.github.com/Homebrew/homebrew-core/<COMMIT>/Formula/<FORMULA>.rbCOMMIT可以通过访问github.com/Homebrew/homebrew-core/commits/master/Formula/…找到。
PJSCopeland '18

78

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

  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按钮查看修订历史,该按钮位于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中的COM标识)。

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

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

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

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


13
不幸的是,这在答案列表中太低了,但是是最好的解决方案。这就是我所使用的,除了使用braumeister之外,我只是转到我想要的公式的Homebrew GitHub页面(例如,对于gcc,请访问github.com/Homebrew/homebrew/blob/master/Library/Formula/gcc.rb),然后浏览文件的“历史记录”,直到获得所需的版本。
Guy Kogus

3
对于我而言,这绝对是最好的解决方案-安装不需要Xcode 8.1的Watchman的较早版本
Zachary Keener 2016年

3
这确实是安装较旧版本的最简单方法。好的答案
马丁

4
这对我有用,但我必须先冲泡解除软件的链接。
Brett Wagner

3
这对我来说是最简单的解决方案。由于接受的答案已过时,因此应该更高。
Tim W

35

到目前为止,其他大多数答案都已过时。不幸的是,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 versions
    brew log --format=format:%H\ %s -F --grep=‹version› ‹formula›
    

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

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

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

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

    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或任何其他公式。


1
他们显然改变了语法brew log,所以任何额外的-F--grep选项中没有适合我。
dragon788

1
@ dragon788血腥的地狱,自制2完全崩溃了brew log。现在我不必费心编写一个新版本,因为这需要正确地解析git日志消息,或者git log直接在相应的存储库上运行。而且更改日志似乎甚至都没有提到这一重大更改。除了烦人。
康拉德·鲁道夫

除非他们接受行为更改是一个错误,否则似乎External Command可能需要在结构中brew进行操作才能获得这种类型的git log过滤。docs.brew.sh/External-Commands
dragon788 '19

这是我唯一能够找到正确brew extract用法的地方,谢谢!
dognotdog

我建议使自定义local0only轻按答案的第一部分。总体看来,这似乎是最好的解决方案。
studgeek '19

29

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

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

$ brew取消链接Maven

使用酿造水龙头命令

$ brew tap自制/版本
克隆到'/ usr / local / Library / Taps / homebrew-versions'...
远程:计数对象:590,已完成。
远程:压缩对象:100%(265/265),已完成。
远程:总计590(增量362),已重用549(增量325)
接收物体:100%(590/590),117.49 KiB | 已完成79 KiB / s。
解析增量:100%(362/362),已完成。
窃听50式

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

$ brew install maven2
==>下载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个文件,3.1M,6秒内建立
$ mvn-版本
Apache Maven 2.2.1(r801777; 2009-08-06 12:16:01-0700)
Java版本:1.6.0_37
Java主页:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
默认语言环境:en_US,平台编码:MacRoman
操作系统名称:“ mac os x”版本:“ 10.7.4”拱门:“ x86_64”家族:“ mac” 

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

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


这非常有帮助。请注意,apache基础已经将Maven二进制文件重组到了特定于版本(1,2,3)的目录中,因此您需要为2.2.1以及其他版本编辑maven.rb以适应新的结构。例如,用于2.2.1的二进制文件位于:apache.org/dist/maven/maven-2/2.2.1/binaries/…。注意URL中的“ maven-2 / 2.2.1 /”。
Charles Forcey

@CharlesForcey您对重组的Maven dist回购是正确的。我将更新答案以使用Brew Tap使用较旧的maven2公式。感谢您的评论。
卡梅隆·古德莱


18

自那以来的最新答案增加了@ lance-pollard已作为工作答案发布的内容。

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

  1. 查找公式文件,例如:https : //github.com/Homebrew/homebrew-core/blob/master/Formula/terraform.rb
  2. 使用https://github.com/Homebrew/homebrew-core/commits/master/Formula/terraform.rb或从git 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

要在第3步中获取原始git URL,您还可以点击“ Raw”按钮并复制浏览器将您带到的URL。
Brian Topping

15

官方方法(从对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或将其设置为默认外壳程序。


12

在最新版本的自制软件(在撰写本文时为0.9.5)上,将针对您要安装的自制啤酒桶的版本提供特定的配方。例:

$ brew search mongodb
mongodb    mongodb24  mongodb26

然后像平常一样做brew install mongodb26

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


尽管这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
Erik 2015年

1
@Erik谢谢,固定。
亚历克斯·夏普

11

2020年,大多数答案已过时

我的情况:postgresql意外从11升级到12。我想保留11。

  1. 停止数据库:
brew services stop postgresql
  1. 安装Postgres 11:
brew install postgresql@11
  1. 启用它:
brew link postgresql@11 --force
  1. (可选)将数据库数据目录从重命名postgrespostgres@11
cd /usr/local/var
ls -lh
mv postgresql@11 postgresql@11-fresh-backup
mv postgres postgresql@11
  1. 启动数据库:
brew services start postgresql@11

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


6
这仅适用于postgresql @ 11的特殊情况,它由Homebrew维护人员明确保留,以帮助进行数据存储区迁移(使用special命令执行brew postgresql-upgrade-database)。对于几乎所有其他公式,此答案都没有用。
亚当·沃贝尔

@AdamWróbel我已经决定,最好回答有关Postgres的原始问题brew postgresql-upgrade-database是,对于升级。我的答案是关于使用较旧的 Postgres版本。仅仅切换二进制文件是行不通的。
Max Malysh

不使用版本管理器(例如nvmFYI)的NodeJS用户我很幸运在较早的LTS版本中使用此技术。至少在撰写本文时,v10和v12应该可用,例如brew install node@12 Formulae.brew.sh/formula/node
爪子

10

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

我有一个问题要安装的特定旧版本docker-machine未在中列出homebrew/versions。我使用以下方法解决了该问题,该方法也适用于所有brew安装的软件。下面的示例将docker-machine用作我要从0.5.0版本降级到0.4.1的软件包。

  1. 去你家酿 Formula目录。
    您可以通过运行确定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

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

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

    ...更多 

    提交20c7abc13d2edd67c8c1d30c407bd5e31229cacc
    作者:BrewTestBot 
    日期:2015年11月5日星期四16:14:18 +0000

        docker-machine:更新0.5.0瓶子。

    提交8f615708184884e501bf5c16482c95eff6aea637
    作者:Vincent Lesierse 
    日期:2015年10月27日星期二22:25:30 +0100

        码头工人机器0.5.0

        将docker-machine更新为0.5.0

        关闭#45403。

        签字人:多米尼克·蒂勒 

    提交5970e1af9b13dcbeffd281ae57c9ab90316ba423
    作者:BrewTestBot 
    日期:2015年9月21日星期一14:04:04 +0100

        docker-machine:更新0.4.1瓶子

    提交18fcbd36d22fa0c19406d699308fafb44e4c8dcd
    作者:BrewTestBot 
    日期:2015年8月16日星期日09:05:56 +0100

        docker-machine:更新0.4.1瓶子

    ...更多

棘手的部分是找到所需特定版本的最新提交。在上面的代码中,我可以知道最新的0.4.1版本是使用以下commit标记提交的: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.rb
git checkout -- docker-machine.rb

然后,您可以brew uninstall docker-machinebrew install docker-machine获得最新版本,并继续保持最新状态。


1
非常详尽地写出@rchawdry,谢谢。顺便说一句:要找到与您想要的版本匹配的提交,请快速添加--grep参数git log --grep 0.4.1 docker-machine.rb
杰里·明德克

对我来说,道路是/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
akauppi '16

我无法以cairo这种方式找到足够的版本历史记录。由于某种原因,@ sealocal的答案显示了更多。
akauppi

9

安装旧的Brew软件包版本(Flyway 4.2.0示例)

查找您的本地自制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


为什么不简单地brew install Formula/flyway.rbhomebrew-core目录运行?它对我raw.github..
有用,却

8

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

用法:

brewv.sh formula_name desired_version

6

对于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)

2
...如果有人不愿为该软件包创建版本控制的配方。
clacke 2014年

6

这些都不适合我的情况(Python),因此我加2美分:

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

输出看起来像这样:

commit 9ff2d8ca791ed1bd149fb8be063db0ed6a67a6de
Author: Dominyk Tiller <dominyktiller@gmail.com>
Date:   Thu Jun 30 17:42:18 2016 +0100

    python: clarify pour_bottle reason

commit cb3b29b824a264895434214e191d0d7ef4d51c85
Author: BrewTestBot <brew-test-bot@googlegroups.com>
Date:   Wed Jun 29 14:18:40 2016 +0100

    python: update 2.7.12 bottle.

commit 45bb1e220341894bbb7de6fd3f6df20987dc14f0
Author: 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 cf5da0547cd261f79d69e7ff62fdfbd2c2d646e9
Author: 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 cf5da05
brew install python

最后,清理:

git checkout master

2
生活改变了,这个答案是最相关的。不要忘记HOMEBREW_NO_AUTO_UPDATE并阅读github.com/Homebrew/brew/issues/1188
Wile E.

正确的命令是cd brew --prefix /Homebrewgit log Library/Taps/homebrew/homebrew-core/Formula/python.rb
Iulian Onofrei

但是即使那样也不起作用,因为/Library/Taps被忽略了。
Iulian Onofrei

不要忘了HOMEBREW_NO_AUTO_UPDATE。是的,发现需要的东西之前,不要忘记您需要的东西。xD
Josh Habdas,

这个怎么样?HOMEBREW_NO_INSTALL_CLEANUP这不是您需要记住的东西吗?
kangkyu

6

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

这是通过brew安装较旧版本的nginx的示例:

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

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


3

当前,不赞成使用旧的安装特定公式版本的方法。因此,似乎我们必须使用brew edit [formula]。例如,说我们要安装的62.1版本icu4c(例如需要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版本。


如何获得sha256 ?就我而言https://storage.googleapis.com/dart-archive/channels/stable/release/1.24.3/sdk/dartsdk-macos-x64-release.zip
simo

1

将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

希望有帮助:)


1

我只是将旧版本的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

而已。也许对任何人都有用。


丑陋的骇客。但是,是的,当我尝试搜索并安装旧版本的领事时,它也对我有用!干杯。
darkdefender27 '18

0

我做出了更好的判断,决定为Maven 3.1.1创建一个公式,该公式homebrew/versions没有。去做这个:

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

好极了。



0

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

要查找pkg具有version 的软件包a.b.c,请运行:

$ 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-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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.