इस पेज पर, Maven से Bazel पर माइग्रेट करने का तरीका बताया गया है. इसमें ज़रूरी शर्तें और इंस्टॉल करने के चरण शामिल हैं. इसमें Maven और Bazel के बीच के अंतर के बारे में बताया गया है. साथ ही, Guava प्रोजेक्ट का इस्तेमाल करके माइग्रेशन का एक उदाहरण भी दिया गया है.
किसी भी बिल्ड टूल से Bazel पर माइग्रेट करते समय, सबसे सही तरीका यह है कि जब तक आपकी डेवलपमेंट टीम, सीआई सिस्टम, और अन्य ज़रूरी सिस्टम पूरी तरह से माइग्रेट न हो जाएं, तब तक दोनों बिल्ड टूल को एक साथ चलाया जाए. एक ही रिपॉज़िटरी में Maven और Bazel को चलाया जा सकता है.
शुरू करने से पहले
- अगर Bazel इंस्टॉल नहीं है, तो इसे इंस्टॉल करें.
- अगर आपने पहले कभी Bazel का इस्तेमाल नहीं किया है, तो माइग्रेट करने से पहले, Bazel का परिचय: Java बिल्ड करें ट्यूटोरियल देखें. इस ट्यूटोरियल में, Bazel के कॉन्सेप्ट, स्ट्रक्चर, और लेबल सिंटैक्स के बारे में बताया गया है.
Maven और Bazel के बीच अंतर
- Maven, टॉप-लेवल
pom.xmlफ़ाइल(लों) का इस्तेमाल करता है. Bazel, एक से ज़्यादा बिल्ड फ़ाइलों और हरBUILDफ़ाइल के लिए एक से ज़्यादा टारगेट के साथ काम करता है. इससे Maven की तुलना में ज़्यादा इंक्रीमेंटल बिल्ड बनाए जा सकते हैं. - Maven, डिप्लॉयमेंट की प्रोसेस के चरणों को मैनेज करता है. Bazel, डिप्लॉयमेंट को ऑटोमेट नहीं करता.
- Bazel की मदद से, अलग-अलग भाषाओं के बीच डिपेंडेंसी तय की जा सकती हैं.
- प्रोजेक्ट में नए सेक्शन जोड़ने पर, Bazel के साथ आपको नई
BUILDफ़ाइलें जोड़नी पड़ सकती हैं. सबसे सही तरीका यह है कि हर नए Java पैकेज में एकBUILDफ़ाइल जोड़ी जाए.
Maven से Bazel पर माइग्रेट करना
अपने प्रोजेक्ट को Bazel पर माइग्रेट करने का तरीका यहां बताया गया है:
- MODULE.bazel फ़ाइल बनाना
- एक BUILD फ़ाइल बनाना
- ज़्यादा BUILD फ़ाइलें बनाना
- Bazel का इस्तेमाल करके बिल्ड करना
यहां दिए गए उदाहरण, Guava
प्रोजेक्ट को Maven से Bazel पर माइग्रेट करने से जुड़े हैं. Guava प्रोजेक्ट का रिलीज़ वर्शन v31.1 इस्तेमाल किया गया है. Guava का इस्तेमाल करने वाले उदाहरणों में, माइग्रेशन के हर चरण के बारे में नहीं बताया गया है. हालांकि, इनमें वे फ़ाइलें और कॉन्टेंट दिखाए गए हैं जो माइग्रेशन के लिए जनरेट किए जाते हैं या मैन्युअल तरीके से जोड़े जाते हैं.
$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1
1. MODULE.bazel फ़ाइल बनाना
अपने प्रोजेक्ट की रूट डायरेक्ट्री में, MODULE.bazel नाम की एक फ़ाइल बनाएं. अगर आपके प्रोजेक्ट में कोई बाहरी डिपेंडेंसी नहीं है, तो यह फ़ाइल खाली हो सकती है.
अगर आपका प्रोजेक्ट, उन फ़ाइलों या पैकेज पर निर्भर करता है जो प्रोजेक्ट की किसी डायरेक्ट्री में नहीं हैं, तो MODULE.bazel फ़ाइल में इन बाहरी डिपेंडेंसी के बारे में बताएं. Maven से डिपेंडेंसी मैनेज करने के लिए, rules_jvm_external का इस्तेमाल किया जा सकता है. इस नियमसेट का इस्तेमाल करने के निर्देशों के लिए, README देखें.
Guava प्रोजेक्ट का उदाहरण: बाहरी डिपेंडेंसी
Guava
project की बाहरी डिपेंडेंसी की सूची,
rules_jvm_external
ruleset की मदद से बनाई जा सकती है.
MODULE.bazel फ़ाइल में, यह स्निपेट जोड़ें:
bazel_dep(name = "rules_jvm_external", version = "6.2")
maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
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",
],
)
use_repo(maven, "maven")
2. एक BUILD फ़ाइल बनाना
अब आपने अपना वर्कस्पेस तय कर लिया है और बाहरी डिपेंडेंसी (अगर लागू हो) की सूची बना ली है. इसके बाद, आपको BUILD फ़ाइलें बनानी होंगी. इनसे यह तय किया जाता है कि आपके प्रोजेक्ट को कैसे बिल्ड किया जाना चाहिए. Maven में जहां सिर्फ़ एक pom.xml फ़ाइल का इस्तेमाल किया जाता है, वहीं Bazel किसी प्रोजेक्ट को बिल्ड करने के लिए कई BUILD फ़ाइलों का इस्तेमाल कर सकता है. इन फ़ाइलों में, एक से ज़्यादा बिल्ड टारगेट तय किए जाते हैं. इससे Bazel, इंक्रीमेंटल बिल्ड बना सकता है.
BUILD फ़ाइलें चरणों में जोड़ें. सबसे पहले, अपने प्रोजेक्ट की रूट डायरेक्ट्री में एक BUILD फ़ाइल जोड़ें और इसका इस्तेमाल करके, Bazel की मदद से शुरुआती बिल्ड बनाएं. इसके बाद, ज़्यादा ग्रेन्यूलर टारगेट वाली ज़्यादा BUILD फ़ाइलें जोड़कर, अपने बिल्ड को बेहतर बनाएं.
अपनी
MODULE.bazelफ़ाइल वाली डायरेक्ट्री में, एक टेक्स्ट फ़ाइल बनाएं और उसका नाम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: टारगेट को कोई काम का नाम दें. ऊपर दिए गए उदाहरणों में, टारगेट को "everything" कहा गया है.srcs: अपने प्रोजेक्ट में मौजूद सभी .java फ़ाइलों की सूची बनाने के लिए, ग्लोबिंग का इस्तेमाल करें.resources: अपने प्रोजेक्ट में मौजूद सभी संसाधनों की सूची बनाने के लिए, ग्लोबिंग का इस्तेमाल करें.deps: आपको यह तय करना होगा कि आपके प्रोजेक्ट को किन बाहरी डिपेंडेंसी की ज़रूरत है.
Guava प्रोजेक्ट के माइग्रेशन से जुड़ी, टॉप-लेवल BUILD फ़ाइल का यह उदाहरण देखें.
अब आपके प्रोजेक्ट की रूट डायरेक्ट्री में एक
BUILDफ़ाइल मौजूद है. इसलिए, अपने प्रोजेक्ट को बिल्ड करें, ताकि यह पक्का किया जा सके कि यह काम करता है. कमांड लाइन पर, अपने वर्कस्पेस की डायरेक्ट्री से,bazel build //:everythingका इस्तेमाल करके, अपने प्रोजेक्ट को Bazel से बिल्ड करें.प्रोजेक्ट को अब Bazel से सफलतापूर्वक बिल्ड कर लिया गया है. प्रोजेक्ट के इंक्रीमेंटल बिल्ड बनाने के लिए, आपको ज़्यादा
BUILDफ़ाइलें जोड़नी होंगी.
Guava प्रोजेक्ट का उदाहरण: एक BUILD फ़ाइल से शुरू करना
Guava प्रोजेक्ट को Bazel पर माइग्रेट करते समय, शुरुआती तौर पर पूरे प्रोजेक्ट को बिल्ड करने के लिए एक BUILD फ़ाइल का इस्तेमाल किया जाता है. वर्कस्पेस की डायरेक्ट्री में, इस शुरुआती BUILD फ़ाइल का कॉन्टेंट यहां दिया गया है:
java_library(
name = "everything",
srcs = glob([
"guava/src/**/*.java",
"futures/failureaccess/src/**/*.java",
]),
javacopts = ["-XepDisableAllChecks"],
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 फ़ाइलों और एक से ज़्यादा टारगेट की मदद से, बिल्ड की ग्रेन्यूलरिटी बढ़ जाएगी. इससे:
- प्रोजेक्ट के ज़्यादा इंक्रीमेंटल बिल्ड बनाए जा सकेंगे,
- बिल्ड को एक साथ ज़्यादा तेज़ी से एक्ज़ीक्यूट किया जा सकेगा,
- भविष्य में इस्तेमाल करने वाले लोगों के लिए, बिल्ड को बेहतर तरीके से मैनेज किया जा सकेगा और
- पैकेज के बीच टारगेट की विज़िबिलिटी को कंट्रोल किया जा सकेगा. इससे, लाइब्रेरी में मौजूद लागू करने से जुड़ी जानकारी, सार्वजनिक एपीआई में लीक होने जैसी समस्याओं को रोका जा सकेगा.
ज़्यादा BUILD फ़ाइलें जोड़ने के लिए सुझाव:
- हर Java पैकेज में एक
BUILDफ़ाइल जोड़कर शुरू किया जा सकता है. सबसे पहले, उन Java पैकेज से शुरू करें जिनमें सबसे कम डिपेंडेंसी हैं. इसके बाद, उन पैकेज तक जाएं जिनमें सबसे ज़्यादा डिपेंडेंसी हैं. BUILDफ़ाइलें जोड़ते समय और टारगेट तय करते समय, इन नए टारगेट को उन टारगेट केdepsसेक्शन में जोड़ें जो इन पर निर्भर करते हैं. ध्यान दें किglob()फ़ंक्शन, पैकेज की सीमाओं को पार नहीं करता. इसलिए, पैकेज की संख्या बढ़ने पर,glob()से मैच होने वाली फ़ाइलें कम हो जाएंगी.- जब भी किसी
mainडायरेक्ट्री में कोईBUILDफ़ाइल जोड़ी जाती है, तो पक्का करें कि आपने उससे जुड़ीtestडायरेक्ट्री में भी एकBUILDफ़ाइल जोड़ी हो. - पैकेज के बीच विज़िबिलिटी को सही तरीके से सीमित करें.
BUILDफ़ाइलों के सेटअप में गड़बड़ियों को आसानी से ठीक करने के लिए, पक्का करें कि हर बिल्ड फ़ाइल जोड़ने पर, प्रोजेक्ट Bazel से बिल्ड होता रहे.bazel build //...चलाकर पक्का करें कि आपके सभी टारगेट अब भी बिल्ड हो रहे हों.
4. Bazel का इस्तेमाल करके बिल्ड करना
बिल्ड के सेटअप की पुष्टि करने के लिए, BUILD फ़ाइलें जोड़ते समय, Bazel का इस्तेमाल करके बिल्ड किया जाता रहा है.
जब आपके पास BUILD फ़ाइलें, ज़रूरत के हिसाब से ग्रेन्यूलरिटी पर मौजूद हों, तो अपने सभी बिल्ड बनाने के लिए Bazel का इस्तेमाल किया जा सकता है.