本次,我想要使用 zeit 库来获取系统本地时间。为此,需要先学习一下怎么在 Zig 中添加一个库。
Zig 官方内置 zig fetch 用于包获取与依赖管理,核心作用是下载第三方包、计算完整性哈希、并自动维护项目的 build.zig.zon 依赖清单。
添加依赖
下面我们就使用 zig fetch 命令来添加 zeit 依赖:
bash
zig fetch --save git+https://github.com/rockorager/zeit
执行命令后,在 build.zig.zon 文件的 dependencies 中就会新增一条记录:
zon
.dependencies = .{
.zeit = .{
.url = "git+https://github.com/rockorager/zeit#2a79678e05e4e82cd4efd4fd6b754dcf029c3a64",
.hash = "zeit-0.6.0-5I6bk7q6AgBdMJxze3D4l9ylQhkviQ_BX9FigDt13MFn",
},
},
光是如此,我们还是不能使用 zeit 库,还需要同步修改 build.zig 文件,重新定义我们的构建流程,将 zeit 依赖加入我们的构建环节:
zig
const dep_zeit = b.dependency("zeit", .{
.target = target,
.optimize = optimize,
});
exe.root_module.addImport("zeit", dep_zeit.module("zeit"));
配置完成后,项目就可以正常使用 zeit 库了。
获取本地时间
zig
const std = @import("std");
const zeit = @import("zeit");
pub fn main(init: std.process.Init) !void {
const local = try zeit.local(init.gpa, init.io, .{});
defer local.deinit();
const now = try zeit.instant(init.io, .{});
const now_local = now.in(&local);
var buf: [4096]u8 = undefined;
var writer = std.Io.Writer.fixed(&buf);
try now_local.time().strftime(&writer, "%Y-%m-%d %H:%M:%S");
try print(init.io, "{s}\n", .{writer.buffered()});
}
fn print(io: std.Io, comptime fmt: []const u8, args: anytype) !void {
var buf: [4096]u8 = undefined;
var out = std.Io.File.stdout().writerStreaming(io, &buf);
try out.interface.print(fmt, args);
try out.interface.flush();
}
构建并运行:
bash
zig build run
在终端可以成功看到当前时间。
体验与感想
体验下来,我认为 Zig 的包管理与构建流程简洁易懂、极易上手。
最令人舒适的一点是,Zig 的构建脚本本身就是 Zig 代码,无需额外学习全新语法或领域专用配置语言。开发者不需要适配陌生的 DSL,只用熟悉一门语言,就能完成编码、构建与工程配置。
一切逻辑可见、可控,给人一种完全掌控项目的通透感。