2017-09-10 46 views
0

我幾乎失去了努力創建一個自定義庫中的規則......如何設置基本的repository_rule?

pypi.bzl

def _impl(repository_ctx):                   
    repository_ctx.execute(['echo', '"testing testing 123"'])                      
    repository_ctx.execute(['pip', 'download', repository_ctx.attr.package])       
    repository_ctx.file("BUILD",                             
     """                        
    py_library(                      
    name = "lib",                      
    srcs = glob(["*.py"]),                   
)                         
     """)                       

pypi_package = repository_rule(                  
    implementation=_impl,                    
    attrs={"package": attr.string(mandatory=True)},              
) 

WORKSPACE

load("//:pypi.bzl", "pypi_package")                 

pypi_package(                      
    name = "dateutil",                                
    package = "python-dateutil",                  
) 

BUILD

py_binary(                       
    name = "app",                                 
    srcs = ["app.py"],                     
    deps = ["@dateutil//lib"],                              
) 

$ bazel build app 
ERROR: /Users/alec/code/bazel-pypi/BUILD:1:1: no such package '@dateutil//lib': BUILD file not found on package path and referenced by '//:app'. 
ERROR: Analysis of target '//:app' failed; build aborted. 

我我不知道如何開始調試問題是因爲它似乎不像我的存儲庫規則的實現中的命令甚至可以運行。 (例如,從echo沒有輸出)。顯然不會有一個library目標如果repository_ctx.file呼叫沒有發生......

回答

4

錯誤說no such package '@dateutil//lib',所以很自然的事是使用巴澤勒查詢來確定確實存在哪些軟件包:

$ bazel query @dateutil//... 
ERROR: /usr/local/google/home/ajmichael/.cache/bazel/_bazel_ajmichael/473b6943104a48bd7642dd8ab62af629/external/dateutil/BUILD:2:2: indentation error. 
ERROR: /usr/local/google/home/ajmichael/.cache/bazel/_bazel_ajmichael/473b6943104a48bd7642dd8ab62af629/external/dateutil/BUILD:5:3: Trailing comma is allowed only in parenthesized tuples. 
ERROR: /usr/local/google/home/ajmichael/.cache/bazel/_bazel_ajmichael/473b6943104a48bd7642dd8ab62af629/external/dateutil/BUILD:6:6: syntax error at 'outdent': expected expression. 
ERROR: /usr/local/google/home/ajmichael/.cache/bazel/_bazel_ajmichael/473b6943104a48bd7642dd8ab62af629/external/dateutil/BUILD:2:2: assignment length mismatch: left-hand side has length 2, but right-hand side evaluates to value of length 1. 
ERROR: /usr/local/google/home/ajmichael/.cache/bazel/_bazel_ajmichael/473b6943104a48bd7642dd8ab62af629/external/dateutil/BUILD:6:6: contains syntax error(s). 
ERROR: package contains errors: . 
ERROR: error loading package '@dateutil//': Package '' contains errors. 

所以它看起來像BUILD文件格式不正確。特別是,你需要在「py_library」之前去掉縮進。修復是又一次嘗試,我們得到

$ bazel query @dateutil//... 
@dateutil//:lib 

所以,錯誤的是,你的BUILD文件包含 「@ dateutil // LIB」,而不是 「@dateutil //:LIB」。

所以現在的問題是,爲什麼「@dateutil //:lib」是正確的?要理解這一點,您需要了解Bazel的標籤語法。 「@ dateutil // lib」是「@ dateutil // lib:lib」的縮寫,意思是「dateutil庫中lib庫中的lib目標」。 「dateutil庫中的lib包」對應於「lib/BUILD」。但是您的存儲庫規則寫入「BUILD」,而不是「lib/BUILD」。所以你的目標是在「」包中創建的。所以你創建的py_library的語法是「@dateutil //:lib」。