در این صفحه نحوه مهاجرت از 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 را شرح می دهد:
- فایل WORKSPACE را ایجاد کنید
- یک فایل BUILD ایجاد کنید
- فایل های BUILD بیشتری ایجاد کنید
- با استفاده از 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 بیشتر با هدفهای دانهدارتر، ساخت خود را اصلاح میکنید.
در همان پوشه فایل
WORKSPACEخود، یک فایل متنی ایجاد کنید و نام آن راBUILDبگذارید.در این فایل
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 نگاه کنید.
اکنون که یک فایل
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 برای تولید همه بیلدهای خود استفاده کنید.