方式一:普通快速
这种方式适合你使用 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
命令。我简单将步骤贴在这里,具体原理可以参见这里:
- 首先创建
~/.homebrew/cmd
文件夹,在其中创建brew-reset.rb
文件。并使用$ chmod +x ~/.homebrew/cmd/brew-reset.rb
命令赋予其可执行权限。 - 然后在你的
~/.zshrc
中写入一行export PATH="$HOME/.homebrew/cmd:$PATH"
,将该文件夹添加到环境变量中。 - 用文本编辑器打开上面创建的
~/.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