الوحدة rules_elide وحدة Bazel فيها قواعد لـ Java و Kotlin تُصرّف عبر elide javac و elide kotlinc اللذين يعملان
عمّالًا دائمين (persistent workers). وهي تنزّل 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 بخطأ من المُصرّف.