方式一:普通快速

这种方式适合你使用 Intel 芯片的 macOS,这样就可以了,或者m2以下的芯片,m3芯片不适合这种方式,会报错:尝试再次运行自动脚本选择其他下载源或者切换网络

1. 执行命令: 

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

2. 输入编号选择下载源,最好选择第一个中科大下载源,比较快,而且好像我选择了这个才安装生效

选择完源之后,可能会提示: 

此步骤失败 '尝试再次运行自动脚本选择其他下载源或者切换网络'

这个时候只能老老实实用官方的安装命令安装:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

出现这个问题主要是因为gitee这个国内源没有同步github上面的最新代码导致的,使用官方这个命令的好处是完美支持最新m芯片,但是缺点就是网速很慢,除非你使用魔法工具。

3.macos的m芯片要安装后续的操作

等待下载安装完成后,重新打开一个命令行工具,然后输入:brew

方式二:M3芯片或提示错误

动图

但如果你使用 Apple 芯片的 macOS(如 MacBook M1/M2/M3 等),那么 Homebrew 会安装在 /opt/homebrew 中,你或许已经在上面的提示信息中看到了一条 Warning,提示你需要将该文件夹添加到环境变量中。

(仅 Apple 芯片需要这一步)为了将 Homebrew 添加到环境变量中,运行以下命令:

$ echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile

这会将 eval "$(/opt/homebrew/bin/brew shellenv)" 这行命令添加到 ~/.zprofile 中(如果不存在该文件则新建)。~/.zprofile 类似于 ~/.zshrc,但它在登录终端时加载而非每打开一个终端 Tab 就加载一次——你没看懂也无所谓,不是特别重要。

然后,无论你是否使用 Apple 芯片,运行以下命令以确保 Homebrew 在当前终端中生效:

$ eval "$(/opt/homebrew/bin/brew shellenv)"

现在运行 $ brew help,你应当能正常看到提示信息:

使用 Homebrew 安装与卸载程序

在安装 Homebrew 之后,你便可以使用 Homebrew 安装其他程序了。你可以直接在其官网搜索你需要安装的程序。比如在这里搜索 Wget:

在 brew.sh 上搜索软件

——或者直接在命令行里执行 $ brew search wget,一个意思,你可以自己摸索着怎么用。

Homebrew 上可以安装的软件被称为“Formula”——这其实很形象,因为每个在 Homebrew 上可以安装的软件都需要有一个对应的“公式 (Formula)”(或者说“配方”)来描述该怎么安装它,这些“公式”通常就是某个 Ruby 脚本。当然,你如果不理解,直接认为“Formula”就是你要安装的软件就行,比如 Python、Java、Git 等。

✨ 有趣的事实: Homebrew 这个名称本身就很幽默,它的含义是“家酿酒”,而它存放所有安装软件的目录被命名为“Cellar(地窖)”,安装好的一个个软件则被称为“Keg(桶)”,同一软件的不同版本被放在同一个目录,这叫做“Rack(架子)”。这样说的话,其实“Formula”翻译成“配方”更合适,它表明了如何按照步骤“酿造出”一个“Keg”,然后放到“Rack”上。

你可以通过运行 $ brew install <formula> 来安装某个 Formula. 例如下图演示了如何使用 Homebrew 安装与卸载 Wget:

✨ 提示: 这里的  <formula> 用作占位符,你在实际输入命令时需要将其替换为实际值(注意把尖括号  <> 也去掉),比如这里使用的  wget. 下面出现的终端命令也同理。

动图

使用 Homebrew 安装与卸载 Wget

Homebrew 在安装软件后会将必要的命令行工具自动添加到你的环境变量中,这样你就可以直接在终端中运行它们了。比如假设你安装了 Node,就会自动添加 node、 npm 和 npx 命令,在卸载时也会自动移除它们。

✨ 说明: 简单将其理解为“环境变量”可能是比较容易和相对恰当的理解方式,但它其实不完全准确。事实上,Homebrew 将安装软件的可执行文件符号连接(symlink)到  /opt/homebrew/bin/ 目录下,而该目录在环境变量里,这样就可以实现在终端中直接访问这些命令。

如你在上图中看到的,相应的,通过 $ brew uninstall <formula> 你也可以卸载某个通过 Homebrew 安装的 Formula.

Homebrew 的其他常用命令

Homebrew 还有一些其他常用的命令,你可以通过 $ brew help 查看它们的用法。下面列出了一些常用的命令。

