我试图使用Bazel's Protocol Buffer Rules来编译(生成)Python语言绑定和任何依赖项。我的项目布局很简单,只有一个目录proto
,其中包含.proto
文件和BUILD
文件。为什么公开可见的Bazel ProtoBuf目标'未声明'
WORKSPACE
BUILD.six
|-- proto
| |-- example.proto
| |-- BUILD
我WORKSPACE
文件:
workspace(name = "com_example")
http_archive(
name = "com_google_protobuf",
strip_prefix = "protobuf-3.4.1",
urls = ["https://github.com/google/protobuf/archive/v3.4.1.zip"],
)
new_http_archive(
name = "six_archive",
build_file = "six.BUILD",
url = "https://pypi.python.org/packages/source/s/six/six-1.10.0.tar.gz",
)
bind(
name = "six",
actual = "@six_archive//:six",
)
在我WORKSPACE
文件,下载的文件的预期SHA-256散列已经为可读性省略。由于ProtoBuf GitHub repo包含Bazel WORKSPACE
和BUILD
文件,因此使用http_archive WORKSPACE规则。
new_http_archive必须用于六个库,因为它不是Bazel工作区。另外值得一提的是,Bazel transitive dependencies必须在我WORKSPACE
文件中提供的(从巴泽尔文档):
巴泽勒只读取工作区中的文件中列出的依赖关系。如果您的 项目(A)依赖于另一个项目(B),该项目(B)在其WORKSPACE文件中列出了依赖于 的第三个项目(C),则必须将B 和C都添加到项目的WORKSPACE文件中。
six.BUILD
直接从回购取出并保存在本地:
我BUILD
文件
load("@com_google_protobuf//:protobuf.bzl", "py_proto_library")
py_proto_library(
name = "py",
use_grpc_plugin = True,
deps = [
"@com_google_protobuf//:protobuf_python",
":example_proto",
],
visibility = ["//visibility:public"],
# protoc = "@com_google_protobuf//:protoc",
)
proto_library(
name = "example_proto",
srcs = ["example.proto"],
)
问题棱当建筑:
bazel build //proto:py
输出(格式化的可读性):
proto/BUILD:3:1:
no such target '//:protobuf_python':
target 'protobuf_python' not declared in package '' defined by BUILD and referenced by '//proto:py'.
ERROR: Analysis of target '//proto:py' failed; build aborted.
但是,从我的命令行建立外部依赖的工作:
bazel build @com_google_protobuf//:protobuf_python
输出(截断可读性):
INFO: Found 1 target...
...
INFO: Elapsed time: 51.577s, Critical Path: 8.63s
protobuf_python
目标显然是de罚款和公众: