Homebrew 使用中的一些问题

2023-03-31 • 更新于 2025-07-04

download.clf.jetbrains.com.cn 证书不受信任

安装 JetBrains 家的 3A 大作时,例如 pycharm-ce,会从 download.jetbrains.com 下载,从国内访问会重定向到 download.clf.jetbrains.com.cn,然后重定向到 download-cdn.jetbrains.com.cn

看起来没什么,CDN 加速嘛,问题是如果使用 brew 版 curl,download.clf.jetbrains.com.cn 的证书链不受信任:

curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the webpage mentioned above.

但是使用系统内置 curl 或者浏览器是可以访问的。

一种解决办法是把 download.jetbrains.com 加入代理,但速度就得看脸了。

其实可以先让 brew 安装,获取 URL 和缓存路径,用系统内置 curl 手动下载文件,然后重新安装即可:

$ brew upgrade pycharm-ce --cask --debug
==> Downloading https://download.jetbrains.com/python/pycharm-community-2025.1.3.dmg
==> Downloading from https://download.clf.jetbrains.com.cn/python/pycharm-community-2025.1.3.dmg?Key-Pair-Id=KP3KOP89OO9G7&Expires=1751722972&Signature=dEnUsSeV~PS3oII1M6613eB90R
/usr/bin/env /usr/local/Homebrew/Library/Homebrew/shims/shared/curl --disable --cookie /dev/null --globoff --show-error --user-agent Homebrew/4.5.8-138-g94606f3-dirty\ \(Macintosh\;\ Intel\ Mac\ OS\ X\ 10.15.7\)\ curl/8.14.1 --header Accept-Language:\ en --fail --progress-bar --retry 3 --remote-time --output /Users/qianbinbin/Library/Caches/Homebrew/downloads/06b43bd257e6ea2fe184885df215ab7d22f5c33845d2f439284faa538602e4da--pycharm-community-2025.1.3.dmg.incomplete --location https://download.clf.jetbrains.com.cn/python/pycharm-community-2025.1.3.dmg\?Key-Pair-Id=KP3KOP89OO9G7\&Expires=1751722972\&Signature=dEnUsSeV\~PS3oII1M6613eB90RM2SNn18hIeXHuJbNhIiKN-7b0p6RSP5J2m8hGJHBV5orYV-w52kHbdyIb7rdCrVxsblrEE6kUfGF8f-GX9wa1Kw0UKRLiNr7HyzgCLkDPDbscFw\~oyURmnS7lijpefqJPoCzKT3r5UP\~ifpyUI2Sf3zEozoaF69Nvx0k9mobFF6MJPHCAfz9WNZaSXkejEgfUyMHKrNp6PS6\~BjerZ4IIhgjriTNntqlWNWvU7u65QjefXe3W8eeTS5DmHVqUMU4332N7xRAV4cBDoHKICOabQqcWGEqwqk9hyYeF92Jd3gXJagSFj4eRHAjsqnw__
$ /usr/bin/curl -L -o /Users/qianbinbin/Library/Caches/Homebrew/downloads/06b43bd257e6ea2fe184885df215ab7d22f5c33845d2f439284faa538602e4da--pycharm-community-2025.1.3.dmg.incomplete https://download.jetbrains.com/python/pycharm-community-2025.1.3.dmg
$ brew upgrade pycharm-ce --cask

编译 Go 项目超时

众所周知,国内网络环境编译 Go 项目会超时,只要设置国内镜像即可:

export GO111MODULE=on
export GOPROXY=https://goproxy.cn,direct

我想了十天十夜也不明白,源码服务器也要屏蔽?多少有点脑瘫哦。

然而即使设置了镜像,brew 在编译 Go 项目时也不会读取用户设置,于是也会超时:

