मेवन से बेज़ेल पर माइग्रेट करना

किसी समस्या की शिकायत करें सोर्स देखें Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

इस पेज पर, Maven से Bazel पर माइग्रेट करने का तरीका बताया गया है. इसमें, ज़रूरी शर्तें और इंस्टॉल करने के तरीके के बारे में भी बताया गया है. इसमें Maven और Bazel के बीच के अंतर के बारे में बताया गया है. साथ ही, Guava प्रोजेक्ट का इस्तेमाल करके माइग्रेशन का उदाहरण दिया गया है.

किसी भी बिल्ड टूल से Bazel पर माइग्रेट करते समय, दोनों बिल्ड टूल को एक साथ चलाना सबसे अच्छा होता है. ऐसा तब तक करें, जब तक कि आपकी डेवलपमेंट टीम, सीआई सिस्टम, और अन्य काम के सिस्टम को पूरी तरह से माइग्रेट नहीं कर दिया जाता. आपके पास एक ही डेटा स्टोर करने की जगह में Maven और Basel को चलाने का विकल्प है.

शुरू करने से पहले

Maven और Bazel के बीच अंतर

  • Maven, टॉप लेवल की pom.xml फ़ाइल(फ़ाइलों) का इस्तेमाल करता है. Bazel, एक से ज़्यादा बिल्ड फ़ाइलों और हर BUILD फ़ाइल के लिए एक से ज़्यादा टारगेट के साथ काम करता है. इससे, Maven की तुलना में ज़्यादा इंक्रीमेंटल बिल्ड बनाने में मदद मिलती है.
  • Maven, डिप्लॉयमेंट प्रोसेस के चरणों को मैनेज करता है. Bazel, डिप्लॉयमेंट को ऑटोमेट नहीं करता.
  • Bazel की मदद से, भाषाओं के बीच डिपेंडेंसी को दिखाया जा सकता है.
  • प्रोजेक्ट में नए सेक्शन जोड़ने पर, हो सकता है कि आपको Bazel के साथ नई BUILD फ़ाइलें जोड़नी पड़ें. हर नए Java पैकेज में BUILD फ़ाइल जोड़ना सबसे सही तरीका है.

Maven से बेज़ल में माइग्रेट करें

अपने प्रोजेक्ट को Basel में माइग्रेट करने का तरीका नीचे बताया गया है:

  1. MODULE.bazel फ़ाइल बनाना
  2. एक BUILD फ़ाइल बनाना
  3. ज़्यादा BUILD फ़ाइलें बनाना
  4. Basel का इस्तेमाल करके ऐप्लिकेशन बनाएं

यहां उदाहरण के तौर पर, Guava प्रोजेक्ट को Maven से Baze तक के माइग्रेशन से लिया गया है. इस्तेमाल किए गए Guava प्रोजेक्ट का रिलीज़ वर्शन v31.1 है. Guava का इस्तेमाल करने वाले उदाहरणों में, माइग्रेशन के हर चरण के बारे में नहीं बताया गया है. हालांकि, इनमें वे फ़ाइलें और कॉन्टेंट दिखाए गए हैं जिन्हें माइग्रेशन के लिए जनरेट किया गया है या मैन्युअल तरीके से जोड़ा गया है.

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

1. MODULE.bazel फ़ाइल बनाना

अपने प्रोजेक्ट के रूट में MODULE.bazel नाम की फ़ाइल बनाएं. अगर आपके प्रोजेक्ट में कोई बाहरी डिपेंडेंसी नहीं है, तो यह फ़ाइल खाली हो सकती है.

अगर आपका प्रोजेक्ट ऐसी फ़ाइलों या पैकेज पर निर्भर है जो किसी प्रोजेक्ट की डायरेक्ट्री में नहीं हैं, तो MODULE.baकोई फ़ाइल में इन बाहरी डिपेंडेंसी के बारे में बताएं. Maven से डिपेंडेंसी मैनेज करने के लिए, rules_jvm_external का इस्तेमाल किया जा सकता है. इस नियमों के सेट का इस्तेमाल करने के बारे में निर्देशों के लिए, Readme देखें.

Guava प्रोजेक्ट का उदाहरण: बाहरी डिपेंडेंसी

rules_jvm_external नियमों के सेट की मदद से, Guava प्रोजेक्ट की बाहरी डिपेंडेंसी की सूची बनाई जा सकती है.

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 फ़ाइलें जोड़कर, अपने बिल्ड को बेहतर बनाया जा सकता है.

  1. जिस डायरेक्ट्री में आपकी MODULE.bazel फ़ाइल है उसी डायरेक्ट्री में, एक टेक्स्ट फ़ाइल बनाएं और उसका नाम 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: अपने प्रोजेक्ट में मौजूद सभी .java फ़ाइलों की सूची बनाने के लिए, ग्लोबिंग का इस्तेमाल करें.
        • resources: अपने प्रोजेक्ट के सभी संसाधनों की सूची बनाने के लिए, ग्लोबिंग का इस्तेमाल करें.
        • deps: आपको यह तय करना होगा कि आपके प्रोजेक्ट को किन बाहरी डिपेंडेंसी की ज़रूरत है.
      • Guava प्रोजेक्ट के माइग्रेशन से जुड़ी इस टॉप-लेवल BUILD फ़ाइल का उदाहरण देखें.

  3. अब आपके प्रोजेक्ट के रूट में BUILD फ़ाइल मौजूद है. अब यह पक्का करने के लिए कि यह काम कर रही है, अपना प्रोजेक्ट बनाएं. कमांड लाइन पर, अपनी वर्कस्पेस डायरेक्ट्री में जाकर, Bazel की मदद से अपना प्रोजेक्ट बनाने के लिए bazel build //:everything का इस्तेमाल करें.

    प्रोजेक्ट अब Bazel की मदद से बन गया है. अगर प्रोजेक्ट को लगातार बनाना है, तो आपको ज़्यादा BUILD फ़ाइलें जोड़नी होंगी.

Guava प्रोजेक्ट का उदाहरण: एक BUILD फ़ाइल से शुरू करें

Guava प्रोजेक्ट को Bazel पर माइग्रेट करते समय, पूरे प्रोजेक्ट को बनाने के लिए शुरू में एक BUILD फ़ाइल का इस्तेमाल किया जाता है. Workspace डायरेक्ट्री में मौजूद इस शुरुआती 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 फ़ाइलों के सेटअप में, समस्या हल करने से जुड़ी गड़बड़ियों को आसान बनाने के लिए, पक्का करें कि हर बिल्ड फ़ाइल जोड़ने के दौरान प्रोजेक्ट पर Baज़ल का इस्तेमाल होता रहे. bazel build //... चलाकर पक्का करें कि आपके सभी टारगेट अब भी बने रहें.

4. Basel का इस्तेमाल करके बनाएं

आपने Bazel का इस्तेमाल करके बिल्ड किया है, क्योंकि आपने बिल्ड के सेटअप की पुष्टि करने के लिए BUILD फ़ाइलें जोड़ी हैं.

जब आपके पास विवरण के स्तर के हिसाब से BUILD फ़ाइलें हों, तो अपने सभी बिल्ड बनाने के लिए Basel का इस्तेमाल किया जा सकता है.