如何在zig构建系统中导入子依赖项?

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

如何在已经是导入模块的依赖项的模块上正确添加导入,我这样做:

    const tkm = b.dependency("tokamak", .{
        .target = target,
        .optimize = optimize,
    });
    exe.root_module.addImport("tokamak", tkm.module("tokamak"));

    var it = tkm.module("tokamak").iterateDependencies(null, false);

    while (it.next())|dep| {
        if(std.mem.eql(u8, dep.name, "httpz")) {
            exe.root_module.addImport("httpz", dep.module);
        }
    }

也许有更优雅的方式?

Просто хочу знать можно ли сделать это лучше

zig
1个回答
0
投票

计划为项目提供 ID 和版本,以便将来更好地处理这个问题:https://github.com/ziglang/zig/issues/14288

现在,您可以使用完全相同的 url 和哈希将依赖项添加到 build.zig.zon 中,并使用完全相同的参数调用

b.dependency()
,它将解析为相同的依赖项:

在您的 build.zig.zon 中:

    .dependencies = .{
        .tokamak = .{ ... },
        .httpz = .{
            // make sure this url and hash are the same as the one in tokmak's build.zig.zon, and update this when you update tokmak
            .url = "git+https://github.com/karlseguin/http.zig?ref=master#6e45041ef1e0ed8d3e36e15ccb459a3392571f7f",
            .hash = "1220c47311099ba5705d906d11927bc222e9562830bcc32b6d638e10124371f4eeb6",
        },
    },

在您的 build.zig 中:

    const tkm = b.dependency("tokamak", .{ .target = target, .optimize = optimize });

    // make sure the arguments passed in ".{ }" are the same that tokamak passes to httpz in its build.zig
    const httpz = b.dependency("httpz", .{ .target = target, .optimize = optimize });

只要哈希值相同并且传递给

b.dependency()
的参数相同,
b.dependency()
将在您的项目中返回与 httpz 中相同的指针。

或者,您可以从托卡马克的构建器中提取 httpz 依赖项,而不是将其复制到您自己的 build.zig.zon 中:

    const tkm = b.dependency("tokamak", .{ .target = target, .optimize = optimize });

    // make sure the arguments passed in ".{ }" are the same that tokamak passes to httpz in its build.zig
    const httpz = tkm.builder.dependency("httpz", .{ .target = target, .optimize = optimize });
© www.soinside.com 2019 - 2024. All rights reserved.