Homebrew 修改国内源

1

Homebrew 是 Mac 上最常用的软件包管理工具,可以简化 macOS 系统是的软件安装过程。但由于国内网络环境,每次更新时速度都不忍直视。为了提升速度和体验,建议修改为国内源。

目前有两个常用 Homebrew 源,分别是阿里镜像清华大学镜像。其中清华镜像在阿里镜像已有的 brewhomebrew-core 之外,还额外提供了 homebrew-cask 源。所以我采用的策略是:brewhomebrew-core 使用阿里的,homebrew-cask 使用清华的,原因是阿里在程序员心目中的地位是要高于清华的。

直接复制以下命令在终端运行即可:

1
2
3
git -C "$(brew --repo)" remote set-url origin https://mirrors.aliyun.com/homebrew/brew.git
git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.aliyun.com/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

没有安装使用 homebrew-cask 的情况下,最后一条命令会报错,可以忽略。

之后执行 brew update 使配置生效并测试工作是否正常。

Homebrew 还提供了一个核心组件 Homebrew-bottles,可以提供一些包的二进制预编译版本,省去本地下载源码、编译源码的时间,提升安装效率,所以可以把 Homebrew-bottles 的源地址也进行替换,Homebrew-bottles 的地址是通过环境变量加载的,所以有两种修改方式:

临时生效:

1
export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles

永久生效(以 zsh 为例):

1
2
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.zshrc
source ~/.zshrc

Enjoy!


下边记录两个通过 homebrew 更新软件包后可能会出现的问题

更新 openssl 后新开命令行窗口报错

报错内容:

1
2
3
4
5
6
7
8
9
10
11
12
ERROR:root:code for hash md5 was not found.
Traceback (most recent call last):
File "/usr/local/Cellar/python@2/2.7.15_3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hashlib.py", line 147, in <module>
globals()[__func_name] = __get_hash(__func_name)
File "/usr/local/Cellar/python@2/2.7.15_3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor
raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type md5
ERROR:root:code for hash sha1 was not found.
……
File "/usr/local/Cellar/mercurial/4.9/lib/python2.7/site-packages/hgdemandimport/demandimportpy2.py", line 151, in __getattr__
return getattr(self._module, attr)
AttributeError: 'module' object has no attribute 'md5'

修复方法:

执行:ls /usr/local/Cellar/openssl,可以看到当前可用的 openssl 版本:

1
2
3
➜ ls /usr/local/Cellar/openssl

1.0.2o_1 1.0.2q

根据列出的版本,执行 brew switch openssl <版本号> 来指定版本(有可能在你本地只存在一个版本或和我这里有其他区别):

1
2
3
4
5
➜ brew switch openssl 1.0.2q

// 正常情况下会返回一下内容
Cleaning /usr/local/Cellar/openssl/1.0.2q
Opt link created for /usr/local/Cellar/openssl/1.0.2q

问题解决~

更新 MySQL 后出问题

Python 程序在连接 MySQL 时,报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
Traceback (most recent call last):
File "/Users/jiapan/.virtualenvs/bossku/lib/python2.7/site-packages/flask/app.py", line 1997, in __call__
return self.wsgi_app(environ, start_response)
……
……
……
File "/Users/jiapan/.virtualenvs/bossku/lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.py", line 102, in dbapi
return __import__('MySQLdb')
File "/Users/jiapan/.virtualenvs/bossku/lib/python2.7/site-packages/MySQLdb/__init__.py", line 19, in <module>
import _mysql
ImportError: dlopen(/Users/jiapan/.virtualenvs/bossku/lib/python2.7/site-packages/_mysql.so, 2): Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.20.dylib
Referenced from: /Users/jiapan/.virtualenvs/bossku/lib/python2.7/site-packages/_mysql.so
Reason: image not found

你的报错可能和我这里稍有区别,主要是倒数第三行,我这里是 libmysqlclient.20.dylib,你那里可能是 libmysqlclient.18.dylib 或其他的,不过理论上都可以通过这个方法解决。

修复方法:

执行 ls /usr/local/lib | grep libmysqlclient,我这里可以看到如下内容:

1
2
3
libmysqlclient.21.dylib -> ../Cellar/mysql/8.0.19/lib/libmysqlclient.21.dylib
libmysqlclient.a -> ../Cellar/mysql/8.0.19/lib/libmysqlclient.a
libmysqlclient.dylib -> ../Cellar/mysql/8.0.19/lib/libmysqlclient.dylib

查看列表中有没有和报错中完全相同的文件,如果存在完全匹配的就直接建立对应软链到 /usr/local/opt/mysql/lib/,没有的话就用 libmysqlclient.dylib 代替。

我这里没有 libmysqlclient.20.dylib,所以我使用的命令如下:

1
ln -s /usr/local/lib/libmysqlclient.dylib /usr/local/opt/mysql/lib/libmysqlclient.20.dylib

问题解决~


参考: