为什么java_executable_exec_path给我一个遗留的"外部"runfiles路径

Tra*_*own 5 java scala bazel

假设我有一个WORKSPACE像这样的最小Scala 文件:

workspace(name = "scala_example")

git_repository(
    name = "io_bazel_rules_scala",
    commit = "e9e65ada59823c263352d10c30411f4739d5df25",
    remote = "https://github.com/bazelbuild/rules_scala",
)

load("@io_bazel_rules_scala//scala:scala.bzl", "scala_repositories")
scala_repositories()

load("@io_bazel_rules_scala//scala:toolchains.bzl", "scala_register_toolchains")
scala_register_toolchains()
Run Code Online (Sandbox Code Playgroud)

然后是BUILD:

load("@io_bazel_rules_scala//scala:scala.bzl", "scala_binary")

scala_binary(
    name = "example-bin",
    srcs = glob(["*.scala"]),
    main_class = "Example",
)
Run Code Online (Sandbox Code Playgroud)

并且Example.scala:

object Example { def main(args: Array[String]): Unit = println("running") }
Run Code Online (Sandbox Code Playgroud)

我可以跑bazel run example-bin,一切正常.我的问题是这个最近的rules_scala PR改变了Java二进制路径设置为使用以下方式的方式:

ctx.attr._java_runtime[java_common.JavaRuntimeInfo].java_executable_exec_path
Run Code Online (Sandbox Code Playgroud)

......而不是之前的ctx.executable._java.short_path.

在此更改之后,Java二进制路径包含路径中的external目录,这似乎是遗留事物(?).这意味着在此更改后,如果我运行以下内容:

bazel run --nolegacy_external_runfiles example-bin
Run Code Online (Sandbox Code Playgroud)

它不再有效:

INFO: Running command line: bazel-bin/example-bin
.../.cache/bazel/_bazel_travis/03e97e9dbbfe483081a6eca2764532e8/execroot/scala_example/bazel-out/k8-fastbuild/bin/example-bin.runfiles/scala_example/example-bin_wrapper.sh: line 4: .../.cache/bazel/_bazel_travis/03e97e9dbbfe483081a6eca2764532e8/execroot/scala_example/bazel-out/k8-fastbuild/bin/example-bin.runfiles/scala_example/external/local_jdk/bin/java: No such file or directory
ERROR: Non-zero return code '127' from command: Process exited with status 127
Run Code Online (Sandbox Code Playgroud)

它还打破了我期望非external路径的一些脚本.

为什么java_executable_exec_path要给我这external条路?是否有一些选择我可以让bazel说服它不要这样做?

小智 1

抱歉回复缓慢——看来这是因为 Scala 规则错误地使用了java_executable_exec_path,而他们应该使用java_executable_runfiles_path

我发送了一个拉取请求来修复它,然后我意识到你已经在https://github.com/bazelbuild/rules_scala/commit/4235ef58782ce2ec82981ea70b808397b64fe7df中做了

由于后者现在可以在 HEAD 上与 Bazel 一起使用,所以我至少会删除丑陋的部分。