Di chuyển từ Maven sang Bazel

Báo cáo vấn đề Xem nguồn Hằng đêm · 7,3 · 7,2 · 7.1 · 7 · 6,5

Trang này mô tả cách di chuyển từ Maven sang Bazel, bao gồm cả điều kiện tiên quyết và các bước cài đặt. Công cụ này mô tả sự khác biệt giữa Maven và Bazel, đồng thời cung cấp một ví dụ về di chuyển bằng cách sử dụng dự án Guava.

Khi di chuyển từ bất kỳ công cụ xây dựng nào sang Bazel, tốt nhất bạn nên có cả hai công cụ xây dựng chạy song song cho đến khi bạn đã di chuyển hoàn toàn nhóm phát triển, CI hệ thống và bất kỳ hệ thống nào khác có liên quan. Bạn có thể chạy Maven và Bazel trong cùng một cách kho lưu trữ.

Trước khi bắt đầu

  • Cài đặt Bazel nếu bạn chưa cài đặt Bazel này.
  • Nếu bạn mới sử dụng Bazel, hãy xem hướng dẫn Giới thiệu về Bazel: Tạo Java trước khi bắt đầu di chuyển. Hướng dẫn này sẽ giải thích Khái niệm, cấu trúc và cú pháp nhãn của Bazel.

Sự khác biệt giữa Maven và Bazel

  • Maven sử dụng(các) tệp pom.xml cấp cao nhất. Bazel hỗ trợ nhiều tệp bản dựng và nhiều mục tiêu cho mỗi tệp BUILD, cho phép các bản dựng tăng dần hơn Maven.
  • Maven sẽ chịu trách nhiệm về các bước trong quy trình triển khai. Bazel thì không tự động hoá việc triển khai.
  • Bazel cho phép bạn biểu thị phần phụ thuộc giữa các ngôn ngữ.
  • Khi thêm các phần mới vào dự án, có thể bạn sẽ phải thêm các phần mới với Bazel BUILD tệp. Phương pháp hay nhất là thêm tệp BUILD vào mỗi mã Java mới .

Di chuyển từ Maven sang Bazel

Dưới đây là các bước mô tả cách di chuyển dự án của bạn sang Bazel:

  1. Tạo tệp MODULE.bazel
  2. Tạo một tệp BUILD
  3. Tạo thêm tệp BUILD
  4. Tạo bản dựng bằng Bazel

Các ví dụ dưới đây là về quá trình di chuyển Guava dự án từ Maven sang Bazel. Chiến lược phát hành đĩa đơn Dự án Guava được sử dụng là bản phát hành v31.1. Các ví dụ sử dụng Guava không đi bộ qua từng bước trong quá trình di chuyển, nhưng các công cụ này cho thấy các tệp và nội dung được tạo hoặc thêm theo cách thủ công cho quá trình di chuyển.

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

1. Tạo tệp MODULE.bazel

Tạo một tệp có tên MODULE.bazel ở gốc của dự án. Nếu dự án của bạn không có phần phụ thuộc bên ngoài, tệp này có thể trống.

Nếu dự án của bạn phụ thuộc vào các tệp hoặc gói không nằm trong một các thư mục của dự án, hãy chỉ định các phần phụ thuộc bên ngoài này trong MODULE.bazel . Bạn có thể sử dụng rules_jvm_external để quản lý các phần phụ thuộc trên Maven. Cho hướng dẫn về cách sử dụng bộ quy tắc này, hãy xem README của Google.

Ví dụ về dự án Guava: phần phụ thuộc bên ngoài

Bạn có thể liệt kê các phần phụ thuộc bên ngoài của Guava dự án bằng tính năng rules_jvm_external bộ quy tắc.

Thêm đoạn mã sau vào tệp 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. Tạo một tệp BUILD

Giờ đây, bạn đã xác định không gian làm việc và các phần phụ thuộc bên ngoài (nếu thích hợp) được liệt kê, bạn cần tạo BUILD tệp để mô tả cách dự án cần tạo. Không giống như Maven có một tệp pom.xml, Bazel có thể sử dụng nhiều tệp BUILD để tạo một dự án. Các tệp này chỉ định nhiều bản dựng mục tiêu để cho phép Bazel tạo các bản dựng gia tăng.

