مهاجرت از ماون به بازل

در این صفحه نحوه مهاجرت از Maven به Bazel شامل پیش نیازها و مراحل نصب توضیح داده شده است. تفاوت های بین Maven و Bazel را شرح می دهد و نمونه ای از مهاجرت را با استفاده از پروژه Guava ارائه می دهد.

هنگام مهاجرت از هر ابزار ساخت به Bazel، بهتر است هر دو ابزار ساخت به صورت موازی اجرا شوند تا زمانی که به طور کامل تیم توسعه، سیستم CI و هر سیستم مرتبط دیگری را منتقل کنید. می توانید Maven و Bazel را در یک مخزن اجرا کنید.

قبل از اینکه شروع کنی

  • اگر Bazel هنوز نصب نشده است را نصب کنید.
  • اگر تازه وارد Bazel هستید، قبل از شروع مهاجرت، آموزش مقدماتی Bazel: ساخت جاوا را دنبال کنید. این آموزش مفاهیم، ​​ساختار و نحو برچسب Bazel را توضیح می دهد.

تفاوت بین Maven و Bazel

  • Maven از فایل(های) pom.xml سطح بالا استفاده می کند. Bazel از چندین فایل ساخت و چندین هدف در هر فایل BUILD پشتیبانی می‌کند و به ساخت‌هایی که بیشتر از Maven هستند اجازه می‌دهد.
  • Maven مسئولیت مراحل فرآیند استقرار را بر عهده می گیرد. Bazel استقرار خودکار را انجام نمی دهد.
  • Bazel شما را قادر می سازد تا وابستگی بین زبان ها را بیان کنید.
  • همانطور که بخش های جدیدی را به پروژه اضافه می کنید، با Bazel ممکن است نیاز به اضافه کردن فایل های BUILD جدید داشته باشید. بهترین روش اضافه کردن یک فایل BUILD به هر بسته جدید جاوا است.

مهاجرت از Maven به Bazel

مراحل زیر نحوه انتقال پروژه خود به Bazel را شرح می دهد:

  1. فایل WORKSPACE را ایجاد کنید
  2. یک فایل BUILD ایجاد کنید
  3. فایل های BUILD بیشتری ایجاد کنید
  4. با استفاده از Bazel بسازید

نمونه های زیر مربوط به مهاجرت پروژه گواوا از Maven به Bazel است. پروژه Guava مورد استفاده نسخه نسخه v31.1 است. نمونه‌هایی که از Guava استفاده می‌کنند، در هر مرحله از مهاجرت نمی‌روند، اما فایل‌ها و محتویاتی را نشان می‌دهند که به‌صورت دستی برای انتقال تولید یا اضافه شده‌اند.

$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1

1. فایل WORKSPACE را ایجاد کنید

فایلی به نام WORKSPACE در ریشه پروژه خود ایجاد کنید. اگر پروژه شما وابستگی خارجی ندارد، فایل فضای کاری می تواند خالی باشد.

اگر پروژه شما به فایل ها یا بسته هایی بستگی دارد که در یکی از دایرکتوری های پروژه نیستند، این وابستگی های خارجی را در فایل فضای کاری مشخص کنید. برای خودکار کردن فهرست بندی وابستگی های خارجی برای فایل فضای کاری، از rules_jvm_external استفاده کنید. برای دستورالعمل‌های مربوط به استفاده از این مجموعه قوانین، به README مراجعه کنید.

نمونه پروژه گواوا: وابستگی های خارجی

شما می توانید وابستگی های خارجی پروژه Guava را با rules_jvm_external کنید.

قطعه زیر را به فایل WORKSPACE اضافه کنید:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

RULES_JVM_EXTERNAL_TAG = "4.3"
RULES_JVM_EXTERNAL_SHA = "6274687f6fc5783b589f56a2f1ed60de3ce1f99bc4e8f9edef3de43bdf7c6e74"

http_archive(
    name = "rules_jvm_external",
    sha256 = RULES_JVM_EXTERNAL_SHA,
    strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
    url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
)

