如何将config_setting()加载到我的.bzl文件中?

时间:2018-10-21 11:02:50

标签: bazel

我的动机:我们的代码库分散在至少20个git仓库中。我想用一个构建系统将所有内容合并到一个git repo中。当前,我们使用SBT,但我们认为构建时间会太长,因此我正在研究使用Bazel的可能性。

我们大多数代码库使用Scala 2.12,一些代码库使用Scala 2.11,其余代码都需要在Scala 2.11和Scala 2.12之下构建。

我正在尝试使用bazelbuild/rules_scala

在我的scala_repositories中对WORKSPACE的以下调用中,我可以使用Scala 2.12进行构建:

scala_repositories(("2.12.6", {
    "scala_compiler": "3023b07cc02f2b0217b2c04f8e636b396130b3a8544a8dfad498a19c3e57a863",
    "scala_library": "f81d7144f0ce1b8123335b72ba39003c4be2870767aca15dd0888ba3dab65e98",
    "scala_reflect": "ffa70d522fc9f9deec14358aa674e6dd75c9dfa39d4668ef15bb52f002ce99fa"
}))

如果我有以下电话,则可以使用Scala 2.11进行构建:

scala_repositories(("2.11.12", {
    "scala_compiler": "3e892546b72ab547cb77de4d840bcfd05c853e73390fed7370a8f19acb0735a0",
    "scala_library": "0b3d6fd42958ee98715ba2ec5fe221f4ca1e694d7c981b0ae0cd68e97baf6dce",
    "scala_reflect": "6ba385b450a6311a15c918cf8688b9af9327c6104f0ecbd35933cfcd3095fe04"
}))

但是,无法在程序包级别的BUILD文件中指定要使用哪个版本的Scala。我必须在我的WORKSPACE中全局指定它。

要解决此问题,我的计划是设置configurable attributes,因此我可以指定--define scala=2.11用Scala 2.11构建,并指定--define scala=2.12用Scala 2.12构建。

首先,我尝试将此代码放入我的WORKSPACE

config_setting(
    name = "scala-2.11",
    define_values = {
        "scala": "2.11"
    }
)

config_setting(
    name = "scala-2.12",
    define_values = {
        "scala": "2.12"
    }
)

scala_repositories(
    select(
        {
            "scala-2.11": "2.11.12",
            "scala-2.12": "2.12.6"
        }
    ),
    select(
        {
            "scala-2.11": {
                "scala_compiler": "3e892546b72ab547cb77de4d840bcfd05c853e73390fed7370a8f19acb0735a0",
                "scala_library": "0b3d6fd42958ee98715ba2ec5fe221f4ca1e694d7c981b0ae0cd68e97baf6dce",
                "scala_reflect": "6ba385b450a6311a15c918cf8688b9af9327c6104f0ecbd35933cfcd3095fe04",
            },
            "scala-2.12": {
                "scala_compiler": "3023b07cc02f2b0217b2c04f8e636b396130b3a8544a8dfad498a19c3e57a863",
                "scala_library": "f81d7144f0ce1b8123335b72ba39003c4be2870767aca15dd0888ba3dab65e98",
                "scala_reflect": "ffa70d522fc9f9deec14358aa674e6dd75c9dfa39d4668ef15bb52f002ce99fa"
            }
        }
    )
)

但这给了我错误config_setting cannot be in the WORKSPACE file

因此,我然后尝试将代码移入Starlark文件。

tools/build_rules/scala.bzl中:

config_setting(
    name = "scala-2.11",
    define_values = {
        "scala": "2.11"
    }
)

config_setting(
    name = "scala-2.12",
    define_values = {
        "scala": "2.12"
    }
)

def scala_version():
    return select(
        {
            "scala-2.11": "2.11.12",
            "scala-2.12": "2.12.6"
        }
    )

def scala_machinery():
    return select(
        {
        "scala-2.11": {
            "scala_compiler": "3e892546b72ab547cb77de4d840bcfd05c853e73390fed7370a8f19acb0735a0",
            "scala_library": "0b3d6fd42958ee98715ba2ec5fe221f4ca1e694d7c981b0ae0cd68e97baf6dce",
            "scala_reflect": "6ba385b450a6311a15c918cf8688b9af9327c6104f0ecbd35933cfcd3095fe04",
        },
        "scala-2.12": {
            "scala_compiler": "3023b07cc02f2b0217b2c04f8e636b396130b3a8544a8dfad498a19c3e57a863",
            "scala_library": "f81d7144f0ce1b8123335b72ba39003c4be2870767aca15dd0888ba3dab65e98",
            "scala_reflect": "ffa70d522fc9f9deec14358aa674e6dd75c9dfa39d4668ef15bb52f002ce99fa"
            }
        }
    )

然后回到我的WORKSPACE

load("//tools/build_rules:scala.bzl", "scala_version", "scala_machinery")
scala_repositories(scala_version(), scala_machinery())

但是现在我收到此错误:

tools/build_rules/scala.bzl:1:1: name 'config_setting' is not defined

这使我感到困惑,因为我以为config_setting()是内置的。找不到从哪里加载它。

所以,我的问题:

  • 如何将config_setting()加载到我的.bzl文件中?
  • 或者,是否有更好的方法可以从命令行控制将哪些参数传递给scala_repositories()
  • 或者,这不可能吗?
$ bazel version
Build label: 0.17.2-homebrew
Build target: bazel-out/darwin-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Fri Sep 28 10:42:37 2018 (1538131357)
Build timestamp: 1538131357
Build timestamp as int: 1538131357

1 个答案:

答案 0 :(得分:1)

如果从bzl文件中调用本地代码,则必须使用native.前缀,因此在这种情况下,您将调用native.config_setting

但是,这将导致相同的错误:config_setting是一个BUILD规则,而不是WORKSPACE规则。

如果您想更改用于特定目标的构建工具,则可以更改工具链,这似乎可以通过scala_toolchain

来支持。

我相信您可以使用配置选择工具链。

我不熟悉scala_repositories的工作。我希望它使用正确的版本名称定义工具链,以便您可以正确引用所需的工具链。我希望您可以在同一工作空间中两次调用它,否则我认为没有解决方案。