انتقل إلى المحتوى

Bazel

صرّف Java و Kotlin واختبرهما ونسّقهما في Bazel باستخدام rules_elide، أو استبدل باني rules_kotlin، أو استدعِ elide javac و elide kotlinc عمّالًا دائمين من قواعدك الخاصة.

في هذه الصفحة

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

هل كانت هذه الصفحة مفيدة؟