如何设置基本的repository_rule?

Ale*_*lec 1 bazel

我很迷失尝试创建自定义存储库规则的方法...

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)},                                                    
)  
Run Code Online (Sandbox Code Playgroud)

WORKSPACE

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

pypi_package(                                                                                        
  name = "dateutil",                                                                                                                            
  package = "python-dateutil",                                                                       
) 
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

我不确定如何开始调试该问题,因为我的存储库规则实现中的命令似乎根本没有运行。(例如,没有输出echo)。显然,library如果repository_ctx.file通话没有发生,就不会有目标...

Ada*_*dam 5

该错误说no such package '@dateutil//lib',所以很自然的事情是使用bazel查询来确定存在哪些软件包:

$ 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.
Run Code Online (Sandbox Code Playgroud)

因此,看起来BUILD文件格式错误。特别是,您需要消除“ py_library”之前的缩进。解决这个问题并再试一次,我们得到

$ bazel query @dateutil//...
@dateutil//:lib
Run Code Online (Sandbox Code Playgroud)

因此错误是您的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”。