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

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

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

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

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

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

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

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

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

  1. สร้างไฟล์ WORKSPACE
  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. สร้างไฟล์ WORKSPACE

สร้างไฟล์ชื่อ WORKSPACE ที่รูทของโปรเจ็กต์ หากโปรเจ็กต์ของคุณ ไม่มีทรัพยากร Dependency ภายนอก ไฟล์พื้นที่ทำงานอาจว่างเปล่า

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

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

คุณสามารถระบุรายการทรัพยากร Dependency ภายนอกของ โปรเจ็กต์ 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 ไฟล์เดียว

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

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

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

  3. ตอนนี้คุณมีไฟล์ BUILD ที่รูทของโปรเจ็กต์แล้ว ให้สร้าง เพื่อให้แน่ใจว่าทุกอย่างทำงานได้ ในบรรทัดคำสั่งจาก ของ Google Workspace ให้ใช้ 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",
    ]),
    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 ได้ ในการผลิตงานสร้างทั้งหมดของคุณ