添加模块与默认的 `test_runner` 不兼容

问题描述 投票:0回答:1

我有一个具有以下结构的项目:

$ tree .
src
├── decode.zig
├── main.zig
└── types.zig

types.zig
文件是新模块的一部分,我正在尝试将一些类型定义提取到其中。以前,它们在
decode.zig
范围内,即:

$ tree src
src
├── decode.zig
└── main.zig

为了创建新模块,我:

  1. 创建了
    src/types.zig
    文件
  2. 在我的
    createModule
    文件中添加了对
    build.zig
    的调用:
exe.addModule("types", b.createModule(.{ .source_file = std.build.FileSource.relative("src/types.zig") }));
  1. 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
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.