大家好我叫乌图米,我会在这里陆续跟大家分享一些有的没的数码体验、软件技巧、系统知识,欢迎大家留言与我交流~如果你喜欢文章的内容,可以在文末点个赞 ,你的支持就是我最大的动力 !

这篇文章介绍一下 Homebrew 如何安装历史软件包。有两种方式,可以添加「homebrew-versions」仓库得到历史版本软件包,也可以主动搜寻历史版本的.rb安装文件进行安装。

如果你还不知道什么是 Homebrew,笔者这里有一篇介绍它的文章:乌图米:macOS Homebrew 马克​zhuanlan.zhihu.com

0 软件包迭代与依赖

软件包随着时间推移,会逐渐更新功能、修复问题,呈现为版本号的向上迭代。brew install安装的时候是一个版本,隔段时间可能软件包更新了,便可以使用brew upgrade去更新它。

另一方面,软件包之间存在着依赖关系。开发者可以引用已经提供的软件,使用其中的一些功能,满足自己软件包的需求。由于被依赖存在变动,因此往往会指定一个依赖软件包的版本,避免意料之外的错误。

已知 Homebrew 安装的软件包只能是目前最新的,那么在这样的大环境下就会造成一些问题:如果安装软件包 A 时,需要依赖软件包 B 版本v1.2,但此时软件包 B 已经更新到了v2.0了,无法再用 Homebrew 安装v1.2版的软件包 B。

引出的需求是:如何使用 Homebrew 安装历史版本的软件包?

1 自带仓库的历史版本

事实上,多数软件包之间设定依赖关系时,没有非常严格的版本号限制,往往是比较大的版本要求,例如:不低于v1.2,不高于v2.0。严格一点就会直接指定软件版本:必须是v1.2.4。

肯定有相当多的软件包依赖于许多大型软件包的历史版本。因此,随着 Homebrew 的发展,许多主流的历史版本软件包渐渐被被官方仓库收录,例如python@2,node@12等等。

这些软件包只是大的历史版本,没有细致的划分。Homebrew 收录的python@2的版本是v2.7.17,node@12的版本是v12.16.0。并且这些软件包依然可以安装较小的版本更新。这有点类似于 Windows 10 推出后,微软依旧在为 Windows 7 提供更新。以安装历史版本的node.js为例,直接搜索node:

~ > brew search node

==> Formulae

libbitcoin-node node node-sass node@12 ✔ nodebrew nodenv

llnode node-build node@10 node_exporter nodeenv

==> Casks

font-ubuntu-mono-derivative-powerline nodeclipse

nodebox soundnode可以看到一共有三个node版本。有最新的node,也有两个历史版本node12和node10。直接安装对应的历史版本即可。

brew info node@12

brew install node@12

2 添加仓库「homebrew-versions」获取历史版本

顺便给出笔者介绍为 Homebrew 添加更多仓库的文章:乌图米:Homebrew Taps 更多仓库马克​zhuanlan.zhihu.com

对于「Casks」类软件包,可以使用添加「homebrew-versions」仓库的方式得到一些比较常用的历史版本。其中的历史版本非常有限。因其收录的要求比较严格,时效也比较短。可以这样添加这个仓库:

brew tap homebrew/homebrew-versions之后直接搜索需要的软件包即可。如果仓库收录了其历史版本,将出现在「Casks」分类下。其名称后面往往直接跟着对应的版本号,例如alfred2。

~ > brew search alfred

==> Casks

alfred alfred2 alfred3值得注意的是,虽然仓库提供的是更多的历史版本,但也提供beta版本的内容。

~ > brew search github-beta

==> Casks

github-beta

你可以在这里看到所有收录的软件包历史版本或测试版本。的确没有多少的内容。

3 根据git历史获取精准历史版本

如果需求是特别精确的软件包版本,那么很可能没有被任何仓库收录。这时候可以通过访问软件包安装文件.rb的历史版本,来安装对应时间的软件包。

原理是个啥?

查看软件包的信息时,输出信息如下:

~ > brew info when

...

From: https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git/Formula/when.rb

...

注意到图中高亮的一句话,显示的是一个.rb后缀的文件,是使用ruby语言编写的文件。ruby也是 Homebrew 主要的编程语言。如果想了解更多ruby相关的内容,可以到其社区查看。打开浏览器,复制粘贴刚刚的文件地址。

注意!如果替换过软件源「介绍 Homebrew文章提到过,以此改善 Homebrew 的下载速度」,显示.rb文件地址将会是替换后的源地址,此时我们需要替换回原来的地址进行查看。例如:

# 现有地址

https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git/Formula/when.rb

# 实际地址

https://github.com/Homebrew/homebrew-core/blob/master/Formula/when.rb

