我有一个具有以下结构的项目:
$ tree .
src
├── decode.zig
├── main.zig
└── types.zig
types.zig
文件是新模块的一部分,我正在尝试将一些类型定义提取到其中。以前,它们在 decode.zig
范围内,即:
$ tree src
src
├── decode.zig
└── main.zig
为了创建新模块,我:
src/types.zig
文件createModule
文件中添加了对 build.zig
的调用:exe.addModule("types", b.createModule(.{ .source_file = std.build.FileSource.relative("src/types.zig") }));
src/main.zig
和 src/decode.zig
添加了适当的导入语句,以了解这些文件所依赖的相关类型。目前,
zig build
成功并且可执行文件运行良好。问题是,当我通过 zig test src/decode.zig
:运行(之前通过)测试套件时
$ zig test/decode.zig
src/decode.zig:4:20: error: root struct of file 'test_runner' has no member named 'types'
const types = cairo.types;
~~~~~^~~~~~
/home/jmcph4/Downloads/zig-linux-x86_64-0.12.0-dev.1861+412999621/lib/test_runner.zig:1:1: note: struct declared here
//! Default test runner for unit tests.
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
referenced by:
Instruction: src/decode.zig:6:21
decode: src/decode.zig:107:79
remaining reference traces hidden; use '-freference-trace' to see all reference traces
我为解决此问题而采取的步骤:
createModule
文件中添加对 unit_tests
工件的 build.zig
调用,如下所示: unit_tests.addModule("decode", b.createModule(.{ .source_file = std.build.FileSource.relative("src/decode.zig") }));
unit_tests.addModule("types", b.createModule(.{ .source_file = std.build.FileSource.relative("src/types.zig") }));
作为参考,我遇到了这些票:
如何以与
zig build
和 zig test
兼容的方式声明这些模块?
zig build
运行构建系统,该系统旨在包含所有其他 zig
命令,例如 zig build-exe
和 zig test
。如果您想使用构建系统进行正常构建,您可能也想使用构建系统进行测试。然后将使用 zig build test
运行测试。
在您提供的项目结构中,不需要模块。
main.zig
可以直接导入types.zig
,decode.zig
也可以。模块旨在让大块代码在不同的 zig 项目之间共享。
// main.zig
const types = @import("types.zig");
pub fn main(...) !void { ... }
test "..." { ... }
// decode.zig
const types = @import("types.zig");
test "..." { ... }
如果您在空文件夹中运行
zig init-exe
,则默认构建脚本包含运行测试的示例:(为了简洁起见,注释已被删除,但它们对于理解构建系统很有用)
const std = @import("std");
pub fn build(b: *std.Build) void {
const optimize = b.standardOptimizeOption(.{});
const exe = b.addExecutable(.{
.name = "tmp",
});
b.installArtifact(exe);
const run_cmd = b.addRunArtifact(exe);
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
const unit_tests = b.addTest(.{
.root_source_file = .{ .path = "src/main.zig" },
.target = target,
.optimize = optimize,
});
const run_unit_tests = b.addRunArtifact(unit_tests);
const test_step = b.step("test", "Run unit tests");
test_step.dependOn(&run_unit_tests.step);
}
不幸的是,现在似乎没有一种标准化的方法可以将模块添加到两个构建步骤中,但是可以按照您尝试的方式将模块添加到unit_tests中:
unit_tests.addModule("decode", b.createModule(.{ .source_file = std.build.FileSource.relative("src/decode.zig") }));
unit_tests.addModule("types", b.createModule(.{ .source_file = std.build.FileSource.relative("src/types.zig") }));
然后可以使用
zig build test
(不是 zig test
) 运行测试
zig test
接受命令行参数来指定模块根。这仅适用于简单的模块,来自互联网的具有复杂 build.zig 逻辑的模块将无法以这种方式使用。
语法在
zig test --help
中描述:
--mod [name]:[deps]:[src] Make a module available for dependency under the given name
deps: [dep],[dep],...
dep: [[import=]name]
--deps [dep],[dep],... Set dependency names for the root package
dep: [[import=]name]
zig test src/decode.zig --mod decode::src/decode.zig --mod types types::src/types.zig --deps decode,types