การย้ายข้อมูลจาก Maven ไปยัง Bazel

รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

หน้านี้อธิบายวิธีย้ายข้อมูลจาก Maven ไปยัง Bazel รวมถึง ข้อกำหนดเบื้องต้นและขั้นตอนการติดตั้ง ซึ่งอธิบายความแตกต่างระหว่าง Maven และ Bazel และให้ตัวอย่างการย้ายข้อมูลโดยใช้โปรเจ็กต์ Guava

เมื่อย้ายข้อมูลจากเครื่องมือบิลด์ใดก็ตามไปยัง Bazel ควรมีเครื่องมือบิลด์ทั้งคู่ พร้อมกันจนกว่าคุณจะย้ายทีมพัฒนาโดยสมบูรณ์ หรือ CI และระบบอื่นๆ ที่เกี่ยวข้อง คุณสามารถเรียกใช้ Maven และ Bazel ได้ ที่เก็บได้

ก่อนเริ่มต้น

ความแตกต่างระหว่าง Maven และ Bazel

  • Maven ใช้ไฟล์ pom.xml ระดับบนสุด Bazel รองรับไฟล์บิลด์หลายไฟล์ และหลายเป้าหมายต่อ BUILD ไฟล์ ทำให้สามารถสร้างบิลด์ที่มี ซึ่งเพิ่มขึ้นกว่าของ Maven
  • Maven จะดูแลขั้นตอนต่างๆ ในกระบวนการทำให้ใช้งานได้ Bazel ไม่ การทำให้ใช้งานได้โดยอัตโนมัติ
  • Bazel ให้คุณแสดงทรัพยากร Dependency ระหว่างภาษาได้
  • เมื่อเพิ่มส่วนใหม่ให้กับโปรเจ็กต์ คุณอาจต้องเพิ่มส่วนใหม่ด้วย Bazel BUILD ไฟล์ แนวทางปฏิบัติแนะนำคือเพิ่มไฟล์ BUILD ลงใน Java ใหม่แต่ละรายการ ใหม่

ย้ายข้อมูลจาก Maven ไปยัง Bazel

ขั้นตอนด้านล่างอธิบายวิธีย้ายข้อมูลโปรเจ็กต์ไปยัง Bazel

  1. สร้างไฟล์ MODULE.bazel
  2. สร้างไฟล์ BUILD ไฟล์เดียว
  3. สร้างไฟล์ BUILD เพิ่มเติม
  4. สร้างสรรค์ด้วย 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 ที่รูทของโปรเจ็กต์ หากโปรเจ็กต์ของคุณ ไม่มีทรัพยากร Dependency ภายนอก ไฟล์นี้จึงอาจว่างเปล่า

หากโปรเจ็กต์ของคุณต้องใช้ไฟล์หรือแพ็กเกจที่ไม่ได้อยู่ในหนึ่งใน ไดเรกทอรีของโปรเจ็กต์ ให้ระบุทรัพยากร Dependency ภายนอกเหล่านี้ใน MODULE.bazel คุณใช้ rules_jvm_external เพื่อจัดการทรัพยากร Dependency จาก Maven ได้ สำหรับ คำแนะนำเกี่ยวกับการใช้ชุดกฎนี้ โปรดดู README ที่ใช้เวลาเพียง 2 นาที

ตัวอย่างโปรเจ็กต์ Guava: ทรัพยากร Dependency ภายนอก

คุณสามารถระบุรายการทรัพยากร Dependency ภายนอกของ Guava ได้ โปรเจ็กต์ที่มี rules_jvm_external

เพิ่มข้อมูลโค้ดต่อไปนี้ลงในไฟล์ 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 ไฟล์เดียว

