rules_elide — модуль Bazel із правилами для Java і Kotlin, які компілюють через elide javac і elide kotlinc,
запущені як постійні воркери. Він сам завантажує Elide; ні JDK, ні інструментарій Kotlin не потрібні.
Вимоги
| Версія | |
|---|---|
| Bazel | 8 або 9, з Bzlmod |
rules_elide | 0.7.0 |
| Elide | 1.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_testINFO: 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 //:helloTarget //: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, завершуються помилкою компілятора.