load("@rules_jvm_external//:defs.bzl", "maven_install")

maven_install(
    artifacts = [
        "com.google.code.findbugs:jsr305:3.0.2",
        "com.google.errorprone:error_prone_annotations:2.11.0",
        "com.google.j2objc:j2objc-annotations:1.3",
        "org.codehaus.mojo:animal-sniffer-annotations:1.20",
        "org.checkerframework:checker-qual:3.12.0",
    ],
    repositories = [
        "https://repo1.maven.org/maven2",
    ],
)

2. یک فایل BUILD ایجاد کنید

اکنون که فضای کاری خود را تعریف کرده‌اید و وابستگی‌های خارجی (در صورت وجود) را فهرست کرده‌اید، باید فایل‌های BUILD ایجاد کنید تا نحوه ساخت پروژه خود را شرح دهید. برخلاف Maven با یک فایل pom.xml ، Bazel می‌تواند از بسیاری از فایل‌های BUILD برای ساخت یک پروژه استفاده کند. این فایل‌ها چندین هدف ساخت را مشخص می‌کنند که به Bazel اجازه می‌دهد تا ساخت‌های افزایشی تولید کند.

فایل های BUILD را به صورت مرحله ای اضافه کنید. با افزودن یک فایل BUILD در ریشه پروژه خود و استفاده از آن برای انجام ساخت اولیه با استفاده از Bazel شروع کنید. سپس، با افزودن فایل‌های BUILD بیشتر با هدف‌های دانه‌دارتر، ساخت خود را اصلاح می‌کنید.

  1. در همان پوشه فایل WORKSPACE خود، یک فایل متنی ایجاد کنید و نام آن را BUILD بگذارید.

  2. در این فایل BUILD ، از قانون مناسب برای ایجاد یک هدف برای ساخت پروژه خود استفاده کنید. در اینجا چند نکته وجود دارد:

    • از قانون مناسب استفاده کنید:

      • برای ساخت پروژه ها با یک ماژول Maven، از قانون java_library به صورت زیر استفاده کنید:

        java_library(
            name = "everything",
            srcs = glob(["src/main/java/**/*.java"]),
            resources = glob(["src/main/resources/**"]),
            deps = ["//:all-external-targets"],
        )
        
      • برای ساخت پروژه هایی با چندین ماژول Maven، از قانون java_library به صورت زیر استفاده کنید:

        java_library(
            name = "everything",
            srcs = glob([
                "Module1/src/main/java/**/*.java",
                "Module2/src/main/java/**/*.java",
                ...
            ]),
            resources = glob([
                "Module1/src/main/resources/**",
                "Module2/src/main/resources/**",
                ...
            ]),
            deps = ["//:all-external-targets"],
        )
        
      • برای ساختن باینری ها از قانون java_binary استفاده کنید:

        java_binary(
            name = "everything",
            srcs = glob(["src/main/java/**/*.java"]),
            resources = glob(["src/main/resources/**"]),
            deps = ["//:all-external-targets"],
            main_class = "com.example.Main"
        )
        
    • ویژگی ها را مشخص کنید:

      • name : به هدف یک نام معنادار بدهید. در مثال های بالا، هدف "همه چیز" نامیده می شود.
      • srcs : از globbing برای فهرست کردن همه فایل‌های java. در پروژه خود استفاده کنید.
      • resources : از globbing برای فهرست کردن تمام منابع پروژه خود استفاده کنید.
      • deps : شما باید تعیین کنید که پروژه شما به کدام وابستگی های خارجی نیاز دارد. برای مثال، اگر فهرستی از وابستگی‌های خارجی را با استفاده از ابزار generate_workspace کرده‌اید، وابستگی‌های java_library کتابخانه‌هایی هستند که در ماکرو generated_java_libraries فهرست شده‌اند.
    • به مثال زیر از این فایل BUILD سطح بالا از مهاجرت پروژه Guava نگاه کنید.

  3. اکنون که یک فایل BUILD در ریشه پروژه خود دارید، پروژه خود را بسازید تا مطمئن شوید که کار می کند. در خط فرمان، از دایرکتوری فضای کاری خود، از bazel build //:everything برای ساخت پروژه خود با Bazel استفاده کنید.

    این پروژه اکنون با موفقیت با بازل ساخته شده است. شما باید فایل های BUILD بیشتری اضافه کنید تا امکان ساخت افزایشی پروژه فراهم شود.