更新

除了安装与卸载软件外,我们常常还需要更新它们。Homebrew 提供了 $ brew update 命令来更新 Homebrew 本身,以及 $ brew upgrade 命令来更新已安装的软件。你可以运行 $ brew help update 和 $ brew help upgrade 来查看它们的详细用法。

通常来说,运行以下命令即可更新 Homebrew 以及你当前通过 Homebrew 安装的所有 Formula:

$ brew update && brew upgrade

“钉住”版本

Homebrew 会默认安装软件的较新版本,但有时你可能希望在运行 $ brew upgrade 时不要更新某个特定的 Formula. 此时你可以使用 pin 命令 “钉住”某个 Formula 的版本,这样在运行 $ brew upgrade 时就不会更新它了。

$ brew pin <installed_formula>
✨ 提示: 通过在安装时添加后缀  @<version>,你可以指定安装软件的版本号,如  $ brew install python@3.12.

要“解锁”某个被钉住的软件,可以使用 unpin

$ brew unpin <installed_formula>

livecheck

Homebrew 的版本更新并不总是非常“实时”。你有时可能非常激进,希望在某个软件发布新版本的五分钟之后就立即更新到最新版——此时你可以从软件的“源”(常常是 GitHub 仓库)中直接检查是否有新版本,这个过程被称为“livecheck”.

你可以运行以下命令检查所有安装的 Formula 是否有新版本:

$ brew livecheck --installed

但是如果你发现某个软件的版本更新了,但 Formula 本身还没来得及更新到最新版本怎么办呢?

答案是没什么办法,你只能等 Formula 过几个小时或几天自动更新到最新版本。或者你可以直接去编辑 Formula 文件——但我不建议。

所以我为什么会寻思顺带介绍一下这个命令?我也不知道,但在某些罕见情况下可能对你有用。

列出安装的软件

运行以下命令可以列出你当前通过 Homebrew 安装的所有 Formula:

$ brew list

list 默认不会直接列出版本信息,你可以通过 --versions 选项来显示版本信息:

$ brew list --versions

你可能会奇怪于为什么列出的软件中好像有很多不是你手动安装的,这是因为其中有很多属于你安装的某些软件的依赖——不要尝试强行卸载它们,否则你安装的软件可能会出问题。

unlink && link(安装多个版本的软件并切换)

Homebrew 默认只会安装某个软件的最新版本,但有时你可能需要安装某个软件的多个版本,比如你可能需要同时安装 Node 18 和 Node 20. 此时你可以先使用 unlink 取消链接某个软件版本,然后再使用 link 链接它的另一个版本。

下面展示了使用 Homebrew 管理多个版本的 Node 的过程:

动图封面

使用 Homebrew 管理多个版本的 Node

记得如果要 link 带版本号的 Formula,如 node@18 时,需要在 link 命令后面加上 --overwrite 选项。顺便你不需要在这里加上 --force 选项,对于此类带版本的 Formula,--force 本来就不会起效——它是用于覆盖与系统自带软件冲突的 Formula 的。

你可能觉得这太麻烦了,而且还需要考虑是否需要加上 --overwrite. 事实上你可以通过自定义命令来简化这个过程。例如你可以自定义一个 reset 命令来结合 unlink 和 link 命令。我简单将步骤贴在这里,具体原理可以参见这里

  1. 首先创建 ~/.homebrew/cmd 文件夹,在其中创建 brew-reset.rb 文件。并使用 $ chmod +x ~/.homebrew/cmd/brew-reset.rb 命令赋予其可执行权限。
  2. 然后在你的 ~/.zshrc 中写入一行 export PATH="$HOME/.homebrew/cmd:$PATH",将该文件夹添加到环境变量中。
  3. 用文本编辑器打开上面创建的 ~/.homebrew/cmd/brew-reset.rb,输入以下内容并保存:
# frozen_string_literal: true

#:  * `reset` <installed_formula> [...]
#:
#:  Relink <formula> keg into Homebrew's prefix with `--overwrite`.
#:  This will unlink all versioned symlinks of <formula> first.
#:
#:    -f, --force                      Allow keg-only formulae to be linked.
#:    -v, --verbose                    Make some output more verbose.

require "caveats"
require "unlink"

def reset_args
  Homebrew::CLI::Parser.new do
    named_args :installed_formula, number: 1

    switch "-f", "--force"
    switch "-n", "--verbose"
  end
