Как загрузить `config_setting ()` в мой файл `.bzl`? - PullRequest
0 голосов
/ 21 октября 2018

Моя мотивация: наша кодовая база разбросана по крайней мере на 20 репозиториях git.Я хочу объединить все в одно git-репо с единой системой сборки.В настоящее время мы используем 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.

Чтобы обойти это, я планирую настроить настраиваемые атрибуты , чтобы я мог указать --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 голосов
/ 21 октября 2018

Если вы вызываете собственный код из файла bzl, вы должны использовать префикс native., поэтому в этом случае вы должны вызвать native.config_setting.

Однако это приведет к той же ошибке: config_setting - это правило BUILD, а не правило WORKSPACE.

Если вы хотите изменить инструмент построения, используемый для конкретной цели, вы можете изменить цепочку инструментов, и, кажется, это поддерживается через scala_toolchain

И я полагаю, что вы можете использовать конфигурацию для выбора цепочки инструментов.

Я не знаю, что делает scala_repositories.Я надеюсь, что он определяет цепочку инструментов с правильным версионным именем, чтобы вы могли правильно ссылаться на нужную цепочку инструментов.И я надеюсь, что вы можете вызвать его дважды в одном и том же рабочем пространстве, иначе я думаю, что нет никакого решения.

...