主要观点:
brew upgrade命令默认会更新所有公式和桶,虽方便获取新功能,但不利于只需要安静补丁级修复的情况。- 作者用 Perl 和 Go 分别实现了
brew-patch-upgrade.pl脚本,以解决上述问题,并对比了两种语言在错误处理、依赖管理、类型安全、二进制分发和语义版本逻辑等方面的差异。 - 得出平台工程的一些见解,如二进制分发很重要、语义版本控制是一种操作实践、Go 的设计符合平台需求等。
关键信息:
- Perl 版本通过
try/catch处理错误,依赖cpanfile等,可手动比较版本号。 - Go 版本每个函数显式返回错误,依赖
go.mod和go build,使用struct处理 JSON 解析,导入golang.org/x/mod/semver库处理版本逻辑。 - Go 在二进制分发方面表现出色,可提供不同平台的二进制文件。
- 得到的平台工程见解包括二进制分发重要、语义版本控制是操作实践、Go 设计符合平台需求等。
重要细节:
- macOS 自带的 Perl v5.34.1 中
try/catch是实验性的,v5.40 已被接受。 - Go 版本的错误处理更明确,强迫显式决策,避免沉默失败。
- Perl 可通过
cpanfile等自动化依赖管理,Go 只需go.mod和go build生成单个二进制文件。 - Go 的
struct能让编译器强制假设,减少隐式错误。 homebrew-semver-guard有不同平台的二进制文件,可在release page获取。- 该项目不是“Perl vs. Go”的竞争,而是展示用 Go 重写 Perl 脚本的过程和所得。
- 后续计划考虑更多 Go 工具和在家庭服务器上使用 Kubernetes。
- 相关链接:原始 Perl 脚本
[brew-patch-upgrade.pl](https://codeberg.org/mjgardner/brew-patch-upgrade/src/branch/main/brew-patch-upgrade.pl)、Go 版本[homebrew-semver-guardv0.1.0](https://codeberg.org/mjgardne...、上周的帖子Patch-Perfect: Smarter Homebrew Upgrades on macOS。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。