homebrew 安裝 formula 的不同歷史版本——以安裝 node 為例

来源:https://www.cnblogs.com/BlackStorm/archive/2018/10/28/homebrew-install-old-versions-take-node-for-example.html
-Advertisement-
Play Games

homebrew 安裝 formula 的不同歷史版本——以安裝 node 為例 系統環境 macOS Mojave 10.14 Homebrew 1.8.0 Homebrew/homebrew core (git revision 586b0f; last commit 2018 10 27) H ...


homebrew 安裝 formula 的不同歷史版本——以安裝 node 為例

系統環境

  • macOS Mojave 10.14
  • Homebrew 1.8.0
    Homebrew/homebrew-core (git revision 586b0f; last commit 2018-10-27)
    Homebrew/homebrew-cask (git revision 76ddc; last commit 2018-10-27)

背景

最近 nodejs 發佈了 11.0.0 版本,而我是用 brew 安裝了名為 node 的這個 formula ,現在 brew upgrade 會自動將 node 更新到最新版本,於是我遇到了一些問題:

  1. 一些需要編譯安裝的依賴包還不支持 node@11 ;
  2. 不知道如何自動切換兩個 formula ( node 和 node@10 )之間的可執行文件;
  3. 是否能夠設定某個 formula 不自動更新?

在經過一番折騰後,現在我刪掉了 node 和 node@10 兩個 formula ,包括之前安裝的歷史版本(所以算是多走了一點彎路),想要同時保留 10 和 11 兩個大版本,並可方便切換。

前置條件

若下列條件不滿足,可能導致需要額外的操作來解決環境問題,這些操作不在本文討論範圍內:

  1. 只通過 homebrew 來安裝 node ;
  2. 沒有使用如 n / nvm 等 node 版本管理工具;
  3. 某種意義下連接性良好的網路。

適用情況

本文覆蓋瞭如下四種情況:

  1. 某個 formula 跟隨著更新上來,沒有運行過 cleanup 或 force uninstall ,想切回舊版本的(見關鍵點三);
  2. 全新安裝且只想安裝某個 formula (如 node 而非 node@10 ),但又想先用著舊版本的(見解決方案一);
  3. 某個 formula 在用的是舊版本,但想切換編譯選項(如 [email protected] )重新安裝(同上);
  4. 在兩個 formula 之間切換,如一個是 LTS 版的,一個是不穩定版的(見解決方案二)。

關鍵點

如何在 brew install / upgrade 時禁止自動更新

這一步很關鍵,否則我們總是會安裝到最新版本。只要在運行命令前,設置環境變數 HOMEBREW_NO_AUTO_UPDATE 為 1 就可以了,比如:

$ HOMEBREW_NO_AUTO_UPDATE=1 brew install node

也可以直接寫進 shell 配置文件中(如 .bashrc / .zshrc 等):

export HOMEBREW_NO_AUTO_UPDATE=1

查看某個 formula 的本地已安裝版本

有兩種方式可查看,一是 brew list --versions ,輸出以空格分隔,簡潔明瞭,推薦使用:

$ brew list node --versions
node 11.0.0 10.12.0
$ brew list zsh --versions |tr ' ' '\n'
node
11.0.0
10.12.0

二是 brew info 在查看 formula 信息時也可看到本地已安裝的版本:

$ brew info node
$ brew info node |grep -i '\/cellar'
/usr/local/Cellar/node/10.12.0 (3,668 files, 41.7MB)
/usr/local/Cellar/node/11.0.0 (3,665 files, 42MB) *

後面帶有的星號 * 表示當前激活的版本。

切換某個 formula 的版本

自有的 brew switch 命令即可,之前感覺 brew 較易上手,安裝後沒看文檔直接用到現在,所以不知道這個命令。命令的說明也很直觀:

brew switch formula version:
    Symlink all of the specific version of formula's install to Homebrew prefix.

