Раньше я разбивал свои большие проекты на c/c++ с помощью CMake, а затем добавлял каждую часть в основной проект с помощью команды add_submodule
(меньшие части представляли собой статические или динамические библиотеки). Также я использовал то же решение для использования сторонних библиотек в своем проекте.
Но у меня возникают проблемы с тем, чтобы сделать то же самое в моих зигзагообразных проектах. Мне было трудно искать и пытаться найти надежную и многоразовую структуру проекта, такую же, как проекты CMake.
Есть ли какое-либо решение, которое позволит мне создавать библиотеки меньшего размера (с build.zig внутри каждой) и использовать эти части в своих проектах? например что-то вроде этой структуры:
|-- projectA
|-----| src
|-----|----| main.zig
|-----| libs
|-----|----| projectB
|-----|----------| src
|-----|---------------| hello.zig
|-----|----------| build.zig
|-----|----| projectC
|-----|----------| src
|-----|---------------| bye.zig
|-----|----------| build.zig
|-----| build.zig
Я пытался использовать файл build.zig
для построения каждой зависимости, но безуспешно, к тому же это непростое решение, я искал решение, но ничего не нашел.
Я нашел что-то вроде exe.addModule
, но в добавленной исполняемой структуре нет такой функции под названием addModule()
.
Хорошо представьте, что projectB и projectS — это независимые репозитории git и подмодули в более крупном проекте. @Кубик
если проекты B и C действительно независимы от A, то почему они должны быть вложены в A?
Это больше похоже на личное предпочтение некоторых разработчиков — сохранять зависимости внутри проекта (через подмодули). Согласованность и контроль, модульность и возможность повторного использования, упрощенное управление зависимостями. Однако я не очень знаком со структурами проектов Zig, поэтому этот подход может не подойти для этого языка. @FObersteiner
этот комментарий, возможно, был немного педантичным ;-) Я думаю, что то, что вы предлагаете, на самом деле очень полезно, если вам нужно продать приложение.
Вы можете добавить зависимость как локальный пакет.
Допустим, у вас есть такая структура папок:
|-- foo
|-----| src
|-----|----| root.zig
|-----| build.zig
|-- project
|-----| src
|-----|----| main.zig
|-----| build.zig
|-----| build.zig.zon
В foo
, в build.zig
:
_ = b.addModule("foo", .{
.root_source_file = b.path("src/root.zig"),
.target = target,
.optimize = optimize,
});
В проекте в build.zig.zon
:
.dependencies = .{
.foo = .{
.path = "../foo/",
},
},
И в build.zig
:
const foo = b.dependency("foo", .{
.target = target,
.optimize = optimize,
});
exe.root_module.addImport("foo", foo.module("foo"));
Итак, в main.zig
вы можете просто сделать:
const foo = @import("foo");
Я считаю, что этот код работает в версиях 0.12 и 0.13.
Есть ли причина, по которой вам нужно несколько файлов
build.zig
вместо того, чтобы просто объединять их все в один большийbuild.zig
?