end

args = reset_args.parse

options = {
  verbose: args.verbose?,
}

keg = args.named.to_latest_kegs[0]
formula = keg.to_formula

# Check for keg-only formulae
if Formulary.keg_only?(keg.rack) and !formula.keg_only_reason.versioned_formula?
  if HOMEBREW_PREFIX.to_s == HOMEBREW_DEFAULT_PREFIX && formula.present? && formula.keg_only_reason.by_macos?
    caveats = Caveats.new(formula)
    opoo <<~EOS
      Refusing to link macOS provided/shadowed software: #{keg.name}
      #{caveats.keg_only_text(skip_reason: true).strip}
    EOS
    Kernel.exit 1
  end

  if !args.force? && !formula.keg_only_reason.versioned_formula?
    opoo "#{keg.name} is keg-only and must be linked with `--force`."
    Kernel.exit 1
  end
end

# Unlink other versioned formulae
Homebrew::Unlink.unlink_versioned_formulae(formula, **options)

# Try to unlink main formula if the formula is a versioned one
if formula.keg_only_reason&.versioned_formula?
  main_formula = begin
    Formula[formula.name.gsub(/(@[\d.]+)?$/, "")]
  rescue FormulaUnavailableError
    nil
  end
  Homebrew::Unlink.unlink(main_formula.any_installed_keg, **options) if main_formula&.linked?
end

# Unlink the formula
Homebrew::Unlink.unlink(keg, **options) if formula.linked?

# Link the formula
keg.lock do
  print "Linking #{keg}... "
  puts if args.verbose?

  begin
    n = keg.link(**options, overwrite: true)
  rescue Keg::LinkError
    puts
    raise
  else
    puts "#{n} symlinks created."
  end
end

然后重启终端,输入 brew reset --help,如果看到帮助信息就说明好了:

自定义命令 brew reset

这样你就可以通过 $ brew reset <installed_formula> 来重置某个 Formula 以达到切换版本的目的了:

$ node -v
v21.6.0
$ brew reset node@18
Unlinking /opt/homebrew/Cellar/node/21.6.0... 7 symlinks removed.
Linking /opt/homebrew/Cellar/node@18/18.19.0... 2103 symlinks created.
$ node -v
v18.19.0
$ brew reset node
Unlinking /opt/homebrew/Cellar/node@18/18.19.0... 2103 symlinks removed.
Linking /opt/homebrew/Cellar/node/21.6.0... 7 symlinks created.
$ node -v
v21.6.0

清理缓存

Homebrew 有时在安装 Formula 后会留下一部分缓存文件,并且时常因为种种原因在更新 Formula 后没有完全移除旧版本。此时你可以运行 $ brew cleanup 来清除这些陈旧的缓存文件让它们不再占用你的硬盘空间——然而 cleanup 的常规策略是仅清除超过 120 的缓存,而不是“所有”缓存,所以你可能需要使用 --prune=all 选项来清除所有缓存:

$ brew cleanup --prune=all

如果哪天你发现自己的硬盘空间不够了,可以试试这个命令,它可能清理出超出你想象的多的硬盘空间。

安装 GUI 程序(Cask)

我好像漏了什么?如果你更多地了解过 Homebrew,应该知道它除了能够安装 Formula 还能安装另一种程序——Cask.

通常来说,使用 Formula 安装的程序会被存放在某个特定的文件夹(即 /opt/homebrew/Cellar/)下的某个目录里,比如你安装了 fzf 这个 Formula 就会放在 /opt/homebrew/Cellar/fzf/ 目录下。一般来说,对于这些使用 Formula 安装的程序,其大部分数据和文件都存放在这个目录中,比较“干净”,当你删除它时可以删除它的大部分内容——当然一般还是推荐你用 $ brew uninstall 卸载 Formula,这里只是举个例子。

但有些程序是没法通过这种“干净”的方式安装的,这常见于 GUI 程序,比如那些自带一个安装包,打开后要求你将程序拖拽到 /Applications 的软件——比如 Visual Studio Code 或 Google Chrome.

Homebrew 具有管理这些 GUI 程序的能力,它们被称作 Cask. 你也许已经注意到了,Homebrew 的 man 中经常会提及“Formulae and Casks”,使用 $ brew search 时也会将搜索结果分为“Formulae”和“Casks”——这里的 Cask 就是指这些 GUI 软件。

