从 Maven 标准目录映射到 Bazel 以获取测试资源

Mapping from Maven standard directory to Bazel for test resources

根据 Maven Standard Directory Layout. These test files end up in the JAR and on the classpath when test classes fetch them via, e.g. Resources#asCharSource.

,我们在 src/test/resources 中有测试依赖文件

在 Bazel 中依赖于测试文件并让它们出现在类路径中的首选方式是什么?

我的 src/test/resources/BUILD 中有以下内容:

filegroup(
    name = "test-deps",
    testonly = 1,
    srcs = glob(["*.txt"]),
    visibility = ["//visibility:public"],
)

以及我的 src/main/java/com/path/to/my/test/BUILD 中的以下内容:

java_test(
    name = "MyTest",
    srcs = ["MyTest.java"],
    resources = ["//src/test/resources:test-deps"],
    test_class = "com.path.to.my.test.MyTest",
    deps = [
        "//src/main/com/path/to/my/code",
        "//:junit_junit",
    ],    
)

这可行,但我不确定这是否是 Bazel 中的最佳方式。

是的,这是推荐的方法。如 docs for resources 中所述,Bazel 理解 Maven 标准目录布局并将数据文件放在正确的类路径中:

The location of the resources inside of the jar file is determined by the project structure. Bazel first looks for Maven's standard directory layout, (a "src" directory followed by a "resources" directory grandchild).

如果您想单独捆绑资源,您可以创建一个仅包含资源的 jar,然后使用 resource_jars 属性依赖它。

编辑:正如 Ittai 在下面指出的那样,Bazel 不会内省资源,因此您必须小心不要以任何冲突结束(例如,pkg1/src/main/resources/foo 和 pkg2/src/main/resources/foo)。 resourcesresource_jars 都不会为您检查这个,所以如果这是一个问题,您可能希望将您需要的任何资源放在一个文件组中,并有一个 genrule 目标或测试来检查冲突。