我正在将项目从cmake迁移到bazel。我有一个文件夹包含一些python代码和一些genrules
。
我有一个测试脚本递归地运行此文件夹中的所有python测试。
所以基本上我需要在此文件夹下的所有py文件作为测试脚本的data
。但鉴于我需要运行一些genrule,有一些BUILD文件,因此glob(["**/*.py"])
无法通过。
例如,我们有一个文件夹python
包含以下文件。
python/BUILD
python/test_a.py
python/folder_a/BUILD
这个有genoule。
python/folder_a/folder_b/BUILD
这个也有genrule。
python/folder_a/folder_b/folder_c/test_b.py
我想在python/
下运行测试脚本,它将以递归方式运行所有test_*.py
。现在我们想把它作为sh_test
包裹在bazel中。因此,我们需要在test_*.py
字段中指定所有data
。但是没有简单的方法可以做到这一点,因为glob()
无法通过python/folder_a/BUILD
和python/folder_a/folder_b/BUILD
。
如果我可以在源代码树中运行此脚本,那将非常方便。但似乎bazel没有提供这个。在local = 1
中添加sh_test
只会使runfiles树可写。
我知道使用bazel进行测试不是一个好方法,但有时同时迁移所有内容的工作量太大。
答案 0 :(得分:0)
我想不出一个简单的方法来获取一个BUILD文件中的所有目标名称,但是你可以运行一个Bazel查询来获取目标名称,然后你就可以了收集filegroup
目标,以便在sh_test.data
属性中引用。
bazel query 'filter(".*:test_.*\.py", kind("source file", //python/...:*) + kind("generated file", //python/...:*))'
打破这个局面:
kind("source file", //python/...:*)
查询所有来源文件
递归地在//python
包中的目标。这收集了
正常的源文件。
kind("generated file", //python/...:*)
查询所有生成的
递归地//python
包中的文件目标。这收集
genrule'd文件。
filter(".*:test_.*\.py", ...)
过滤包含的结果
仅限//any/package:test_name.py
例如,运行
bazel query 'filter(".*:test_.*\.py", kind("source file", //src/...:* + //tools/...:*) + kind("generated file", //src/...:* + //tools/...:*))'
Bazel自己的源树上的找到一个目标://src/test/py/bazel:test_base.py