直接鍵盤一頓敲就行了,如 brew switch node 10.12.0

解決方案

安裝某個 formula 的歷史版本

  1. 切換到 brew 的倉庫目錄下

    $ cd "$(brew --repo homebrew/core)"
  2. 查看某個 formula 的 git 歷史記錄

    $ git log master -- Formula/node.rb

    在裡面找到想要的歷史版本,比如這個就挺像我所需要的:

    commit b801cc6b71e7c09448b4f823e493710665de68eb
    Author: BrewTestBot <[email protected]>
    Date:   Thu Oct 11 00:12:43 2018 +0000
    
        node: update 10.12.0 bottle.
  3. 檢出 git 歷史提交

    $ git checkout b801cc6b71e7c09448b4f823e493710665de68eb
  4. 在禁止自動更新的前提下安裝這個 formula

    $ HOMEBREW_NO_AUTO_UPDATE=1 brew install node [email protected]
  5. 由於剛纔第 3 步後處於分離頭指針狀態下,記得要切回來

    $ git checkout master
  6. 升級這個 formula 試試

    $ brew upgrade node
  7. 檢查當前版本,應該是最新的,現在再把它切回來

    $ node -v
    v11.0.0
    $ brew switch node 10.12.0
    Cleaning /usr/local/Cellar/node/10.12.0
    Cleaning /usr/local/Cellar/node/11.0.0
    7 links created for /usr/local/Cellar/node/10.12.0
    $ node -v
    v10.12.0

在兩個 formula 之間切換

我們也可以在 node 和 node@10 兩個 formula 之間切換文件鏈接。但是註意,這種方法可能會在運行 brew doctor 時產生警告,因為可能會有一個不是 keg-only 的包沒有被鏈接到 Cellar 中(如為了使用 node@10 而解除了 node 的鏈接),這個警告可以不去理會,但必須記住我們做過這樣的操作。

  1. 假定已經安裝了 node ,現在安裝 node@10 ,鍵盤一頓亂敲

    $ brew install node@10

    通常像這樣名字後面帶有版本號的 formula 都是 keg-only 的,簡單來說就是 brew 不會自動幫我們鏈接文件

  2. 先解除 node 的文件鏈接
    shell $ brew unlink node

  3. 鏈接 node@10 的文件

    $ brew link node@10

    這時會提示這個包是 keg-only 的,需要加上 --force 選項。如果第 2 步沒有進行,還會提示你需要先解除 node 的鏈接,或者直接用 --overwrite 選項覆蓋原有的鏈接。由於 npm 目錄一定需要覆蓋,所以我們總是可以打開 --overwrite 選項:

    $ brew link node@10 --force --overwrite
  4. 檢查當前版本,在解決方案一中提到過了,方法也有很多種,此處略過。

後續問題

  1. 全局安裝的包支持的 node 版本可能不同
    是的,這個問題一定會存在,建議通過切換 npm prefix 路徑解決,把不同版本 node 下安裝的全局包隔離開來。當然 nvm 等方案也可以解決問題,但本文是不一樣的煙火。

    $ mkdir -p ~/.npm-node10/npm-global
    $ npm config set prefix ~/.npm-node10/npm-global
    $ export PATH="$HOME/.npm-node10/npm-global/bin:$PATH"

    手動切換確實比較繁瑣,可以寫個 shell 腳本把切換 formula 和切換 npm prefix 結合起來。

  2. 如何固定某個 formula 的版本?
    雖然說不運行 brew upgrade 就一直是固定的版本,但如果想只固定某個 formula 的版本而允許其他可以升級,也是極好的。自帶的 pin 、 unpin 命令就是用來解決這一問題,如: brew pin node

  3. 如何刪除某個 formula 的舊版本?
    儘管 brew cleanup 可以刪除一個 formula 的所有舊版本,但通常我們可能只想刪除某幾個太舊且多餘的版本而不是全部。 brew 沒有提供這樣的命令,我們可以直接從 Cellar 裡面刪除:

    $ brew info node |grep -i '\/cellar'
    /usr/local/Cellar/node/10.12.0 (3,668 files, 41.7MB)
    /usr/local/Cellar/node/11.0.0 (3,665 files, 42MB) *
    $ rm -rf /usr/local/Cellar/node/10.12.0

    初步測試未發現有副作用,歡迎討論和建議。

  4. 如何在升級時自動刪除舊版本?
    根據 brew upgrade 命令的說明,設置一個 HOMEBREW_UPGRADE_CLEANUP 環境變數就好了,比較簡單。

