【MacOS】MacOS 安装 Homebrew

有趣的Homebrew 命名及 keg-only 的意思

Homebrew 简介

Homebrew是一款MacOS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能,类似于CentOS下的apt-get/yum。只需简单的一条指令就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷。

Homebrew 名称由来

https://zhuanlan.zhihu.com/p/196667957

首先, brew 本身是酿造、酿酒的意思,会用这个字的原因是 homebrew 的安装方式为下载 source code 回来做编译,由于是在自己电脑做 local compile 编译套件,所以这个工具叫做 homebrew 自家酿酒

酿酒需要有配方 formula,当你需要安装套件时,流程就是下 brew 命令去根据配方 formula, 酿造出一桶( keg)酒来。所以 keg 指的是整个编译完成的套件资料夹。

再来,放置套件的位置在 /usr/local/Cellar/(或**/opt/homebrew/Cellar/**), Cellar 就是地窖,一桶一桶酿好的酒当然要存放在地窖里,所以编译安成的套件资料夹 keg 预设目录在 /usr/local/Cellar/

回到「keg-only」整个词,字面上意思现在就很清楚,表示这个套件只会存放在桶子里,不会跑出桶子外。实际上的行为是 brew 不会帮你做 symlink/usr/local,避免你的原生系统内还有一套 readline 而打架,所以提示消息说 readline 套件是 keg-only

https://www.zhihu.com/people/morlay

brew cask(木桶) 是对于 brew 的扩展,可以采用 brew 的方式安装图形界面的软件。brew cask 仅仅是下载解压已经编译好了的应用包 (.dmg/.pkg),并放在统一的目录中( /opt/homebrew-cask/Caskroom ),省掉了自己去下载、解压、拖拽等步骤。

脚本配置安装

https://zhuanlan.zhihu.com/p/98384704

使用作者@Mintimate配置的脚本安装:

1
$ /bin/zsh -c "$(curl -fsSL 'https://host.mintimate.cn/fileHost/download/MTEyMjMz')"

卸载homebrew:

1
$ /bin/zsh -c "$(curl -fsSL 'https://host.mintimate.cn/fileHost/download/MjIzMzQ0')"

Homebrew 常用命令

安装任意包

1
$ brew install <packageName>

示例:安装node

1
$ brew install node

卸载任意包

1
$ brew uninstall <packageName>

查询可用包

1
$ brew search <packageName>

查看已安装包列表

1
$ brew list

查看任意包信息

1
$ brew info <packageName>

更新Homebrew

1
$ brew update

查看Homebrew版本

1
$ brew -v

Homebrew帮助信息

1
$ brew -h

https://www.jianshu.com/p/de6f1d2d37bf

下载的脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
#HomeBrew自动安装脚本
#路径表.
UNAME_MACHINE="$(uname -m)"
if [[ "$UNAME_MACHINE" == "arm64" ]]; then
# On ARM macOS, this script installs to /opt/homebrew only
HOMEBREW_PREFIX="/opt/homebrew"
HOMEBREW_REPOSITORY="${HOMEBREW_PREFIX}"
else
# On Intel macOS, this script installs to /usr/local only
HOMEBREW_PREFIX="/usr/local"
HOMEBREW_REPOSITORY="${HOMEBREW_PREFIX}/Homebrew"
fi
HOMEBREW_CACHE="${HOME}/Library/Caches/Homebrew"

STAT="stat -f"
CHOWN="/usr/sbin/chown"
CHGRP="/usr/bin/chgrp"
GROUP="admin"

#获取前面两个.的数据
major_minor() {
echo "${1%%.*}.$(x="${1#*.}"; echo "${x%%.*}")"
}

#获取系统版本
macos_version="$(major_minor "$(/usr/bin/sw_vers -productVersion)")"
#获取系统时间
TIME=$(date "+%Y-%m-%d %H:%M:%S")

JudgeSuccess()
{
if [ $? -ne 0 ];then
echo '\033[1;31m此步骤失败 '$1'\033[0m'
else
echo "\033[1;32m此步骤成功\033[0m"

fi
}
# 判断是否有系统权限
have_sudo_access() {
if [[ -z "${HAVE_SUDO_ACCESS-}" ]]; then
/usr/bin/sudo -l mkdir &>/dev/null
HAVE_SUDO_ACCESS="$?"
fi

if [[ "$HAVE_SUDO_ACCESS" -ne 0 ]]; then
echo "获取权限失败!"
fi

return "$HAVE_SUDO_ACCESS"
}

shell_join() {
local arg
printf "%s" "$1"
shift
for arg in "$@"; do
printf " "
printf "%s" "${arg// /\ }"
done
}

execute() {
if ! "$@"; then
abort "$(printf "Failed during: %s" "$(shell_join "$@")")"
fi
}

# 管理员运行
execute_sudo() {
local -a args=("$@")
if [[ -n "${SUDO_ASKPASS-}" ]]; then
args=("-A" "${args[@]}")
fi
if have_sudo_access; then
execute "/usr/bin/sudo" "${args[@]}"
else
execute "${args[@]}"
fi
}

CreateFolder()
{
echo '-> 创建文件夹' $1
execute_sudo "/bin/mkdir" "-p" "$1"
JudgeSuccess
execute_sudo "/bin/chmod" "g+rwx" "$1"
execute_sudo "$CHOWN" "$USER" "$1"
execute_sudo "$CHGRP" "$GROUP" "$1"
}

RmCreate()
{
sudo rm -rf $1
CreateFolder $1
}

#git提交
git_commit(){
git add .
git commit -m "your del"
}

#version_gt 判断$1是否大于$2
version_gt() {
[[ "${1%.*}" -gt "${2%.*}" ]] || [[ "${1%.*}" -eq "${2%.*}" && "${1#*.}" -gt "${2#*.}" ]]
}
#version_ge 判断$1是否大于等于$2
version_ge() {
[[ "${1%.*}" -gt "${2%.*}" ]] || [[ "${1%.*}" -eq "${2%.*}" && "${1#*.}" -ge "${2#*.}" ]]
}
#version_lt 判断$1是否小于$2
version_lt() {
[[ "${1%.*}" -lt "${2%.*}" ]] || [[ "${1%.*}" -eq "${2%.*}" && "${1#*.}" -lt "${2#*.}" ]]
}

#一些警告判断
warning_if(){
git_https_proxy=$(git config --global https.proxy)
git_http_proxy=$(git config --global http.proxy)
if [[ -z "$git_https_proxy" && -z "$git_http_proxy" ]]; then
echo "未发现Git代理(属于正常状态)"
else
echo "\033[1;33m
提示:发现你电脑设置了Git代理,如果Git报错,请运行下面两句话:

git config --global --unset https.proxy
git config --global --unset http.proxy
"
fi
}

echo '
033[1;32m开始执行Brew自动安装程序\033[0m
['$TIME']['$macos_version']
\033[1;36m_____________________________________________________________\033[0m
\033[1;36m _ _\033[0m
\033[1;36m / /| , ,\033[0m
\033[1;36m---/| /-|----------__---_/_---------_--_-----__---_/_-----__-\033[0m
\033[1;36m / |/ | / / ) / / / / ) / ) / /___)\033[0m
\033[1;36m_/__/___|__/____/___/__(_ ___/____/_/__/__(___(__(_ ___(___ _\033[0m
\033[1;36m Mintimate’s Blog:https://www.mintimate.cn \033[0m
\033[1;36m_____________________________________________________________\033[0m
\033[1;36m作者:Mintimate\033[0m'
#选择一个下载源
echo '\033[1;32m
请选择一个下载镜像,例如中科大,输入1回车。
\033[1;33m 1、中科大下载源(推荐) 2、清华大学下载源 3、阿里下载源(cask使用中科大)\033[0m'
read "MY_DOWN_NUM?请输入序号: "
if [[ "$MY_DOWN_NUM" -eq "2" ]];then
echo "你选择了清华大学下载源"
USER_HOMEBREW_BOTTLE_DOMAIN=https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles
#HomeBrew基础框架
USER_BREW_GIT=https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git
#HomeBrew Core
USER_CORE_GIT=https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git
#HomeBrew Cask
USER_CASK_GIT=https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git
USER_CASK_FONTS_GIT=https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-fonts.git
USER_CASK_DRIVERS_GIT=https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-drivers.git
elif [[ "$MY_DOWN_NUM" -eq "3" ]];then
echo "你选择了阿里下载源"
USER_HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles
#HomeBrew基础框架
USER_BREW_GIT=https://mirrors.aliyun.com/homebrew/brew.git
#HomeBrew Core
USER_CORE_GIT=https://mirrors.aliyun.com/homebrew/homebrew-core.git
#HomeBrew Cask
echo "阿里无cask源,使用清华大学cask源"
USER_CASK_GIT=https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git
USER_CASK_FONTS_GIT=https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-fonts.git
USER_CASK_DRIVERS_GIT=https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-drivers.git
else
echo "你选择了中国科学技术大学下载源"
#HomeBrew 下载源 install
USER_HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles
#HomeBrew基础框架
USER_BREW_GIT=https://mirrors.ustc.edu.cn/brew.git
#HomeBrew Core
USER_CORE_GIT=https://mirrors.ustc.edu.cn/homebrew-core.git
#HomeBrew Cask
USER_CASK_GIT=https://mirrors.ustc.edu.cn/homebrew-cask.git
fi
echo '==> 通过命令删除之前的brew、创建一个新的Homebrew文件夹
\033[1;36m请输入开机密码,输入过程不显示,输入完后回车\033[0m'
# 让环境暂时纯粹,重启终端后恢复
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
RmCreate ${HOMEBREW_REPOSITORY}
echo '==> 删除之前brew环境,重新创建'
sudo rm -rf ${HOMEBREW_CACHE}/
sudo rm -rf /Users/$(whoami)/Library/Logs/Homebrew/
sudo rm -rf ${HOMEBREW_PREFIX}/Caskroom
sudo rm -rf ${HOMEBREW_PREFIX}/Cellar
sudo rm -rf ${HOMEBREW_PREFIX}/var/homebrew

echo '==> 克隆Homebrew基本文件(brew.git仓库 32M+)'
sudo git --version
if [ $? -ne 0 ];then
sudo rm -rf "/Library/Developer/CommandLineTools/"
echo '\033[1;36m安装Git\033[0m后再运行此脚本,\033[1;31m在系统弹窗中点击“安装”按钮
如果没有弹窗的老系统,需要自己下载安装:https://git-scm.com/downloads \033[0m'
xcode-select --install
exit 0
fi
sudo git clone $USER_BREW_GIT ${HOMEBREW_REPOSITORY}
JudgeSuccess 尝试切换下载源或者网络

echo '==> 创建brew的快捷方式到系统环境变量'
if [[ "$UNAME_MACHINE" == "arm64" ]]; then
echo 'arm64架构,自动跳过软链接'
else
find ${HOMEBREW_PREFIX}/bin -name brew -exec sudo rm -f {} \;
sudo ln -s ${HOMEBREW_REPOSITORY}/bin/brew ${HOMEBREW_PREFIX}/bin/brew
JudgeSuccess
fi
warning_if
echo '==> 克隆Homebrew Core(Homebrew core仓库 224M+)
\033[1;36m此处如果显示Password表示需要再次输入开机密码,输入完后回车\033[0m'
sudo mkdir -p ${HOMEBREW_REPOSITORY}/Library/Taps/homebrew/homebrew-core
sudo git clone $USER_CORE_GIT ${HOMEBREW_REPOSITORY}/Library/Taps/homebrew/homebrew-core/
JudgeSuccess 尝试切换下载源或者网络
echo '==> 克隆Homebrew Cask(Homebrew cask仓库 248M+)
\033[1;36m此处如果显示Password表示需要再次输入开机密码,输入完后回车\033[0m'
sudo mkdir -p ${HOMEBREW_REPOSITORY}/Library/Taps/homebrew/homebrew-cask
sudo git clone $USER_CASK_GIT ${HOMEBREW_REPOSITORY}/Library/Taps/homebrew/homebrew-cask/
JudgeSuccess 尝试切换下载源或者网络

if [[ "$UNAME_MACHINE" == "arm64" ]]; then
echo '==> 配置ARM64架构Homebrew初始化到配置文件'
echo 'eval $(/opt/homebrew/bin/brew shellenv)' >> ~/.zshrc
else
echo '==> 配置X86架构Homebrew初始化到配置文件'
echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.zshrc
fi

echo '==> 配置国内下载地址'
git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git
git -C "$(brew --repo homebrew/cask)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git
git -C "$(brew --repo homebrew/cask-fonts)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-fonts.git
git -C "$(brew --repo homebrew/cask-drivers)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-drivers.git
git -C "$(brew --repo homebrew/cask-versions)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-versions.git

source ~/.zshrc
echo '
==> 安装完成,brew版本
'
#判断系统版本
if version_gt "$macos_version" "10.13"; then
echo "$macos_version"
else
echo '\033[1;31m检测到你的系统比较老,会有一些报错,请稍等Ruby下载安装;
'
fi

sudo chown -R $(whoami) ${HOMEBREW_REPOSITORY}
#先暂时设置到清华大学源,中科大没有Ruby下载镜像
HOMEBREW_BOTTLE_DOMAIN=https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles
echo 'brew -v
'
brew -v
if [ $? -ne 0 ];then
echo '
\033[1;31m失败 留言我看到会回复(附带前面提示“此步骤失败”以及它的前6句)
或者使用手动安装方法(https://www.mintimate.cn/categories/Mac/)
或QQ咨询:198330181(可能会收费)
'
ls -al /usr/local
echo '--end
\033[0m'
exit 0
else
echo "\033[1;32mBrew前期配置成功\033[0m"
fi
echo '
==> brew update
'
HOMEBREW_BOTTLE_DOMAIN=${USER_HOMEBREW_BOTTLE_DOMAIN}
brew update
if [ $? -ne 0 ];then
echo '
\033[1;31m失败 留言我看到会回复(附带前面提示“此步骤失败”以及它的前6句)
'
else
echo "
\033[1;32m上一句如果提示Already up-to-date表示成功\033[0m
\033[1;32mBrew自动安装程序运行完成\033[0m
\033[1;32m国内地址已经配置完成\033[0m

初步介绍几个brew命令

本地软件库列表:brew ls
查找软件:brew search Software(其中SoftWare替换为要查找的软件关键字)
查看brew版本:brew -v 更新brew版本:brew update

Formulae(方案库 例如安装Python3)
安装方案库:brew install Python3(其中Python3替换为要安装的软件库名称)
卸载方案库:brew uninstall Python3(其中Python3替换为要卸载的软件库名称)

Casks (界面软件 例如谷歌浏览器)
安装软件:brew cask install visual-studio-code(其中visual-studio-code替换为安装的软件名字,例如google-chrome)
卸载软件:brew cask uninstall visual-studio-code(其中visual-studio-code替换为要卸载的软件名字,例如google-chrom
"
fi