✨ 有趣的事实: “Cask”一词与上面提到过的“Keg(桶,常指小木桶)”类似,其中文含义是“大木桶”。这也是个很形象的词,隐喻了这些 GUI 程序通常较复杂,无法直接存放在“Cellar”目录中的事实。

Homebrew 当前已自带对 Cask 开箱即用的支持。例如你可以直接通过 $ brew install visual-studio-code 安装 VSCode,它会被自动安装到 /Applications 目录下。

我个人不那么习惯于使用 Homebrew 安装 GUI 程序,还是更倾向于手动安装它们——不过这只是个人喜好问题。Homebrew Casks 目前已经几乎没有兼容性问题了,对于程序员常用的那些软件如 VSCode 或 Google Chrome 则更是如此。

Tap(第三方仓库)

Homebrew 官方已经维护了一个相当完善的 Formula 仓库,你基本上可以在其中安装大多数能遇到的软件。然而有时候你可能想安装更多软件——Homebrew 自然也提供了从其他地方“导入”更多 Formula 的方式,也就是通过 brew tap 导入第三方仓库(通常是 GitHub 仓库),这些被导入的仓库就被称为 Tap.

Tap 常常提供了一些额外可以安装的 Formula,或是提供了某些特别的命令。通常 Homebrew 内置的命令已经足够多了,其内置的 Formula 也非常庞大,你不太需要添加自定义 Tap. 这里介绍了少数几个我认为可能有用的 Tap.

你可以运行以下命令列出当前安装的 Tap:

$ brew tap

你可以运行以下命令安装某个 Tap:

$ brew tap <user/repo>

这里的 user/repo 通常是 GitHub 仓库的地址,如 homebrew/cast-fonts.

你也可以使用 untap 来移除某个 Tap:

$ brew untap <user/repo>

homebrew/cask-fonts

你有时可能希望用 Homebrew 安装字体而不是手动下载安装,此时你可以考虑添加 homebrew/cask-fonts 仓库。运行以下命令即可添加它:

$ brew tap homebrew/cask-fonts

该仓库提供了多数程序员常用的字体,如 Fira Code、JetBrains Mono 等,以及它们对应的 Nerd Font 版本。

在安装该 Tap 后,你使用 $ brew search 就可以搜索到这些字体了,也可以通过 $ brew install 安装它们。

rmtree

macOS 是类 Unix 系统,所以 Homebrew 也继承了 Unix 的“优良”传统——包管理器直接用于管理 C/C++ 依赖,这导致有时候安装某个 Formula 会安装下来一大片依赖(常常命名为 libxxx),但你卸载 Formula 时却不会自动卸载它们。你可以试试 rmtree,它提供了递归卸载的功能,可以“干净卸载”某个 Formula:

$ brew tap beeftornado/rmtree

然后你就可以使用 $ brew rmtree <formula> 来安全卸载某个 Formula 以及它的所有依赖了——这只会卸载不被其他 Formula 依赖的那些依赖。

我一般习惯于使用 rmtree 而非 uninstall 来卸载 Formula——当然我不建议所有人都这么干,这可能引入一些额外的风险,因为并不是所有 Formula 都把依赖写清楚的,有时你用 rmtree 可能导致某个没卸载的 Formula 无法正常工作了。不过这个概率比较低,你要是自觉能承受这个风险,那就随你了。

command-not-found

如果你在终端中输入了一个不存在的命令,你可能会看到类似于以下的提示信息:

$ fzf
zsh: command not found: fzf

但是你可能想要一个更加友好的提示——比如告诉你该通过 Homebrew 安装哪个 Formula 才能使用这个命令。这是可行的。你可以运行以下命令自动将 homebrew/command-not-found 添加到 Tap,并提示你如何安装它:

$ brew command-not-found-init

这会提示你在 ~/.zshrc 中加入几行特定的配置以启用这一功能。但比较难绷的是在 Apple 芯片的 macOS 上这个配置里的某个路径是错的。如果你使用的是 Apple 芯片的 macOS,你需要添加这段内容到 ~/.zshrc 中:

# Homebrew tap - command-not-found
HB_CNF_HANDLER="/opt/homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh"
if [ -f "$HB_CNF_HANDLER" ]; then
  source "$HB_CNF_HANDLER";
fi

然后重启终端,你就可以看到类似于以下的提示信息了:

$ fzf
The program 'fzf' is currently not installed. You can install it by typing:
  brew install fzf

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