==> go build -o=/usr/local/Cellar/v2ray/5.3.0/libexec/v2ray -ldflags=-s -w -buildid= ./main
Last 15 lines from /Users/username/Library/Logs/Homebrew/v2ray/01.go:
proxy/vmess/encoding/auth.go:8:2: golang.org/x/crypto@v0.4.0: Get "https://proxy.golang.org/golang.org/x/crypto/@v/v0.4.0.zip": dial tcp 142.251.42.241:443: i/o timeout
common/protocol/dns/io.go:7:2: golang.org/x/net@v0.4.0: Get "https://proxy.golang.org/golang.org/x/net/@v/v0.4.0.zip": dial tcp 142.251.43.17:443: i/o timeout
app/dns/nameserver_quic.go:14:2: golang.org/x/net@v0.4.0: Get "https://proxy.golang.org/golang.org/x/net/@v/v0.4.0.zip": dial tcp 142.251.43.17:443: i/o timeout
transport/internet/http/hub.go:11:2: golang.org/x/net@v0.4.0: Get "https://proxy.golang.org/golang.org/x/net/@v/v0.4.0.zip": dial tcp 142.251.43.17:443: i/o timeout
common/strmatcher/matchers.go:9:2: golang.org/x/net@v0.4.0: Get "https://proxy.golang.org/golang.org/x/net/@v/v0.4.0.zip": dial tcp 142.251.43.17:443: i/o timeout
common/protocol/headers.go:6:2: golang.org/x/sys@v0.3.0: Get "https://proxy.golang.org/golang.org/x/sys/@v/v0.3.0.zip": dial tcp [2404:6800:4012:2::2011]:443: i/o timeout
transport/internet/filelocker_other.go:9:2: golang.org/x/sys@v0.3.0: Get "https://proxy.golang.org/golang.org/x/sys/@v/v0.3.0.zip": dial tcp [2404:6800:4012:2::2011]:443: i/o timeout
app/commander/commander.go:10:2: google.golang.org/grpc@v1.51.0: Get "https://proxy.golang.org/google.golang.org/grpc/@v/v1.51.0.zip": dial tcp 142.251.43.17:443: i/o timeout
transport/internet/grpc/dial.go:13:2: google.golang.org/grpc@v1.51.0: Get "https://proxy.golang.org/google.golang.org/grpc/@v/v1.51.0.zip": dial tcp 142.251.43.17:443: i/o timeout
app/instman/command/command_grpc.pb.go:6:2: google.golang.org/grpc@v1.51.0: Get "https://proxy.golang.org/google.golang.org/grpc/@v/v1.51.0.zip": dial tcp 142.251.43.17:443: i/o timeout
transport/internet/grpc/dial.go:14:2: google.golang.org/grpc@v1.51.0: Get "https://proxy.golang.org/google.golang.org/grpc/@v/v1.51.0.zip": dial tcp 142.251.43.17:443: i/o timeout
transport/internet/grpc/dial.go:15:2: google.golang.org/grpc@v1.51.0: Get "https://proxy.golang.org/google.golang.org/grpc/@v/v1.51.0.zip": dial tcp 142.251.43.17:443: i/o timeout
transport/internet/grpc/encoding/conn.go:13:2: google.golang.org/grpc@v1.51.0: Get "https://proxy.golang.org/google.golang.org/grpc/@v/v1.51.0.zip": dial tcp 142.251.43.17:443: i/o timeout
app/commander/service.go:7:2: google.golang.org/grpc@v1.51.0: Get "https://proxy.golang.org/google.golang.org/grpc/@v/v1.51.0.zip": dial tcp 142.251.43.17:443: i/o timeout
app/instman/command/command_grpc.pb.go:7:2: google.golang.org/grpc@v1.51.0: Get "https://proxy.golang.org/google.golang.org/grpc/@v/v1.51.0.zip": dial tcp 142.251.43.17:443: i/o timeout

brew 编译时实际上调用的是 Ruby 脚本,那就可以直接修改脚本。以 v2ray 为例,在 $(brew --repository homebrew/core) 目录应用以下 patch:

diff --git a/Formula/v2ray.rb b/Formula/v2ray.rb
index 297d0759440..baef313f96f 100644
--- a/Formula/v2ray.rb
+++ b/Formula/v2ray.rb
@@ -39,6 +39,9 @@ class V2ray < Formula
   end

   def install
+    ENV['GO111MODULE'] = 'on'
+    ENV['GOPROXY'] = 'https://goproxy.cn,direct'
+
     ldflags = "-s -w -buildid="
     system "go", "build", *std_go_args(ldflags: ldflags, output: libexec/"v2ray"), "./main"

