找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1459

积分

0

好友

187

主题
发表于 2026-2-15 08:51:30 | 查看: 34| 回复: 0

如果你的Zig项目里用到了第三方依赖,那么最近上线的两项关于 zig build 的重大改进,绝对值得你关注。

一、依赖包本地化存储

现在,通过 zig build 获取的依赖包,会被直接存放在项目根目录下的一个名为 zig-pkg 的文件夹里,这个文件夹与你的 build.zig 文件处于同一层级。

举个例子,在 awebo 项目中执行 zig build 后,你可能会看到类似这样的结果:

$ du -sh zig-pkg/*
13M    freetype-2.14.1-alzUkTyBqgBwke4Jsot997WYSpl207Ij9oO-2QOvGrOi
20K    opus-0.0.2-vuF-cMAkAADVsm707MYCtPmqmRs0gzg84Sz0qGbb5E3w
4.3M   pulseaudio-16.1.1-9-mk_62MZkNwBaFwiZ7ZVrYRIf_3dTqqJR5PbMRCJzSuLw
5.2M   uucode-0.1.0-ZZjBPvtWUACf5dqD_f9I37VGFsN24436CuceC5pTJ25n
728K   vaxis-0.5.1-BWNV_AxECQCj3p4Hcv4U3Yo1WMUJ7Z2FUj0UkpuJGxQQ

强烈建议你将这个 zig-pkg 目录添加到项目的 .gitignore 等版本控制忽略文件中。但是,把它从 .zig-cache 中独立出来的设计,开启了一个新的可能性:你可以分发一个“自包含的源码包”,它里面已经打包了所有依赖项。这对于需要在离线环境下构建,或者需要将某个特定版本的项目及其依赖完整归档的场景来说,非常方便。

与此同时,依赖包也会在全局缓存中保留一份副本。在根据路径过滤器(paths filter)移除了所有未使用的文件后,这些内容会被重新压缩存储:

$ du -sh ~/.cache/zig/p/*
2.4M    freetype-2.14.1-alzUkTyBqgBwke4Jsot997WYSpl207Ij9oO-2QOvGrOi.tar.gz
4.0K    opus-0.0.2-vuF-cMAkAADVsm707MYCtPmqmRs0gzg84Sz0qGbb5E3w.tar.gz
636K    pulseaudio-16.1.1-9-mk_62MZkNwBaFwiZ7ZVrYRIf_3dTqqJR5PbMRCJzSuLw.tar.gz
880K    uucode-0.1.0-ZZjBPvtWUACf5dqD_f9I37VGFsN24436CuceC5pTJ25n.tar.gz
120K    vaxis-0.5.1-BWNV_BFECQBbXeTeFd48uTJRjD5a-KD6kPuKanzzVB01.tar.gz

这次变更的核心动力,是为了让“折腾”变得更简单。现在你可以随心所欲地修改这些本地依赖文件,看看会发生什么;或者把整个包目录替换成你 git clone 的仓库;你可以方便地对所有依赖项执行全局的 grep 搜索;配置你的IDE,让它基于 zig-pkg 目录提供代码补全;甚至可以用磁盘空间分析工具(比如 baobab)来审视你的依赖树。

此外,让全局缓存存储压缩文件,也便于在多台计算机之间共享缓存数据。未来,团队计划支持依赖树的P2P种子下载。通过将软件包重新压缩为标准格式,节点之间可以用最小的带宽来共享Zig软件包。这个想法非常棒,它不仅能提供应对网络中断的韧性,还能像一场“人气竞赛”——通过观察做种者的数量,你就能直观地看出哪些开源包最受社区欢迎!

二、新增 --fork 命令行标志

第二项改进,是为 zig build 增加了一个 --fork 标志。回头看看,这个功能似乎显而易见,真不知道当初设计时怎么没考虑到它。它的用法很简单:

zig build --fork=[路径]

这是一个项目覆盖选项。通过提供一个本地源码检出路径,整个依赖树中所有匹配该项目的包都会被这个本地版本覆盖。

得益于包内容哈希(Package Content Hashes)包含了名称和指纹信息,这种覆盖操作在尝试从网络获取包之前就会生效。

这为临时使用一个存放在完全独立目录中的Fork版本,提供了一种极其简便的方法。你可以对整个依赖树进行迭代修改和测试,直到一切工作正常,同时还能充分利用原依赖项目本身的开发环境、版本控制系统和测试套件。

由于它是一个命令行标志,这使得它具有恰到好处的“临时性”。一旦你移除了这个标志,构建过程就会立刻切换回使用原始的、自动获取的依赖树状态。

如果提供的路径与依赖树中的任何项目都不匹配,系统会报错以避免混淆:

$ zig build --fork=/home/andy/dev/mime
error: fork /home/andy/dev/mime matched no mime packages

如果匹配成功,你会收到一个明确的提示:

$ zig build --fork=/home/andy/dev/dvui
info: fork /home/andy/dev/dvui matched 1 (dvui) packages
...

此功能旨在提升处理因生态系统变动导致构建失败时的流转效率。实际体验下来,这个新工作流非常顺畅:

  1. 因某个上游依赖的更新,导致你的项目构建失败。
  2. 使用 --fork 标志,将其指向你修复问题后的本地版本,直到你的项目恢复工作。在此期间,你可以充分利用上游仓库的版本控制、测试套件,甚至 zig build test --watch -fincremental 这样的实时开发工具。
  3. 现在你有了选择:可以“自私”一点,继续忙自己的事;或者,将你的修复补丁提交给上游项目。

……而且你大概率可以跳过将 build.zig.zon 文件修改指向你的Fork这一步,除非你预见到上游合并你的修复需要很长时间。

原文链接:https://ziglang.org/devlog/2026/#2026-02-06

对于开发者而言,深入了解包管理和构建系统的工作原理,是提升工程效率的关键。无论是Zig的这些新特性,还是其他语言生态中的类似工具,其核心目标都是简化依赖处理流程。如果你对这些底层机制感兴趣,或者想了解更多关于编程基础与实践的讨论,欢迎到我们云栈社区的“基础 & 综合”板块交流分享。作为一门注重简洁与显式控制的系统编程语言,Zig 在包管理上的这些务实改进,无疑会让开发者社区的体验变得更加友好和高效。




上一篇:Go 1.26 全景解析:new(expr)语法、Green Tea GC及智能化工具链演进
下一篇:Micro1数据标注创企估值达173亿,00后创始人或成最年轻亿万富翁
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-23 10:27 , Processed in 0.527884 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表