×

homebrew不使用代理的问题

2021-04-14 18:29:30 Falcon

今天用homebrew安装openresty,发现一个奇怪的问题,安装时需要下载一个文件, https://raw.githubusercontent.com/openresty/openresty/master/patches/openssl-1.1.1f-sess_set_get_cb_yield.patch  然后就报错退出:

curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443

于是很自然地想到使用 proxy_chain 执行安装,但依然提示这个错误。接着尝试给homebrew使用代理,实际上就是给curl配置代理,因为homebrew是调用curl来进行文件下载的。修改~/.curlrc文件,加上socks5的代理, 像这样配置好了代理:

socks5 = "127.0.0.1:1085"

保存后测试直接调用curl可以成功下载 raw.githubusercontent.com 上的那个文件。然而再次使用homebrew安装依然提示SSL错误。?

这说明 homebrew 在调用 curl 时并没有使用到代理,这是为什么呢?为了追根溯源,我们来看一下整个安装过程。

PS:使用 -v 命令可以查看homebrew安装过程

$  brew -v install openresty/brew/openresty
==> Installing openresty from openresty/brew
==> Downloading https://homebrew.bintray.com/bottles/geoip-1.6.12.catalina.bottle.1.tar.gz
Already downloaded: /Users/falcon/Library/Caches/Homebrew/downloads/0b6b3fee7857c204e048fa865837318a0c094739d8ce80c2e9a233f359dd03e4--geoip-1.6.12.catalina.bottle.1.tar.gz
==> Verifying checksum for '0b6b3fee7857c204e048fa865837318a0c094739d8ce80c2e9a233f359dd03e4--geoip-1.6.12.catalina.bottle.1.tar.gz'.
==> Downloading https://raw.githubusercontent.com/openresty/openresty/master/patches/openssl-1.1.1f-sess_set_get_cb_yield.patch
/usr/bin/curl --disable --globoff --show-error --user-agent Homebrew/2.6.0\ \(Macintosh\;\ Intel\ Mac\ OS\ X\ 10.15.7\)\ curl/7.64.1 --header Accept-Language:\ en --fail --retry 3 --location --remote-time --continue-at 0 --output /Users/falcon/Library/Caches/Homebrew/downloads/57153ba4d1c3b1ddddf8b3fbfaa4338c7a0f2f3e5d09af19f02613e478b375e5--openssl-1.1.1f-sess_set_get_cb_yield.patch.incomplete https://raw.githubusercontent.com/openresty/openresty/master/patches/openssl-1.1.1f-sess_set_get_cb_yield.patch
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443
Error: Failed to download resource "openresty-openssl111--patch"

留意这一行

/usr/bin/curl --disable --globoff --show-error --user-agent Homebrew/2.6.0\ \(Macintosh\;\ Intel\ Mac\ OS\ X\ 10.15.7\)\ curl/7.64.1 --header Accept-Language:\ en --fail --retry 3 --location --remote-time --continue-at 0 --output /Users/falcon/Library/Caches/Homebrew/downloads/57153ba4d1c3b1ddddf8b3fbfaa4338c7a0f2f3e5d09af19f02613e478b375e5--openssl-1.1.1f-sess_set_get_cb_yield.patch.incomplete https://raw.githubusercontent.com/openresty/openresty/master/patches/openssl-1.1.1f-sess_set_get_cb_yield.patch

从这里可以看到  curl 使用了一个叫 --disable 的参数,查看curl的帮助可以看出:

$ curl -h | grep disable
 -q, --disable       Disable .curlrc
...

这个参数的作用是忽略 .curlrc 的配置,这就解释了在 .curlrc 中配置的代理不生效的原因。

不过也有办法更改这个设置,那就是export 一个 HOMEBREW_CURLRC的变量来指定 .curlrc 的位置 , 写在shell的配置文件里,比如~/.zshrc或者 ~/.bashrc中,也可以单独为homebrew 中使用的curl 配置一个不同于默认配置的 curlrc

export HOMEBREW_CURLRC="~/.curlrc"

官方还有更多其他的配置,具体可以查看这里:https://docs.brew.sh/Manpage

PS: 一直不太喜欢homebrew,原因是经常踩到 homebrew 的坑,许多软件能安装得起来运转得正常,一旦 brew update 之后 突然就运行不起来太正常不过了,正常是运气好,不正常又没了半天时间,比如上次的openssl更新后,php-fpm就运行不起来了,要花大量的时间去找原因和解决方案。homebrew 配置我也认为是违反直觉的,作为一个用户层面的软件,为什么要默认禁止用户的 配置呢?

最根本的原因可能是homebrew依赖太多其他的软件,又不想被他们的配置左右,类似的情形上次我看到的可能是WordPress在使用MySQL连接时,把会话时的sql_mode单独设定为非严格模式,这样就不依赖系统的sql_mode设定,因为不同机器上的 sql_mode 可能是严格模式,也可能是非严格模式,WordPress这样做,可以从根本上保证在各个机器上表现一致。 

可能这就是我能为brew辩护的最后的理由。。。

本文收录于