Perl 版本过低

此类问题没有统一的错误日志,但是查看编译日志,例如 ~/Library/Logs/Homebrew/openssl@3/04.make,如果看到一堆关于 perl 的错误1,就基本确定是 perl 版本的问题了:

$ grep 'you may need to install' ~/Library/Logs/Homebrew/openssl@3/04.make
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_certtypeext.t ...................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_comp.t ..........................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_key_share.t .....................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_npn.t ...........................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_sslcbcpadding.t .................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_sslcertstatus.t .................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_sslextension.t ..................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_sslmessages.t ...................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_sslsigalgs.t ....................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_sslsessiontick.t ................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_sslsignature.t ..................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_sslskewith0p.t ..................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_sslversions.t ...................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_sslvertol.t .....................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_tls13alerts.t ...................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_tls13cookie.t ...................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_tls13downgrade.t ................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_tls13hrr.t ......................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_tls13kexmodes.t .................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_tls13messages.t .................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_tls13psk.t ......................
Can't locate IO/Socket/IP.pm in @INC (you may need to install the IO::Socket::IP module) (@INC contains: /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/Configurations . /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.4 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/external/perl/Text-Template-1.56/lib) at /private/tmp/opensslA3-20250703-82846-1idqq/openssl-3.5.1/util/perl/TLSProxy/Proxy.pm line 100.70-test_tlsextms.t ......................

这种情况可以尝试加入 depends_on "perl" => :build,让软件依赖 brew 版 perl:

diff --git a/Formula/o/openssl@3.rb b/Formula/o/openssl@3.rb
index af7fd717b72..8a966060f04 100644
--- a/Formula/o/openssl@3.rb
+++ b/Formula/o/openssl@3.rb
@@ -23,6 +23,7 @@ class OpensslAT3 < Formula
   end

   depends_on "ca-certificates"
+  depends_on "perl" => :build

   on_linux do
     resource "Test::Harness" do

这样就可以编译了。

不过,openssl 已经在修复 perl 版本问题,毕竟他们的文档里说只需 perl 5.10 就行。

如果不想依赖 brew 版 perl,要应用此 patch,在脚本中加入断点:

diff --git a/Formula/o/openssl@3.rb b/Formula/o/openssl@3.rb
index af7fd717b72..b502996acc0 100644
--- a/Formula/o/openssl@3.rb
+++ b/Formula/o/openssl@3.rb
@@ -107,6 +107,7 @@ class OpensslAT3 < Formula
     system "make", "install", "MANDIR=#{man}", "MANSUFFIX=ssl"
     # AF_ALG support isn't always enabled (e.g. some containers), which breaks the tests.
     # AF_ALG is a kernel feature and failures are unlikely to be issues with the formula.
+    raise "DEBUG BREAKPOINT"
     system "make", "HARNESS_JOBS=#{ENV.make_jobs}", "test", "TESTS=-test_afalg"

     # Prevent `brew` from pruning the `certs` and `private` directories.

然后执行 brew install openssl@3.rb --debug,到 make test 前一步自动停止,进入 shell,下载并应用 patch:

curl -LO https://github.com/openssl/openssl/pull/27941.diff
git apply 27941.diff

然后退出并继续即可。

但并不是所有的 perl 版本问题都可以这么简单解决,例如下面的 git 编译问题,就需要大体了解 git 构建过程。

./t-git-credential-netrc.sh: No such file or directory

编译安装 git 时出现错误:

# ~/Library/Logs/Homebrew/git/05.make
make
test

/Applications/Xcode.app/Contents/Developer/usr/bin/make -C ../../.. SCRIPT_PERL="contrib/credential/netrc/git-credential-netrc.perl" \
                build-perl-script
    * new perl-specific parameters