替换的规则,使用下面的地址,替换最后的软件包名称是:

# 替换最后的 [formulae] 为软件包的名称

https://github.com/Homebrew/homebrew-core/blob/master/Formula/[formulae].rb浏览器显示是 GitHub 中的对应文件。观察一下文件内容。这其实是软件安装的相关信息与指令。比较熟悉的就是版本号「重点」,下载链接与校验码。

class When < Formula

...

url "https://deb.debian.org/debian/pool/main/w/when/when_1.1.38.orig.tar.gz"

sha256 "139834945142f5e3ea6b20f43ba740d30b4a87b42ce5767026094e633dca999f"

...

end

其实每次执行brew install指令时,Homebrew 做的事情就是去仓库里面找到对应的.rb文件,这就是安装软件包的执行文件。因此,只要有对应版本的.rb文件,就可以进行对应版本的软件包安装。

现在要做的是:找到历史版本的.rb文件,下载到本地;使用 Homebrew 直接执行这份.rb文件,进入历史版本的安装流程。熟悉git的盆友应该知道,这份文件是最新提交的版本。既然有最新提交的版本,当然有历史版本。点击右上角的「HIstory」按钮,查看历史版本。原本正常的流程是:从提交历史中找到对应的历史版本文件,查看raw文件,保存文件到本地。然而实际上,由于这个仓库过于庞大,直接查看历史版本,通常会遇到无法加载的情况。

那就下来还有两种方法可以尝试,用于获取历史版本.rb文件。第二种是利用本地历史仓库,查看本地历史的提交记录,获取其中旧版本文件的url与sha256片段。

第三种是直接主动修改当前.rb文件的url与sha256片段,欺瞒 Homebrew 进行安装。

目前以上三种方法的前两种,笔者都没有找到when这个软件包的历史版本。陷入沉思,应该与换源有很大关系。等回头搞清楚了再来更新。

但是第三种可以「耍赖」地尝试一下:保存当前最新的.rb文件到本地,当然里面的版本号是v1.1.38。编辑when.rb,我们耍赖地其中版本号修改为v1.1.36。当然,可以修改为任意存在的版本,可以自己尝试。改完记得保存一下。回到 Homebrew,使用这份修改过的when.rb文件来安装when软件包。你可以选中文件之后,cmd + option + c复制文件路径。

brew install /Users/tommy/Downloads/when.rb # 注意这里是你下载文件的路径!「毫不意外」的回报错:第一,我替换的清华镜像源中没有该历史版本,不过它会自动转为开发者提供的下载链接;第二,文件的校验码不对,根据文件期望得到的值与实际值不吻合。我们继续耍赖。将校验码实际值复制下来,编辑when.rb,替换其中的校验码为我们刚刚复制到的、所下载文件的实际校验码。这是在规避校验码无法匹配的问题。重新执行上面的安装指令。现在可以看到,文件可以正常安装了。最后执行一下brew info when。可以看到,此时安装的版本是v1.1.36,不是最新的v1.1.38。

总结一下,上面三种方法都是利用旧的本地.rb 文件,实现旧版本的安装。其中第三种是比较通用的,因为你可以「耍赖」地无限尝试。尤其是当有依赖包指定了具体的版本号,就更容易了。

4 锁定软件包

好不容易安装好了历史版本的软件包,当然最好是锁定它,避免其被更新。使用pin指令锁定以安装的软件包。之后不会在upgrade指令中更新被锁定的软件包。

brew pin when # 锁定在ls指令后添加--pinned参数查看当前全部被锁定的软件包与版本号。

brew ls --pinned # 查看当前锁定的软件包版本使用unpin指令解除软件包的锁定。然后可以正常在outdated和upgrade指令中查看和更新落伍的软件包。

brew unpin when # 解锁

尤其注意,如果你对这个软件包的依赖是长期的,那么尽量锁定;如果只是暂时的需求,可以不用锁定。

不过,可以看到,upgrade指令发现pinned软件包时,将直接提示报错。这说明 Homebrew 是非常不提倡固定软件包版本的。

5 注意事项

有一些需要注意的地方:不建议使用历史软件包,Homebrew 也是同样的态度。更新总是有原因的,尽量向新版本看齐。

如果已经安装了更新版本的软件包、再安装旧版,是不可以覆盖安装的。安全的操作是先brew unlink取消软件包的关联,再卸载新版本软件包,最后尝试安装更旧的版本。

理论上来说,只要可以获取某个时期的安装包及其对应的校验码,都是可以甩给 Homebrew 安装的。但获取正确的校验码及文件,还是需要参考仓库的提交历史。

「耍赖」方法一时爽,一直耍赖小心出问题 。

