202302 | 精益求精的包管理
包管理器进展
包管理器自 #14265 合并后一直在不断推进,以下两个是最主要的改变:
build system terminology update: package, project, module, dependency
这里重新梳理了现在的术语,主要有以下几个:
package
文件的集合,由文件的 hash 值唯一指定,一个 package 可能包含任意数目的 compilation artifacts 与 modules。dependency
不同 package 之间的有向边,一个 package 可以有任意个依赖,一个 package 也可以用作任意项目的依赖module
文件的集合,每一个模块都有一个 root 文件,在被@import
时用到。compilation artifact
编译构建产物,可以是 static library,dynamic library,an executable 或 an object file,对应之前版本的LibExeObjStep
introduce Zig Object Notation and use it for the build manifest file (build.zig.zon)
使用 zon 格式替代之前的 ini,格式如下:
1 2 3 4 5 6 7 8 9 10
.{ .name = "awesome-cli", .version = "0.1.0", .dependencies = .{ .simargs = .{ .url = "https://github.com/jiacai2050/simargs/archive/0a1a2afd072cc915009a063075743192fc6b1fd5.tar.gz", .hash = "1220a6554eccb2e9a9d7d63047e062314851ffd11315b9e6d1b5e06a9dde3275f150", }, }, }
一些使用了包管理的实际项目:
也欢迎大家给自己熟悉的 C/C++ 项目提 PR 让其支持 zig build,让构建不再那么痛苦。
观点/教程
- How a Zig IDE Could Work
- Zig tips: v0.11 std.build API / package manager changes | Hexops' devlog
- pcre2 support zig build
- Multi-Object For Loops + Struct-Of-Arrays
Zig's Curious Multi-Sequence For Loops,Lobster 评论 上面这两篇的文章都是演示了最新的 for 语法,开始支持了 range:
1 2 3
for (0..4) |n| { std.debug.print("{} ", .{n}); }
同时也支持了一次性迭代多个数组的功能:
1 2 3 4 5 6
var elems = [_][]const u8 { "water", "earth", "fire", "wind" }; var nats = [_][]const u8 { "tribes", "kingdom", "nation", "nomads" }; for (elems, nats) |e, n| { std.debug.print("{s} {s}\n", .{e, n}); }
- Zig Bits 0x1: Returning slices from functions 这篇文章演示了从一个函数内返回局部变量的问题与解法
- Smoking Hot Binary Search In Zig