allegro多版本安装_Homebrew 安装旧版本软件包马克

99528af5edaf70c8a77cd0694799edda.png

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

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

如果你还不知道什么是 Homebrew,笔者这里有一篇介绍它的文章:

乌图米:macOS Homebrew 马克​zhuanlan.zhihu.com
65be59761df5527e9571ccd7ee32ef49.png

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@2node@12等等。

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

  • 以安装历史版本的node.js为例,直接搜索node

1f3b4c77afa1368895c2eda1a955f0c3.png
~ > 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,也有两个历史版本node12node10。直接安装对应的历史版本即可。
brew info node@12
brew install node@12

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

顺便给出笔者介绍为 Homebrew 添加更多仓库的文章:

乌图米:Homebrew Taps 更多仓库马克​zhuanlan.zhihu.com
5e839328b7505858827086c5d1fa2414.png

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

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

7635afd9154d3a98e95c855daef251af.png
~ > brew search alfred
==> Casks
alfred                        alfred2                        alfred3
  • 值得注意的是,虽然仓库提供的是更多的历史版本,但也提供beta版本的内容。

9467a1fc26f9a27d1516a2bfa15ed294.png
~ > brew search github-beta
==> Casks
github-beta

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

0a4b62ccb88d9379c610de35d8a83e0a.png

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

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

原理是个啥?

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

fdbeccde06d33b62c7d00c3301515b5f.png
~ > 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 中的对应文件。观察一下文件内容。这其实是软件安装的相关信息与指令。比较熟悉的就是版本号「重点」,下载链接与校验码。

59e92612ef69ed9a3d403f91f97f2d87.png
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」按钮,查看历史版本。

7d0216793a9f2cbc3e2ece069aeaabf0.png
  • 原本正常的流程是:从提交历史中找到对应的历史版本文件,查看raw文件,保存文件到本地。然而实际上,由于这个仓库过于庞大,直接查看历史版本,通常会遇到无法加载的情况。

74f320bdb41051a64e13b242c7dd457d.png

那就下来还有两种方法可以尝试,用于获取历史版本.rb文件。

  • 第二种是利用本地历史仓库,查看本地历史的提交记录,获取其中旧版本文件的urlsha256片段。
  • 第三种是直接主动修改当前.rb文件的urlsha256片段,欺瞒 Homebrew 进行安装。

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

但是第三种可以「耍赖」地尝试一下:

  • 保存当前最新的.rb文件到本地,当然里面的版本号是v1.1.38。编辑when.rb,我们耍赖地其中版本号修改为v1.1.36。当然,可以修改为任意存在的版本,可以自己尝试。改完记得保存一下。

94fa90a5cba0f8c494f1137d3885ff2e.png

348bf2b791a756e37ebb1d75efbea50c.png
  • 回到 Homebrew,使用这份修改过的when.rb文件来安装when软件包。你可以选中文件之后,cmd + option + c复制文件路径。
brew install /Users/tommy/Downloads/when.rb  # 注意这里是你下载文件的路径!
  • 「毫不意外」的回报错:第一,我替换的清华镜像源中没有该历史版本,不过它会自动转为开发者提供的下载链接;第二,文件的校验码不对,根据文件期望得到的值与实际值不吻合。

61179f344dc146a832bebcf24004645a.png
  • 我们继续耍赖。将校验码实际值复制下来,编辑when.rb,替换其中的校验码为我们刚刚复制到的、所下载文件的实际校验码。这是在规避校验码无法匹配的问题。

ebbe956ded88513ad074e7d844a4e06f.png
  • 重新执行上面的安装指令。现在可以看到,文件可以正常安装了。

d8c93860b1d65bac90f8ebf47d8ffe2c.png
  • 最后执行一下brew info when。可以看到,此时安装的版本是v1.1.36,不是最新的v1.1.38

ea27ecf14ca5df4b68f60a30ab323ac5.png

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

4 锁定软件包

好不容易安装好了历史版本的软件包,当然最好是锁定它,避免其被更新。

  • 使用pin指令锁定以安装的软件包。之后不会在upgrade指令中更新被锁定的软件包。

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

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

2617d125a11e1dddd2fb348a033b2cda.png
brew unpin when  # 解锁

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

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

5 注意事项

有一些需要注意的地方:

  • 不建议使用历史软件包,Homebrew 也是同样的态度。更新总是有原因的,尽量向新版本看齐。
  • 如果已经安装了更新版本的软件包、再安装旧版,是不可以覆盖安装的。安全的操作是先brew unlink取消软件包的关联,再卸载新版本软件包,最后尝试安装更旧的版本。
  • 理论上来说,只要可以获取某个时期的安装包及其对应的校验码,都是可以甩给 Homebrew 安装的。但获取正确的校验码及文件,还是需要参考仓库的提交历史。
  • 「耍赖」方法一时爽,一直耍赖小心出问题 。