Thêm tệp BUILD theo các giai đoạn. Hãy bắt đầu bằng cách thêm một tệp BUILD vào thư mục gốc của dự án của bạn và sử dụng dự án đó để tạo bản dựng ban đầu bằng Bazel. Sau đó, bạn tinh chỉnh bản dựng của mình bằng cách thêm các tệp BUILD khác có mục tiêu chi tiết hơn.

  1. Trong cùng thư mục với tệp MODULE.bazel, hãy tạo một tệp văn bản và đặt tên nó là BUILD.

  2. Trong tệp BUILD này, hãy sử dụng quy tắc thích hợp để tạo một mục tiêu nhằm xây dựng dự án của bạn. Dưới đây là một số mẹo:

    • Sử dụng quy tắc phù hợp:

      • Để tạo dự án bằng một mô-đun Maven duy nhất, hãy sử dụng Quy tắc java_library như sau:

        java_library(
           name = "everything",
           srcs = glob(["src/main/java/**/*.java"]),
           resources = glob(["src/main/resources/**"]),
           deps = ["//:all-external-targets"],
        )
        
      • Để tạo dự án có nhiều mô-đun Maven, hãy sử dụng Quy tắc java_library như sau:

        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"],
        )
        
      • Để tạo tệp nhị phân, hãy sử dụng quy tắc 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"
        )
        
      • Chỉ định các thuộc tính:

        • name: Đặt một cái tên có ý nghĩa cho mục tiêu. Trong các ví dụ ở trên, mục tiêu được gọi là "mọi thứ".
        • srcs: Sử dụng hiệu ứng hình cầu để liệt kê tất cả tệp .java trong dự án của bạn.
        • resources: Sử dụng hiệu ứng toàn cầu để liệt kê tất cả tài nguyên trong dự án của bạn.
        • deps: Bạn cần xác định những phần phụ thuộc bên ngoài nào dự án của bạn.
      • Hãy xem ví dụ bên dưới về XÂY DỰNG cấp cao nhất này từ quá trình di chuyển dự án Guava.

  3. Bây giờ, bạn đã có tệp BUILD ở gốc dự án, hãy tạo dự án để đảm bảo nó hoạt động. Trên dòng lệnh, từ không gian làm việc của bạn hãy sử dụng bazel build //:everything để tạo dự án bằng Bazel.

    Dự án hiện đã được xây dựng thành công bằng Bazel. Bạn sẽ cần phải thêm các tệp BUILD khác để cho phép các bản dựng tăng dần của dự án.

Ví dụ về dự án Guava: bắt đầu bằng một tệp BUILD

Khi di chuyển dự án Guava sang Bazel, ban đầu, một tệp BUILD được dùng để tạo toàn bộ dự án. Đây là nội dung của tệp BUILD ban đầu này trong thư mục workspace:

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. Tạo thêm tệp BUILD (không bắt buộc)

Bazel chỉ hoạt động với một BUILD file, như bạn đã thấy sau khi hoàn thành bản dựng đầu tiên. Bạn vẫn nên cân nhắc chia bản dựng thành các phần nhỏ hơn bằng cách thêm các tệp BUILD khác có mục tiêu chi tiết.

Nếu bạn có nhiều tệp BUILD với nhiều mục tiêu, bản dựng sẽ tăng lên độ chi tiết, cho phép:

  • gia tăng các bản dựng gia tăng của dự án,
  • tăng cường thực thi song song bản dựng,
  • giúp tăng khả năng bảo trì bản dựng cho người dùng trong tương lai, và
  • kiểm soát chế độ hiển thị mục tiêu giữa các gói, điều này có thể ngăn chặn chẳng hạn như thư viện chứa thông tin triển khai chi tiết bị rò rỉ vào các API công khai.

Mẹo để thêm các tệp BUILD khác:

  • Bạn có thể bắt đầu bằng cách thêm một tệp BUILD vào mỗi gói Java. Bắt đầu bằng Java các gói có ít phần phụ thuộc nhất và cố gắng đưa ra các gói có nhiều phần phụ thuộc nhất.
  • Khi bạn thêm tệp BUILD và chỉ định mục tiêu, hãy thêm các mục tiêu mới này vào deps phần của mục tiêu phụ thuộc vào các tuỳ chọn này. Xin lưu ý rằng glob() không vượt qua ranh giới gói, do đó, số lượng gói thì các tệp phù hợp với glob() sẽ thu nhỏ.
  • Mỗi khi thêm một tệp BUILD vào thư mục main, hãy đảm bảo rằng bạn thêm một BUILD vào thư mục test tương ứng.
  • Cẩn thận giới hạn mức độ hiển thị giữa các gói một cách hợp lý.
  • Để đơn giản hoá việc khắc phục lỗi trong quá trình thiết lập tệp BUILD, hãy đảm bảo mà dự án sẽ tiếp tục xây dựng bằng Bazel khi bạn thêm từng tệp bản dựng. Hãy chạy bazel build //... để đảm bảo tất cả mục tiêu của bạn vẫn đang tạo.

4. Tạo ứng dụng bằng Bazel

Bạn đã xây dựng bằng Bazel khi thêm các tệp BUILD để xác thực chế độ thiết lập của bản dựng.

Khi có BUILD tệp ở độ chi tiết mong muốn, bạn có thể sử dụng Bazel để tạo tất cả các bản dựng của mình.