Я что-то упустил?
Основная проблема, как вы уже поняли, состоит в том, что у вас есть два "пространства имен" пути: одно, которое видит протокол (т.е. пути импорта), и то, которое видит Базель (то есть путь, который вы передаете declare_file()
.
2 вещи на заметку:
1) Все пути, объявленные с declare_file()
, получают путь <bin dir>/<package path incl. workspace>/<path you passed to declare_file()>
2) Все действия выполняются с <bin dir>
(если только output_to_genfils=True
, в этом случае это переключается на <gen dir>
, как в вашем примере.
Пытаясь решить ту же самую проблему, с которой вы столкнулись, я прибег к удалению известного пути из пути выходного файла, чтобы определить, какой каталог передать как p:
# This code is run from the context of the external protobuf dependency
proto_path = "google/a/b.proto"
output_file = ctx.actions.declare_file(proto_path)
# output_file.path would be `<gen_dir>/external/protobuf/google/a/b.proto`
# Strip the known proto_path from output_file.path
protoc_prefix = output_file.path[:-len(proto_path)]
print(protoc_prefix) # Prints: <gen_dir>/external/protobuf
command = "{protoc} {proto_paths} {cpp_out} {plugin} {plugin_options} {proto_file}".format(
...
cpp_out = "--cpp_out=" + protoc_prefix,
...
)
Альтернативы
Вы также можете создать тот же путь с ctx.bin_dir
, ctx.label.workspace_name
, ctx.label.package
и ctx.label.name
.
Разное.
proto_library
недавно получил атрибут strip_import_prefix
. При использовании вышеприведенное неверно, так как все зависимые файлы являются символическими ссылками в новый каталог, из которого они имеют относительные пути, объявленные с strip_import_prefix
.
Формат пути:
<bin dir>/<repo>/<package>/_virtual_base/<label name>/<path `import`ed in .proto files>
i.e.
<bin dir>/external/protobuf/_virtual_base/b_proto/google/a/b.proto
Предполагается, что вы создаете внешний репозиторий с именем protobuf
, который содержит в своем корне файл BUILD
с целью с именем b_proto
, которая, в свою очередь, опирается на proto_library
оболочку google/a/b.proto
И использует strip_import_prefix
атрибут.