\
	INSTLIBDIR='/private/tmp/git-20250521-61559-k2ku4o/git-2.49.0/.brew_home/share/perl5' && \
	INSTLIBDIR_EXTRA='/Applications/Xcode.app/Contents/Developer/Library/Perl/5.18/darwin-thread-multi-2level:/Library/Developer/CommandLineTools/Library/Perl/5.18/darwin-thread-multi-2level' && \
	INSTLIBDIR="$INSTLIBDIR${INSTLIBDIR_EXTRA:+:$INSTLIBDIR_EXTRA}" && \
	sed -e 's=@PATHSEP@=:=g' \
	    -e "s=@INSTLIBDIR@=$INSTLIBDIR=g" \
	    -e 's=@PERLLIBDIR_REL@=share/perl5=g' \
	    -e 's=@GITEXECDIR_REL@=libexec/git-core=g' \
	    -e 's=@LOCALEDIR_REL@=share/locale=g' \
	    perl/header_templates/fixed_prefix.template.pl >GIT-PERL-HEADER+ && \
	mv GIT-PERL-HEADER+ GIT-PERL-HEADER
/bin/sh generate-perl.sh ./GIT-BUILD-OPTIONS ./GIT-VERSION-FILE GIT-PERL-HEADER "contrib/credential/netrc/git-credential-netrc.perl" "contrib/credential/netrc/git-credential-netrc+" && \
	mv contrib/credential/netrc/git-credential-netrc+ contrib/credential/netrc/git-credential-netrc
./t-git-credential-netrc.sh
?!ERR?! ./t-git-credential-netrc.sh: No such file or directory
ok 1 - set up test repository
not ok 2 - git-credential-netrc
#
#			perl "$GIT_SOURCE_DIR"/contrib/credential/netrc/test.pl
#
# failed 1 among 2 test(s)
1..2
make: *** [test] Error 1

提示找不到 ./t-git-credential-netrc.sh 这个文件,这个错误让人很容易以为是路径问题。

从 2.47.1 版本以后就这样,就先 pin 了,以为过一段时间会有 brew 或 git 维护人员发现并修复,然而都 2.49.0 了还是不行。

如果在 git 源码 contrib/credential/netrc 目录下运行 make testverbose,会出现以下错误:

Perl v5.26.0 required--this is only v5.18.4

继续查阅源码可知 git 从 2.48 就开始要求 perl 5.26 了

Catalina 自带的 /usr/bin/perl 只有 5.18,brew 编译 git 时并不使用 brew 版 perl,而是系统自带,于是我这个 Catalina 老同志就被偷袭了。

如果指定较新的 perl export PERL_PATH=/usr/local/bin/perl,就可以正常编译。

