在 Bazel 中设置 Robolectric
Setting up Robolectric in Bazel
我在为 Bazel 构建系统设置 Robolectric 时遇到了一些问题,主要是因为它需要的依赖项数量。
似乎没有一个包含 Robolectric 及其所有依赖项的 JAR。因此,我都试过了:
使用自定义 BUILD 文件在我的 WORKSPACE 文件中创建一个 new_git_repository
规则,该文件编译来自 Robolectric repo 的 Java 源代码。
Downloading all JARs for Robolectric’s dependencies,然后将它们捆绑在我的测试规则可以依赖的 java_import
中。
在第一种情况下,我 运行 遇到了尝试从提供的 Groovy 类 生成 Java 代码的问题,并且仍然必须手动包含其他几个依赖项。在第二种情况下,我遇到了 Robolectric 的 MavenDependencyResolver
在 运行 时无法找到某些依赖项的问题,这导致不得不手动包含缺少的依赖项 JAR文件。
无论如何,让 Bazel 编译和 运行 Robolectric 测试似乎有点麻烦。在 Bazel 构建系统中使用 Robolectric 有更好的方法吗?
对此进行了另一次尝试,我下载 Robolectric 依赖项的所有 JAR 的方法对我有用。我最初缺少的部分是让 Robolectric 知道它应该在本地而不是通过 Maven 查找其依赖项的 jvm 标志。我按照 blog post zlalanne 建议的步骤下载所有 JAR,将它们移动到我的项目可以访问的目录中,然后为这些创建构建目标:
java_import(
name = "robolectric",
jars = glob([
"*.jar",
]),
visibility = [
"//visibility:public",
],
)
然后我创建了一个新规则,它将为标准 java_test 规则提供正确的 Robolectric 依赖项和 jvm 标志:
def android_robolectric_test(name, deps=[], srcs=[], test_class="", visibility=None):
androidPlatform = [Label('@androidsdk//:platforms/android-25/android.jar')]
robolectricDeps = androidPlatform + [Label(“//path/to/robolectric:robolectric")]
native.java_test(
name=name,
srcs=srcs,
deps=robolectricDeps + deps,
test_class=test_class,
jvm_flags=[
"-Drobolectric.offline=true",
"-Drobolectric.dependency.dir=‘path/to/robolectric/’”,
],
visibility=visibility,
)
现在可用 android_local_test
rule。
我在为 Bazel 构建系统设置 Robolectric 时遇到了一些问题,主要是因为它需要的依赖项数量。
似乎没有一个包含 Robolectric 及其所有依赖项的 JAR。因此,我都试过了:
使用自定义 BUILD 文件在我的 WORKSPACE 文件中创建一个
new_git_repository
规则,该文件编译来自 Robolectric repo 的 Java 源代码。Downloading all JARs for Robolectric’s dependencies,然后将它们捆绑在我的测试规则可以依赖的
java_import
中。
在第一种情况下,我 运行 遇到了尝试从提供的 Groovy 类 生成 Java 代码的问题,并且仍然必须手动包含其他几个依赖项。在第二种情况下,我遇到了 Robolectric 的 MavenDependencyResolver
在 运行 时无法找到某些依赖项的问题,这导致不得不手动包含缺少的依赖项 JAR文件。
无论如何,让 Bazel 编译和 运行 Robolectric 测试似乎有点麻烦。在 Bazel 构建系统中使用 Robolectric 有更好的方法吗?
对此进行了另一次尝试,我下载 Robolectric 依赖项的所有 JAR 的方法对我有用。我最初缺少的部分是让 Robolectric 知道它应该在本地而不是通过 Maven 查找其依赖项的 jvm 标志。我按照 blog post zlalanne 建议的步骤下载所有 JAR,将它们移动到我的项目可以访问的目录中,然后为这些创建构建目标:
java_import(
name = "robolectric",
jars = glob([
"*.jar",
]),
visibility = [
"//visibility:public",
],
)
然后我创建了一个新规则,它将为标准 java_test 规则提供正确的 Robolectric 依赖项和 jvm 标志:
def android_robolectric_test(name, deps=[], srcs=[], test_class="", visibility=None):
androidPlatform = [Label('@androidsdk//:platforms/android-25/android.jar')]
robolectricDeps = androidPlatform + [Label(“//path/to/robolectric:robolectric")]
native.java_test(
name=name,
srcs=srcs,
deps=robolectricDeps + deps,
test_class=test_class,
jvm_flags=[
"-Drobolectric.offline=true",
"-Drobolectric.dependency.dir=‘path/to/robolectric/’”,
],
visibility=visibility,
)
现在可用 android_local_test
rule。