مثال پروژه Guava: با یک فایل BUILD شروع کنید

هنگام انتقال پروژه Guava به Bazel، در ابتدا از یک فایل BUILD برای ساخت کل پروژه استفاده می شود. در اینجا محتویات این فایل BUILD اولیه در دایرکتوری فضای کاری آمده است:

java_library(
    name = "everything",
    srcs = glob([
        "guava/src/**/*.java",
        "futures/failureaccess/src/**/*.java",
    ]),
    deps = [
        "@maven//:com_google_code_findbugs_jsr305",
        "@maven//:com_google_errorprone_error_prone_annotations",
        "@maven//:com_google_j2objc_j2objc_annotations",
        "@maven//:org_checkerframework_checker_qual",
        "@maven//:org_codehaus_mojo_animal_sniffer_annotations",
    ],
)

3. فایل های BUILD بیشتری ایجاد کنید (اختیاری)

Bazel فقط با یک BUILD file کار می کند، همانطور که پس از تکمیل اولین ساخت خود مشاهده کردید. همچنان باید با افزودن فایل‌های BUILD بیشتر با اهداف دانه‌ای، ساخت را به قطعات کوچک‌تر تقسیم کنید.

چندین فایل BUILD با چندین هدف به ساخت گرانولاریت بیشتری می بخشد و این امکان را به شما می دهد:

  • افزایش ساخت تدریجی پروژه،
  • افزایش اجرای موازی ساخت،
  • قابلیت نگهداری بهتر ساخت برای کاربران آینده و
  • کنترل روی دید اهداف بین بسته ها، که می تواند از نشت مسائلی مانند کتابخانه های حاوی جزئیات پیاده سازی به API های عمومی جلوگیری کند.

نکاتی برای افزودن فایل های BUILD بیشتر:

  • می توانید با افزودن یک فایل BUILD به هر بسته جاوا شروع کنید. با بسته های جاوا که کمترین وابستگی را دارند شروع کنید و به بسته هایی با بیشترین وابستگی برسید.
  • همانطور که فایل‌های BUILD را اضافه می‌کنید و اهداف را مشخص می‌کنید، این اهداف جدید را به بخش‌های deps اهدافی که به آنها بستگی دارد اضافه کنید. توجه داشته باشید که تابع glob() از مرزهای بسته عبور نمی کند، بنابراین با افزایش تعداد بسته ها، فایل های مطابق با glob() کوچک می شوند.
  • هر زمان که یک فایل BUILD را به دایرکتوری main اضافه می کنید، مطمئن شوید که یک فایل BUILD را به دایرکتوری test مربوطه اضافه می کنید.
  • مراقب باشید که دید بین بسته ها را به درستی محدود کنید.
  • برای ساده‌سازی عیب‌یابی خطاها در راه‌اندازی فایل‌های BUILD ، اطمینان حاصل کنید که با اضافه کردن هر فایل ساخت، پروژه با Bazel به ساخت ادامه می‌دهد. bazel build //... را اجرا کنید تا مطمئن شوید که تمام اهداف شما همچنان ساخته می شوند.

4. با استفاده از Bazel بسازید

شما در حال ساخت با استفاده از Bazel بوده اید که فایل های BUILD را برای تأیید اعتبار تنظیم بیلد اضافه می کنید.

هنگامی که فایل های BUILD را با دانه بندی مورد نظر دارید، می توانید از Bazel برای تولید همه بیلدهای خود استفاده کنید.