我试图用巴泽尔的协议缓冲规则编译(生成)Python语言绑定和任何依赖。 我的项目的布局很简单,用一个单一的目录中, proto
,包含.proto
文件和BUILD
文件。
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散列已经为可读性省略。 该http_archive工作空间规则用于自protobuf的GitHub库包含巴泽勒WORKSPACE
和BUILD
文件。
该new_http_archive必须用于六个库,因为它不是一个巴泽尔工作区。 另外值得一提的是巴泽尔传递依赖必须在我提供WORKSPACE
文件(从巴泽尔文档):
巴泽尔只读取工作区中的文件中列出的依赖关系。 如果你的项目(A)依赖于另一个项目(B),这在其工作区文件列出在第三个项目(C)的依赖,你就必须两个B和C添加到您的项目的工作区文件。
six.BUILD
直接从回购取出并保存在本地:
- https://github.com/google/protobuf/blob/master/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
目标是明确和公开:
- https://github.com/google/protobuf/blob/77f64bb7779ec2195f9bc4dc82497d12c18fc6b7/BUILD#L756