对此,考虑以下几种解决方法:

  1. 如果不追求新版,可以 pin 在 2.47.1。

    如果还没有用 brew 安装 git,本地有 homebrew-core 源码的话,可以提取历史版本并编译:

    git show aecf26f53d0:Formula/g/git.rb >git.rb
    brew install ./git.rb --formula
    rm ./git.rb
    

    或者去官方仓库下载历史版本。

    brew 脚本我认为是有 bug 的,它编译出的 git-credential-netrc 中模块路径错误,用的是编译时的临时目录,例如 /private/tmp/git-20250527-25582-blyz61/git-2.49.0/.brew_home/share/perl5

    如果不需要 git-credential-netrc,可以将相关脚本注释掉。或者参考方法 3 修改路径。

  2. 如果想升级 git,可以将脚本中与 perl 相关部分注释掉,包括 git-credential-netrc、diff-highlight、git-send-email 相关代码,以及 Net::SMTP::SSL 模块(git-send-email 依赖它)。这也意味着这些工具将无法使用。

    git 源码中还有一个 NO_PERL 环境变量,但我没试过。

    git-credential-netrc 可能用的人不多,毕竟 macOS 上一般用 SSH、git-credential-osxkeychain。但 diff-highlight 还是很有用的,可以在 diff 高亮显示不同的部分。git-send-email 用于发送邮件。

  3. 如果想升级 git 且需要 perl 相关工具,可以使用 brew 版 perl。

    在 brew 脚本中做如下修改:

    diff --git a/Formula/g/git.rb b/Formula/g/git.rb
    index a58a53ea0d6..82200f7576f 100644
    --- a/Formula/g/git.rb
    +++ b/Formula/g/git.rb
    @@ -23,6 +23,7 @@ class Git < Formula
    
       depends_on "gettext"
       depends_on "pcre2"
    +  depends_on "perl" => :build
    
       uses_from_macos "curl", since: :catalina # macOS < 10.15.6 has broken cert path logic
       uses_from_macos "expat"
    @@ -125,12 +126,13 @@ class Git < Formula
    
         # Generate diff-highlight perl script executable
         cd "contrib/diff-highlight" do
    -      system "make"
    +      system "make", "PERL_PATH=#{ENV["PERL_PATH"]}"
         end
    
         # Install the netrc credential helper
         cd "contrib/credential/netrc" do
    -      system "make", "test"
    +      system "make", "PERL_PATH=#{ENV["PERL_PATH"]}", "test"
    +      inreplace "git-credential-netrc", %r{(?<=\$ENV\{GITPERLLIB\} \|\| ')[^:']+}, share/"perl5"
           git_core.install "git-credential-netrc"
         end
    

    depends_on "perl" => :build 指定 brew 版 perl,脚本会将路径保存在 PERL_PATH 环境变量。

    子模块编译时此环境变量无效,因此 make 命令还是需要 PERL_PATH=

    inreplace 一行会将 git-credential-netrc 脚本中的临时路径

    use lib (split(/:/, $ENV{GITPERLLIB} || '/private/tmp/git-20250527-25582-blyz61/git-2.49.0/.brew_home/share/perl5:/Applications/Xcode.app/Contents/Developer/Library/Perl/5.40/darwin-thread-multi-2level:/Library/Developer/CommandLineTools/Library/Perl/5.40/darwin-thread-multi-2level'));
    

    修改为形如 /usr/local/Cellar/git/2.49.0/share/perl5,这也是编译脚本中模块安装位置。

    另外,临时路径之后的几个路径也是错误的。它在 brew 脚本里通过 PERLLIB_EXTRA 设置,这可能是新版 macOS 的路径。但不影响使用。

    最后可将 /usr/local/opt/git/share/git-core/contrib/diff-highlight 加入 PATH 环境变量,并添加到 git 配置:

    git config --global pager.diff 'diff-highlight | less'
    git config --global pager.log 'diff-highlight | less'
    git config --global pager.show 'diff-highlight | less'
    

sha256 mismatch

这类问题出现频率很高,在官方仓库可以看到大量相关的 issue、commit 和 PR。

除了网络问题外,通常有两种原因。

上游重新发布同一版本

这时依旧修改脚本,例如修改 launchcontrol,在 $(brew --repository homebrew/cask) 目录下:

diff --git a/Casks/launchcontrol.rb b/Casks/launchcontrol.rb
index 5c2db44947..db25b721a8 100644
--- a/Casks/launchcontrol.rb
+++ b/Casks/launchcontrol.rb
@@ -1,7 +1,7 @@
 cask "launchcontrol" do
   on_catalina :or_older do
     version "1.52.7"
-    sha256 "16c3d89e41a99cbf43e6996681358e8e7a4bc63fa770b9f8c0bc72c5356a0b8a"
+    sha256 "760edc3f3238ecbbc9f0c14b17ced9ac2a46c46a4ed8feec6bfb532fced37b7e"

     livecheck do
       skip "Legacy version"

确认没问题的话可以去提 PR。

源码归档在服务端重新生成

GitHub 和 Gitlab 都使用 git archive 将源码归档为 tar 包,但不管是 GitHub2 还是 Gitlab3,都不保证源码归档的稳定性。

例如我发现的 Gitlab 校验变化问题:

$ curl -fsSL https://gitlab.com/AOMediaCodec/SVT-AV1/-/archive/v1.4.1/SVT-AV1-v1.4.1.tar.bz2 | sha256sum
2ddef549e1eaeecc1fc48f0d8332ea3545809e46509db69beb3a0a4bf19ef906  -
$ # 过一段时间
$ curl -fsSL https://gitlab.com/AOMediaCodec/SVT-AV1/-/archive/v1.4.1/SVT-AV1-v1.4.1.tar.bz2 | sha256sum
0e988582f315fe76c909accf5e7f81b975c5bd2b850ee760d8e9fac297f70b5d  -

两个 tar 包内容完全一样,只有文件夹名不同:

