در این صفحه نحوه مهاجرت از 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 برای تولید همه بیلدهای خود استفاده کنید.