共同学习,武汉加油!

brew search怎么看版本_Homebrew 安装旧版本软件包马克相关推荐

  1. 解决Pthon中无法安装旧版本TensorFlow问题

    解决Python中无法安装旧版本TensorFlow问题 前言 一.报错信息 二.报错原因 三.解决方案 conda命令学习 最终解决 如何使用新创建的环境 pycharm Jupyter 前言 当我 ...

  2. 如何安装旧版本的 R 包

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 我们在安装 R 包的时候,经常会发现某个最新的包与当前 R 的版本不兼容. > inst ...

  3. 苹果4s手机装 java微信_苹果4s版本过低不能下载微信怎么安装旧版本的

    苹果4s版本过低不能下载微信怎么安装旧版本的以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 没越狱的话就只能连接itun ...

  4. Apple store安装旧版本的软件

    Apple store安装旧版本的软件 算了,真的没有折腾的必要,tmd

  5. 20220413安装旧版本的百度网盘的方法

    20220413安装旧版本的百度网盘的方法 您的电脑已安装版本更高的百度网盘客户端, 如需降级安装,请先卸载当前版本. 新电脑装最新的百度网盘之后,感觉不适应,降级的时候出现这个问题了! 人不如旧,衣 ...

  6. 【ipad+向日葵远程控制】解决ipad上在向日葵中无法使用上下左右键、Tab键(解决方法是:在ipad上安装旧版本向日葵11.2.2,配合使用的是罗技K380键盘)

    目录 参考链接 需要用到的3个工具(都是在Windows电脑上操作的) 开始配置 1. iTunes登录自己的账号 2. 安装旧版本 2.1 iTunes中打开向日葵APP的页面,然后把 iTunes ...

  7. 如何给未越狱的ios下载历史版本的app?未越狱IOS系统安装历史版本软件的方法,iPhone未越狱的手机如何安装旧版本APP?

    如何给未越狱的ios下载历史版本的app?未越狱IOS系统安装历史版本软件的方法,iPhone未越狱的手机如何安装旧版本APP? IOS由于系统机制问题不支持版本回退 某些更新可能导致闪退 卡顿等未知 ...

  8. 问题解决:pycharm pip无法更新,显示更新成功,但版本依然是旧版本

    问题解决:pycharm pip无法更新,显示更新成功,但版本依然是旧版本 问题提出 pycharm中有时必须要求使用最新版本的pip,否则无法安装相关包.但是在软件内部setting-python ...

  9. 如何在旧的iPhone或iPad上安装旧版本的iOS应用

    Your old iPad might be still going strong, but if all your apps need newer versions of iOS to run, i ...

最新文章

  1. 深入理解Java Proxy和CGLIB动态代理原理
  2. QT之Quick学习笔记之一(Hello Qquick)
  3. 多元线性回归分析问题
  4. [css] 使用纯css来创建一个滑块
  5. spring事务的传播属性
  6. 利用OGG实现Oracle到Kafka到Greenplum的增量数据同步
  7. 如何删除所有已合并的Git分支?
  8. Java新职篇:什么是键入程序
  9. CSS3控制背景图片大小
  10. 问题三十四:怎么用ray tracing画任意长方体(generalized box)
  11. PIE SDK导出图片
  12. python-学生管理系统--4修改学生信息
  13. ug安装计算机用户名不能是汉字,win7系统下安装UG软件后打开提示计算机名不对怎么办...
  14. 考心理健康教育教师资格证-初出茅庐
  15. Android开发--WIFI输入密码Dialog的实现
  16. 技术管理者对知识组织的认识
  17. 实战教程 | 用让新海诚本人惊讶的 AI 模型制作属于你的动漫视频
  18. 服务器系统磁盘分区,服务器磁盘分区教程
  19. 几款支持GB28181的平台
  20. python书籍收集

热门文章

  1. Hadoop发展历程
  2. 关于“内购破解”等盗版软件、游戏的危害
  3. Hystrix核心原理和断路器源码解析
  4. VS快捷键-多行注释
  5. ar开发 ue4_助力VR/AR行业应用开发,UE4全面支持ARKit和ARCore
  6. 《安富莱嵌入式周报》第304期:开源硬件耳机设计,AI单片机STM32N6已确定为M55内核,另外还有新品STM32H5, H50X, H7R, H7S发布
  7. 【调剂】211中国矿业大学(徐州)2020年硕士研究生拟调剂专业
  8. 股票的成交量和成交额
  9. dlsym 如何查看一个so里面的_Android so 文件进阶二 从dlsym()源码看android 动态链接过程...
  10. android自定义下拉筛选,android自定义Spinner下拉菜单(下拉列表框)样式