$ curl -fsSL https://gitlab.com/AOMediaCodec/SVT-AV1/-/archive/v1.4.1/SVT-AV1-v1.4.1.tar.bz2 >old
$ # 过一段时间
$ curl -fsSL https://gitlab.com/AOMediaCodec/SVT-AV1/-/archive/v1.4.1/SVT-AV1-v1.4.1.tar.bz2 >new
$ tar xf old
$ ls
SVT-AV1-v1.4.1
$ tar xf new
$ ls
SVT-AV1-018276d714ce65d9b586f6205ee016cbd8d5425d
SVT-AV1-v1.4.1
$ diff SVT-AV1-v1.4.1 SVT-AV1-018276d714ce65d9b586f6205ee016cbd8d5425d -r
$ echo $?
0

我也是服了某些 brew 的维护者,复现不了我的问题就说是我配置问题,神他妈配置问题😅

Gitlab 官方人员解释如下:

The root cause was discussed in a confidential issue, but I can share a general idea what went wrong.

One of deployed fixes had a side-effect of changing the hash sum of the archived files. When it was discovered, we reverted the code. However, Cloudflare still responded with old archive files for some regions. We updated the cache and that resolved the problem.

好了,破案了。Gitlab 也是个鬼才,归档生成机制变了也就算了,同一个老 URL,还能返回不同的文件。

要是不幸遇到这种问题,自认倒霉吧,依旧直接改脚本。鬼知道什么时候抽风。

其结果就是,明明服务商不保证自动归档的稳定性,而 brew 却依赖这一点。

要保证源码包的稳定性,应该由作者官方以 release 形式发布,就像各种开源软件官网那样,然后由官方提供校验方法。

那么从全局看,怎么避免这种错误?我觉得 brew 完全可以定期检查哈希值,如果变更则自动提 PR,这一点可以通过 CI/CD 自动化完成。

Warning: You are using macOS 10.15.

We (and Apple) do not provide support for this old version.
It is expected behaviour that some formulae will fail to build in this old version.
It is expected behaviour that Homebrew will be buggy and slow.
Do not create any issues about this on Homebrew's GitHub repositories.
Do not create any issues even if you think this message is unrelated.
Any opened issues will be immediately closed without response.
Do not ask for help from Homebrew or its maintainers on social media.
You may ask for help in Homebrew's discussions but are unlikely to receive a response.
Try to figure out the problem yourself and submit a fix as a pull request.
We will review it but may or may not accept it.

啊对对对,我知道我们老古董不配用高贵的 brew,出了问题后果自负我理解。

但是你每次一大堆烦人的警告跳脸连个他妈的开关都没有?哪怕减到一行呢?

何况苹果只是对系统停止了支持,你一个包管理器,不想支持老系统直接大方说不就行了,和苹果对系统的支持有个毛线关系?难道苹果不让 Catalina 用户用 App Store 了?Ubuntu 就连 12.04 甚至更老的版本,改一下源就能继续用官方的老仓库。

对于一个非盈利的开源软件,我表示支持,但你别又当又立😅

发现我脾气逐渐暴躁,管他的,反正鬼佬看不懂中文。

编辑 $(brew --repository)/Library/Homebrew/extend/os/mac/diagnostic.rb 这个脚本,在 check_for_unsupported_macos 方法第一行直接返回:

diff --git a/Library/Homebrew/extend/os/mac/diagnostic.rb b/Library/Homebrew/extend/os/mac/diagnostic.rb
index 1cbc907f3..37b5b91ba 100644
--- a/Library/Homebrew/extend/os/mac/diagnostic.rb
+++ b/Library/Homebrew/extend/os/mac/diagnostic.rb
@@ -106,6 +106,7 @@ module Homebrew
       end

       def check_for_unsupported_macos
+        return
         return if Homebrew::EnvConfig.developer?
         return if ENV["HOMEBREW_INTEGRATION_TEST"]

整个世界都清净了!

macOSGoHomebrewGitPerl

本作品根据 署名-非商业性使用-相同方式共享 4.0 国际许可 进行授权。

在 Linux 上使用 Exim4 发送邮件

在 Android 上部署 Linux