參考資料

  1. Tips and Tricks - Homebrew Documentation
  2. Homebrew terminology - Homebrew Documentation
  3. FAQ - Homebrew Documentation
  4. homebrew - how to install older versions - Stack Overflow
  5. Homebrew install specific version of formula? - Stack Overflow
  6. Using Homebrew how do I remove some specific versions but not all old versions - Stack Overflow



本文基於 知識共用許可協議知識共用署名-非商業性使用-相同方式共用 4.0 國際許可協議 發佈,歡迎引用、轉載或演繹,但是必須保留本文的署名 BlackStorm 以及本文鏈接 http://www.cnblogs.com/BlackStorm/p/homebrew-install-old-versions-take-node-for-example.html ,且未經許可不能用於商業目的。如有疑問或授權協商請與我聯繫


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、asp 的上傳 有兩個突出問題:1. 文件上傳框風格和整個頁面風格不搭配。 2. 上傳時是整個頁面回發,和FineUI預設的AJAX風格也不搭。 2、fineui 的上傳 下麵來看看FileUpload的屬性: 1. ButtonText:按鈕文本。 1. ButtonOnly:是否只顯示按鈕, ...
  • vs 打開項目報錯; 解決方法:刪除我的文檔下IISEXpress文件夾,然後重啟電腦。 ...
  • 按f1 搜索 Configore Display Language 設置 zh-cn 關閉軟體重啟。 如果重啟菜單等還是英文的,在商店查看已安裝的插件,把中文插件重新安裝一遍,然後重啟軟體。 ...
  • mknod 創建塊設備或者字元設備文件。此命令的適用範圍:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。 1、語法 mknod [選項] 設備名 設備類型 主設備號 次設備號 2、選項參數列表 選項 說明 --version 顯示命令版本信息 --he ...
  • 一、概述 記憶體管理涵蓋領域: 記憶體中的物理記憶體頁管理; 分配大塊記憶體的伙伴系統; 分配較小塊記憶體的slab、slub和slob分配器; 分配連續記憶體塊的vmalloc機制; 進程的地址空間。 Linux內核一般將處理器的虛擬地址分為兩個部分,以IA-32為例,地址空間在用戶進程和內核之間的劃分比例為 ...
  • 我們前面提到linux有兩種方法激活調度器:核心調度器和 周期調度器 一種是直接的, 比如進程打算睡眠或出於其他原因放棄CPU 另一種是通過周期性的機制, 以固定的頻率運行, 不時的檢測是否有必要 因而內核提供了兩個調度器 主調度器 , 周期性調度器 ,分別實現如上工作, 兩者合在一起就組成了 核心 ...
  • 在os層numa關閉時,打開bios層的numa會影響性能,QPS會下降15-30%; 在bios層面numa關閉時,無論os層面的numa是否打開,都不會影響性能。 安裝numactl: #yum install numactl -y #numastat 等同於 cat /sys/devices/ ...
  • Tmux是一個優秀的終端復用軟體,類似GNU Screen,但來自於OpenBSD,採用BSD授權。使用它最直觀的好處就是,通過一個終端登錄遠程主機並運行tmux後,在其中可以開啟多個控制台而無需再“浪費”多餘的終端來連接這台遠程主機。是BSD實現的Screen替代品,相對於Screen,它更加先進 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...