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

Bazel 如何将`config_setting()`加载到我的`bzl`文件中?,bazel,Bazel,我的动机是:我们的代码库分散在至少20 git回购协议中。我想用一个构建系统将所有内容整合到一个git回购中。目前我们使用SBT,但我们认为构建过程会花费太长时间,因此我正在研究使用Bazel替代的可能性 我们的大多数代码库使用Scala2.12,一些代码库使用Scala2.11,其余的代码库需要在Scala2.11和Scala2.12下构建 我正试着用它 通过在我的工作区中调用scala\u存储库,我可以使用scala 2.12进行构建: scala_repositories(("2.12.6

我的动机是:我们的代码库分散在至少20 git回购协议中。我想用一个构建系统将所有内容整合到一个git回购中。目前我们使用SBT,但我们认为构建过程会花费太长时间,因此我正在研究使用Bazel替代的可能性

我们的大多数代码库使用Scala2.12,一些代码库使用Scala2.11,其余的代码库需要在Scala2.11和Scala2.12下构建

我正试着用它

通过在我的
工作区中调用
scala\u存储库
,我可以使用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"
}))
但是,无法在包级别的my
BUILD
文件中指定要使用哪个版本的Scala进行构建。我必须在我的
工作区中全局指定此项

为了解决这个问题,我的计划是设置,因此我可以指定
--define scala=2.11
使用scala 2.11构建,并指定
--define scala=2.12
使用scala 2.12构建

首先,我尝试将此代码放入我的
工作区

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"
            }
        }
    )
)
load("//tools/build_rules:scala.bzl", "scala_version", "scala_machinery")
scala_repositories(scala_version(), scala_machinery())
但是这给了我一个错误
config\u设置不能在工作区文件中

然后我尝试将代码移动到Starlark文件中

tools/build\u 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"
            }
        }
    )
回到我的
工作区

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"
            }
        }
    )
)
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\u setting()
是内置的。我找不到应该从哪里加载它

所以,我的问题是:

  • 如何将
    config\u setting()
    加载到我的
    .bzl
    文件中
  • 或者,是否有更好的方法从命令行控制哪些参数被传递到
    scala_repositories()
  • 或者,这是不可能的吗

如果从bzl文件调用本机代码,则必须使用
native.
前缀,因此在本例中,您将调用
native.config\u设置

但是,这将导致相同的错误:
config\u设置
是生成规则,而不是工作区规则

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

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


我不熟悉scala_存储库的功能。我希望它用一个合适的版本名称定义工具链,这样您就可以正确地引用所需的工具链。我希望您可以在同一个工作区中调用它两次,否则我认为没有解决方案。

根据,在工作区中不可能配置多个Scala版本:(我现在正在研究使用代替规则的scala。只是好奇,scala_附件有用吗?scala_附件的作用似乎与我的建议相同,我仍然在掌握规则的scala_附件(以及一般的Bazel),但是的,它允许我在同一个工作区中使用scala 2.11和scala 2.12:-)