2017-10-07 4 views
1

Bazel's Protocol Buffer Rules을 사용하여 Python 언어 바인딩 및 모든 종속성을 컴파일 (생성)하려고합니다. 내 프로젝트의 레이아웃은 proto이라는 단일 디렉토리로 .proto 파일과 BUILD 파일을 포함하는 단순합니다.공개적으로 표시되는 Bazel ProtoBuf 대상이 '선언되지 않음'

WORKSPACE 
BUILD.six 
|-- proto 
| |-- example.proto 
| |-- BUILD 

WORKSPACE 파일 : 내 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", 
) 

, 다운로드 한 파일의 예상 SHA-256 해시 가독성을 위해 생략되었습니다. http_archive WORKSPACE 규칙은 ProtoBuf GitHub repo에 Bazel WORKSPACEBUILD 파일이 포함되어 있기 때문에 사용됩니다.

Bazel 작업 공간이 아니기 때문에 여섯 개의 라이브러리에 new_http_archive을 사용해야합니다. 또한 가치 Bazel transitive dependencies이 (Bazel 문서에서) 내 WORKSPACE 파일에 제공해야한다는 지적 :

Bazel은 작업 공간 파일에 나열된 종속성을 읽습니다. 프로젝트 (A)가 작업 공간 파일에 세 번째 프로젝트 (C)에 대한 종속성을 나열하는 다른 프로젝트 (B)에 의존하는 경우 B 과 C를 프로젝트의 WORKSPACE 파일에 모두 추가해야합니다.

six.BUILD는 REPO에서 직접 촬영 및 로컬로 저장됩니다

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"], 
) 

문제의 arrises 때 건물 :

,536,913 (읽기 쉽도록 포맷) 63,210
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 대상이 분명히 드입니다. 벌금과 공공 : (: 평 // 프로토) //에 따라 달라집니다

답변

2

문제는 대상이 있다는 것입니다 protobuf_python을, // @com_gooogle_protobuf하지 : protobuf_python합니다. bazel 쿼리를 통해이를 확인할 수 있습니다.

$ bazel query --output build //proto:py 
# proto/BUILD:3:1 
py_library(
    name = "py", 
    visibility = ["//visibility:public"], 
    generator_name = "py", 
    generator_function = "py_proto_library", 
    generator_location = "proto/BUILD:3", 
    deps = ["//:protobuf_python", "@com_google_protobuf//:protobuf_python", "//proto:example_proto"], 
    imports = [], 
    srcs = [], 
) 

deps 목록에서 확인할 수 있습니다. 이제 문제는 그것이 왜 그것에 달려 있다는 것입니까?당신은 확실히 그것을 어디에도 두지 않았습니다. 대답은 py_proto_library가 매크로이기 때문에 원하는대로 할 수 있다는 것입니다.

https://github.com/google/protobuf/blob/6032746882ea48ff6d983df8cb77e2ebf399bf0c/protobuf.bzl#L320 https://github.com/google/protobuf/blob/6032746882ea48ff6d983df8cb77e2ebf399bf0c/protobuf.bzl#L373-L374

py_proto_library이는 deps 목록에 추가하는 것이 default_runtime라는 속성이 있습니다 특히

, 매크로이 줄 당신에게 문제를 일으키는 있습니다. 기본값은 ": protobuf_python"입니다. 그러나 이것은 protobuf_python을 선언하는 동일한 저장소에서 매크로를 사용하는 경우에만 작동합니다.

따라서 py_proto_librarys 속성에 default_runtime = "@com_google_protobuf//:protobuf_python"을 설정하여이 문제를 해결할 수 있습니다.

관련 문제