共同学习,武汉加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用Python实现PDF转文本,就是如此简单!

一、前言 对很多人来说&#xff0c;将PDF转换为可编辑的文本是个刚需&#xff0c;却苦于没有简单的方法。发现 pdf 幻灯片&#xff0c;效果还不错。 传统的讲座通常伴随有很多pdf幻灯片。一般来说&#xff0c;想要对自己的讲座做笔记&#xff0c;需要从pdf复制、补充大量内容…

LeetCode 1725. 可以形成最大正方形的矩形数目

文章目录1. 题目2. 解题1. 题目 给你一个数组 rectangles &#xff0c;其中 rectangles[i] [li, wi] 表示第 i 个矩形的长度为 li 、宽度为 wi 。 如果存在 k 同时满足 k < li 和 k < wi &#xff0c;就可以将第 i 个矩形切成边长为 k 的正方形。 例如&#xff0c;矩形…

Python实现给指定的微信朋友发信息

一、环境准备 1、Python3.6 2、itchat第三方库 pip install itchat-uos 3、pyinstaller第三方库 pip install pyinstaller 二、核心代码 import itchatimport timeprint("请扫描弹出的扫二维码")itchat.auto_login(hotReloadTrue)boom_name input("请输…

LeetCode 1726. 同积元组(排列组合)

文章目录1. 题目2. 解题1. 题目 给你一个由 不同 正整数组成的数组 nums &#xff0c;请你返回满足 a * b c * d 的元组 (a, b, c, d) 的数量。其中 a、b、c 和 d 都是 nums 中的元素&#xff0c;且 a ! b ! c ! d 。 示例 1&#xff1a; 输入&#xff1a;nums [2,3,4,6] 输…

vuedraggle choose_如何拆分员工工资条,教你一招一学就会。(五)函数CHOOSE

作为人事管理者&#xff0c;我们最重要的一个工作就是工资表&#xff0c;那么如何将工资表拆分成工资条呢&#xff1f;我们最后看一下函数CHOOSE对函数MOD、ROW、OFFSET 、INT的嵌套使用。第一步&#xff0c;我们输入函数CHOOSE&#xff0c;第一个值是序号&#xff0c;我们将之…

用pythone画棵圣诞树,祝大家圣诞快乐

一、python环境&#xff1a; 根据电脑的情况去下载对应的python安装包&#xff0c;我使用的是python3.7.0的版本 二、python编译器&#xff1a; 打开pycharm&#xff0c;然后我们创建一个project&#xff0c;在project下创建一个python file&#xff0c;建议取名字不要使用中…

LeetCode 1727. 重新排列后的最大子矩阵(前缀和+排序)

文章目录1. 题目2. 解题1. 题目 给你一个二进制矩阵 matrix &#xff0c;它的大小为 m x n &#xff0c;你可以将 matrix 中的 列 按任意顺序重新排列。 请你返回最优方案下将 matrix 重新排列后&#xff0c;全是 1 的子矩阵面积。 示例 1&#xff1a; 输入&#xff1a;ma…

亚马逊出的平板电脑_亚马逊Fire HD 8 Plus评测:适合看视频和轻度游戏的廉价平板...

导语&#xff1a;近日&#xff0c;亚马逊升级了旗下的Fire HD 8和Fire HD 8 Plus平板电脑&#xff0c;使其具有更多的内存&#xff0c;更快的处理器和USB-C充电功能。亚马逊Fire HD 8 Plus是Fire HD 8 的一个增强版本&#xff0c;它提供了较HD8更快的速度&#xff0c;拥有一些通…

利用python转换图片格式

前言 常见的图像任务通常需要把照片统一成相同的格式&#xff0c;所以此文章正是为了统一格式而生&#xff0c;常见的主要有cv2和PIL.Image的相关操作&#xff0c;照片格式是一串数字加上后缀名 工具一&#xff1a;cv2 pip install opencv-python 之后就可以 import cv2 1.…

苹果台式机_苹果史上最强台式机来了:顶配售价45万

12月11日消息&#xff0c;国行版Mac Pro正式在苹果官网上架开售。根据苹果官网显示&#xff0c;Mac Pro最基础版本需要花费47999元&#xff0c;基础版Mac Pro配置上采用3.5GHz 8核Intel Xeon W处理器&#xff0c;32GB (4x8GB) DDR4 ECC内存&#xff0c;Radeon Pro 580X图形处理…

LeetCode 1489. 找到最小生成树里的关键边和伪关键边(并查集+kruskal最小生成树)

文章目录1. 题目2. 解题1. 题目 给你一个 n 个点的带权无向连通图&#xff0c;节点编号为 0 到 n-1 &#xff0c;同时还有一个数组 edges &#xff0c;其中 edges[i] [fromi, toi, weighti] 表示在 fromi 和 toi 节点之间有一条带权无向边。 最小生成树 (MST) 是给定图中边的…

斯特林发动机图纸尺寸_南昌教学模型订做,航空发动机模型_境海模型

首页 > 新闻中心发布时间&#xff1a;2020-11-08 13:57:07 导读&#xff1a;境海模型为您提供南昌教学模型订做,航空发动机模型的相关知识与详情&#xff1a; 曾经的沙盘模型一般只有模型自身&#xff0c;没有现代的视觉作用例如&#xff1a;灯火声音形象等动态的作用。景观…

app inventor离线版_小鸡漫画app手机版下载_小鸡漫画好看的漫画手机版下载

小鸡漫画app手机版&#xff0c;是一款无限量看漫画的阅读软件。小鸡漫画app手机版为喜欢看漫画的用户带来超多好看、热门、经典的漫画集&#xff0c;在这里看漫画没有乱七八糟和漫画无关的东西打扰。小鸡漫画app手机版方便看漫画&#xff0c;让一个人的你不再孤单&#xff0c;午…

LeetCode 963. 最小面积矩形 II

文章目录1. 题目2. 解题1. 题目 给定在 xy 平面上的一组点&#xff0c;确定由这些点组成的任何矩形的最小面积&#xff0c;其中矩形的边不一定平行于 x 轴和 y 轴。 如果没有任何矩形&#xff0c;就返回 0。 示例 1&#xff1a; 输入&#xff1a;[[1,2],[2,1],[1,0],[0,1]…

树的存储结构(树的二叉链表(孩子—兄弟))

// c6-5.h 树的二叉链表(孩子—兄弟)存储结构(见图6.32) typedef struct CSNode {TElemType data;CSNode *firstchild,*nextsibling; }CSNode,*CSTree; 一棵树无论有多少叉&#xff0c;它最多有一个长子和一个排序恰在其下的兄弟。根据这样的定 义&#xff0c;则每个结点的结构…

i12蓝牙耳机使用说明书图片_配置强悍、适用于开车、运动的蓝牙耳机Xisem西圣 Ares使用体验...

现在的蓝牙耳机市场五花八门、有降噪的、有高保真音质的、有适用于运动不掉的… … 真有是各出奇招。那么作为消费者应该如何选择呢&#xff1f;前段时间入手一款硬件配置很高、无论是开车&#xff0c;还是运动都适用的蓝牙耳机“Xisem西圣 Ares真无线蓝牙耳机”。包装简介&…

LeetCode 918. 环形子数组的最大和(前缀和+单调队列)

文章目录1. 题目2. 解题1. 题目 给定一个由整数数组 A 表示的环形数组 C&#xff0c;求 C 的非空子数组的最大可能和。 在此处&#xff0c;环形数组意味着数组的末端将会与开头相连呈环状。 &#xff08;形式上&#xff0c;当0 < i < A.length 时 C[i] A[i]&#xff0…

小案例:王者荣耀战力查询系统(免费调用外部接口

一、查询网址&#xff08;点击&#xff09;&#xff1a; 王者战力查询-王者战力排行榜 二、战力查询接口&#xff1a; 接口调用&#xff1a; https://www.jk.cxkf.cc/api_select.php参数&#xff1a; hero&#xff1a;英雄名字 type&#xff1a;qq、wx、ios_qq、ios_wxqq&…

open函数返回-1_4.6 linux的系统调用执行探究(1)

arm64大约支持280个系统调用&#xff0c;我们平时使用的这些系统调用&#xff0c;到底工作原理是什么&#xff0c;调用后又是到哪里实现的呢&#xff0c;这篇文章初步了解下内核系统调用的流程&#xff0c;并告诉跟踪这个流程的方法。废话不多说&#xff0c;如上就是linux的系统…

LeetCode 781. 森林中的兔子(哈希+贪心)

文章目录1. 题目2. 解题1. 题目 森林中&#xff0c;每个兔子都有颜色。 其中一些兔子&#xff08;可能是全部&#xff09;告诉你还有多少其他的兔子和自己有相同的颜色。 我们将这些回答放在 answers 数组里。 返回森林中兔子的最少数量。 示例: 输入: answers [1, 1, 2] 输…