Перейти до вмісту

Bazel

Компілюйте, тестуйте й форматуйте Java і Kotlin у Bazel з rules_elide, замініть білдер rules_kotlin або викликайте elide javac і elide kotlinc як постійні воркери з власних правил.

На цій сторінці

rules_elide — модуль Bazel із правилами для Java і Kotlin, які компілюють через elide javac і elide kotlinc, запущені як постійні воркери. Він сам завантажує Elide; ні JDK, ні інструментарій Kotlin не потрібні.

Вимоги

Версія
Bazel8 або 9, з Bzlmod
rules_elide0.7.0
Elide1.6.0-rc.2 (за замовчуванням)
ПлатформиLinux x86_64 і arm64, macOS arm64

Встановлення

# MODULE.bazel
bazel_dep(name = "rules_elide", version = "0.7.0")

elide = use_extension("@rules_elide//elide:extensions.bzl", "elide")
elide.install(version = "1.6.0-rc.2")
use_repo(elide, "elide_toolchains")
register_toolchains("@elide_toolchains//:all")

elide.install() завантажує випуск Elide для хоста й звіряє його із закріпленим хешем; version має бути зі списку модуля. Щоб використовувати Elide, встановлений вами:

elide.use(local_path = "/opt/elide")

Правила

Завантажуйте їх з @rules_elide//elide:defs.bzl.

ПравилоЩо робить
elide_java_libraryКомпілює вихідні файли .java у JAR
elide_java_binaryБібліотека плюс лаунчер (bazel run)
elide_java_testБібліотека плюс лаунчер JUnit Platform (bazel test)
elide_kotlin_libraryКомпілює вихідні файли .kt і змішані .kt/.java
elide_kotlin_binary, elide_kotlin_testЯк варіанти для Java, але для Kotlin
elide_formatЦіль для bazel run, що форматує вихідні файли на місці (Java або Kotlin, одна мова на ціль)
elide_native_imageНативний бінарний файл із цілей JVM

Кожне правило компіляції повертає JavaInfo, тож цілі java_library, kt_jvm_library і rules_jvm_external вільно поєднуються в deps. Правилам тестів потрібен org.junit.platform:junit-platform-console-standalone у runtime_deps.

Повний довідник атрибутів: документація rules_elide.

Приклад

MODULE.bazel
BUILD.bazel
src/Greeter.java
src/App.kt
src/GreeterTest.java
# MODULE.bazel
module(name = "hello")

bazel_dep(name = "rules_elide", version = "0.7.0")
bazel_dep(name = "rules_jvm_external", version = "7.1")

elide = use_extension("@rules_elide//elide:extensions.bzl", "elide")
elide.install(version = "1.6.0-rc.2")
use_repo(elide, "elide_toolchains")
register_toolchains("@elide_toolchains//:all")

maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
maven.install(
    artifacts = [
        "org.junit.jupiter:junit-jupiter-api:5.13.4",
        "org.junit.platform:junit-platform-console-standalone:1.13.4",
    ],
)
use_repo(maven, "maven")
# BUILD.bazel
load("@rules_elide//elide:defs.bzl", "elide_java_library", "elide_java_test", "elide_kotlin_binary")

elide_java_library(
    name = "greeter",
    srcs = ["src/Greeter.java"],
)

elide_kotlin_binary(
    name = "app",
    srcs = ["src/App.kt"],
    main_class = "AppKt",
    deps = [":greeter"],
)

elide_java_test(
    name = "greeter_test",
    srcs = ["src/GreeterTest.java"],
    test_class = "GreeterTest",
    runtime_deps = ["@maven//:org_junit_platform_junit_platform_console_standalone"],
    deps = [
        ":greeter",
        "@maven//:org_junit_jupiter_junit_jupiter_api",
    ],
)
bazel build //...
bazel run //:app
bazel test //:greeter_test
INFO: 35 processes: 12 internal, 16 linux-sandbox, 7 worker.
INFO: Build completed successfully, 35 total actions

Hello, Bazel

//:greeter_test                                                 PASSED in 2.0s
Executed 1 out of 1 test: 1 test passes.

Постійні воркери

Правила компіляції запускають elide javac --persistent_worker і elide kotlinc --persistent_worker: один прогрітий процес на інструмент обслуговує всі дії компіляції, приймає паралельні запити й компілює їх по одному. bazel shutdown їх зупиняє.

Щоб компілювати кожну ціль у новому процесі (наприклад, під час віддаленого виконання):

bazel build --@rules_elide//elide:use_workers=false //...

Воркери з власних правил

Без rules_elide будь-яке правило може запускати Elide як воркер. Bazel сам додає --persistent_worker; правило передає аргументи у файлі параметрів:

# elide.bzl
def _elide_javac_impl(ctx):
    out = ctx.actions.declare_directory(ctx.label.name + "_classes")
    args = ctx.actions.args()
    args.add("-d", out.path)
    args.add_all(ctx.files.srcs)
    args.use_param_file("@%s", use_always = True)
    args.set_param_file_format("multiline")
    ctx.actions.run(
        executable = ctx.executable._elide,
        arguments = ["javac", args],
        inputs = ctx.files.srcs,
        outputs = [out],
        mnemonic = "ElideJavac",
        execution_requirements = {"supports-workers": "1", "supports-multiplex-workers": "1"},
    )
    return [DefaultInfo(files = depset([out]))]

elide_javac = rule(
    implementation = _elide_javac_impl,
    attrs = {
        "srcs": attr.label_list(allow_files = [".java"]),
        "_elide": attr.label(default = "//tools:elide", executable = True, cfg = "exec", allow_single_file = True),
    },
)
# BUILD.bazel
load(":elide.bzl", "elide_javac")

elide_javac(
    name = "hello",
    srcs = glob(["src/*.java"]),
)
mkdir -p tools && ln -s "$(command -v elide)" tools/elide
echo 'exports_files(["elide"])' > tools/BUILD.bazel
bazel build //:hello
Target //:hello up-to-date:
  bazel-bin/hello_classes
INFO: 2 processes: 1 internal, 1 worker.

Для javac передайте ["javac", "--classpath-cache", args], щоб повторно використовувати розібрані JAR з classpath між запитами. Правило для kotlinc має таку саму форму, але без --classpath-cache.

Збереження цілей kt_jvm_*

register_elide_kotlin_toolchain з @rules_elide//elide/kotlin:toolchain.bzl замінює білдер в інструментарії rules_kotlin, тож наявні цілі kt_jvm_library, kt_jvm_binary і kt_jvm_test компілюються з Elide без змін у файлах BUILD. Цілі з процесорами анотацій повертаються до стандартного білдера rules_kotlin. Налаштування: прошарок KotlinBuilder.

OpenRewrite і запити до залежностей

Для проєктів з elide.pkl див. OpenRewrite та Індекс коду залежностей. Ці команди не використовують JavaInfo з Bazel і його граф цілей, а наведені вище правила не додають цілей для рефакторингу чи індексу коду. Перш ніж використовувати їх поряд із Bazel, прочитайте про межу налаштування проєкту.

Обмеження

  • Windows не підтримується.
  • elide.install приймає лише версії зі списку модуля; для інших використовуйте elide.use.
  • Плагіни компілятора Kotlin із зовнішніх JAR (атрибут plugins правил elide_kotlin_*), крім all-open, no-arg, sam-with-receiver, assignment і Lombok, завершуються помилкою компілятора.

Чи була ця сторінка корисною?