ตอนนี้คุณมีพื้นที่ทำงานที่กำหนดไว้และทรัพยากร Dependency ภายนอกแล้ว (หาก (หากมี) คุณต้องสร้างไฟล์ BUILD ไฟล์เพื่ออธิบายวิธี ควรสร้าง Bazel สามารถใช้ไฟล์ที่แตกต่างจาก Maven ที่มีไฟล์ pom.xml เพียงไฟล์เดียว ไฟล์ BUILD หลายไฟล์เพื่อสร้างโปรเจ็กต์ ไฟล์เหล่านี้ระบุหลายบิลด์ ซึ่งทำให้ Bazel ผลิตงานสร้างเพิ่มขึ้นได้

เพิ่ม BUILD ไฟล์ทีละไฟล์ เริ่มต้นด้วยการเพิ่มไฟล์ BUILD หนึ่งไฟล์ที่รูทของ โปรเจ็กต์ของคุณและใช้เพื่อสร้างงานสร้างเริ่มต้นโดยใช้ Bazel จากนั้นปรับแต่ง ด้วยการเพิ่มไฟล์ BUILD ที่มีเป้าหมายละเอียดยิ่งขึ้น

  1. ในไดเรกทอรีเดียวกับไฟล์ MODULE.bazel ให้สร้างไฟล์ข้อความและ ตั้งชื่อว่า BUILD

  2. ในไฟล์ BUILD นี้ ให้ใช้กฎที่เหมาะสมเพื่อสร้างเป้าหมาย 1 รายการที่จะสร้าง โปรเจ็กต์ของคุณ มาดูเคล็ดลับบางส่วนกัน

    • ใช้กฎที่เหมาะสมดังนี้

      • หากต้องการสร้างโปรเจ็กต์ด้วยโมดูล 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: ใช้เสียงเพื่อแสดงทรัพยากรทั้งหมดในโปรเจ็กต์
        • deps: คุณต้องกำหนดว่าทรัพยากร Dependency ภายนอกใด ความต้องการของโครงการ
      • ลองดูตัวอย่างด้านล่างของ BUILD ระดับบนสุดนี้ จากการย้ายข้อมูลของโปรเจ็กต์ Guava

  3. ตอนนี้คุณมีไฟล์ BUILD ที่รูทของโปรเจ็กต์แล้ว ให้สร้างไฟล์ เพื่อให้แน่ใจว่าใช้งานได้ ในบรรทัดคำสั่ง จากพื้นที่ทำงาน ให้ใช้ bazel build //:everything เพื่อสร้างโปรเจ็กต์ด้วย Bazel

    ตอนนี้โปรเจ็กต์ได้สร้างด้วย Bazel เสร็จสมบูรณ์แล้ว คุณจะต้องเพิ่ม ไฟล์ BUILD เพิ่มเติมเพื่ออนุญาตให้มีบิลด์ของโปรเจ็กต์ที่เพิ่มขึ้น

ตัวอย่างโปรเจ็กต์ Guava: เริ่มต้นด้วยไฟล์ BUILD ไฟล์เดียว

เมื่อย้ายข้อมูลโปรเจ็กต์ Guava ไปยัง Bazel ในตอนแรกจะมีการใช้ไฟล์ BUILD 1 ไฟล์เพื่อ สร้างทั้งโปรเจ็กต์ เนื้อหาของไฟล์ 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 หลายไฟล์ที่มีหลายเป้าหมายจะทำให้บิลด์เพิ่มขึ้น ที่ละเอียดขึ้น ซึ่งทำให้:

  • ได้งานสร้างของโปรเจ็กต์เพิ่มขึ้น
  • เพิ่มการดำเนินการพร้อมกันของบิลด์
  • ความสามารถในการบำรุงรักษาบิลด์สำหรับผู้ใช้ในอนาคตได้ดีขึ้น และ
  • ควบคุมการมองเห็นเป้าหมายระหว่างแพ็กเกจได้ ซึ่งจะป้องกัน เช่น ไลบรารีที่มีรายละเอียดการใช้งานที่รั่วไหล API สาธารณะ

เคล็ดลับในการเพิ่มไฟล์ BUILD เพิ่มเติม

  • คุณสามารถเริ่มต้นด้วยการเพิ่มไฟล์ BUILD ลงในแพ็กเกจ Java แต่ละแพ็กเกจ เริ่มต้นด้วย Java แพ็กเกจที่มีทรัพยากร Dependency น้อยที่สุดและทำงานจนถึงแพ็กเกจนั้นๆ ที่มีทรัพยากร Dependency มากที่สุด
  • เมื่อเพิ่มไฟล์ BUILD รายการและระบุเป้าหมายแล้ว ให้เพิ่มเป้าหมายใหม่เหล่านี้ลงในไฟล์ deps ส่วนของเป้าหมายที่เกี่ยวข้อง โปรดทราบว่าglob() ไม่ข้ามขอบเขตของแพ็กเกจ ดังนั้นเมื่อจำนวนแพ็กเกจ การขยายไฟล์ที่ตรงกันโดย glob() จะลดขนาดลง
  • ทุกครั้งที่คุณเพิ่มไฟล์ BUILD ในไดเรกทอรี main โปรดตรวจสอบว่าคุณได้เพิ่ม BUILD ไปยังไดเรกทอรี test ที่ตรงกัน
  • ตรวจสอบการจำกัดระดับการเข้าถึงระหว่างแพ็กเกจอย่างเหมาะสม
  • หากต้องการให้แก้ปัญหาข้อผิดพลาดในการตั้งค่าไฟล์ BUILD รายการได้ง่ายขึ้น โปรด ที่โปรเจ็กต์จะสร้างขึ้นต่อไปด้วย Bazel เมื่อคุณเพิ่มไฟล์บิลด์แต่ละรายการ เรียกใช้ bazel build //... เพื่อให้แน่ใจว่าเป้าหมายทั้งหมดยังคงสร้างได้

4. สร้างโดยใช้ Bazel

คุณได้ดำเนินการสร้างโดยใช้ Bazel โดยการเพิ่มไฟล์ BUILD ไฟล์เพื่อตรวจสอบการตั้งค่า ของบิลด์

เมื่อมีไฟล์ BUILD ตามรายละเอียดที่ต้องการ คุณสามารถใช้ Bazel เพื่อ จะผลิตงานสร้างทั้งหมดของคุณขึ้นมา