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 phương thức 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 tạo cả hai chạy song song cho đến khi bạn đã di chuyển hoàn toàn nhóm phát triển của mình, hệ thống CI 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 kho lưu trữ.

Trước khi bắt đầu

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 bản dựng tệp và nhiều mục tiêu cho mỗi tệp BUILD, cho phép các bản dựng có mức độ gia tăng cao hơn Maven.
  • Maven sẽ chịu trách nhiệm về các bước trong quy trình triển khai. Bazel có 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 gói 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 WORKSPACE
  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

Ví dụ dưới đây là về quá trình di chuyển Dự án Guava từ Maven đến Bazel. 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 được hướng dẫn từng bước trong quá trình di chuyển, nhưng chúng sẽ cho thấy các tệp và nội dung được tạo hoặc thêm theo cách thủ công để di chuyển.

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

1. Tạo tệp WORKSPACE

Tạo một tệp có tên WORKSPACE ở 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, nên tệp không gian làm việc 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 không gian làm việc . Cách tự động hoá việc liệt kê các phần phụ thuộc bên ngoài cho tệp không gian làm việc: sử dụng rules_jvm_external. Để biết hướng dẫn về cách sử dụng bộ quy tắc này, hãy xem README.

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 Dự án Guava với rules_jvm_external bộ quy tắc.

Thêm đoạn mã sau vào tệp 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. 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ủa mình cần được tạo. Không giống như Maven chỉ có một tệp pom.xml, Bazel có thể sử dụng nhiều BUILD tệp để tạo dự án. Các tệp này chỉ định nhiều mục tiêu bản dựng, cho phép Bazel tạo các bản dựng tăng dần.

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

  1. Trong cùng thư mục với tệp WORKSPACE, hãy tạo một tệp văn bản và đặt tên tệp 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 cho tạo 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. Ví dụ: nếu bạn đã tạo danh sách các phần phụ thuộc bằng công cụ generate_workspace, các phần phụ thuộc cho java_library là các thư viện được liệt kê trong Macro generated_java_libraries.
    • Hãy xem ví dụ bên dưới tệp BUILD cấp cao nhất này từ 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 của bạn để đảm bảo nó hoạt động. Trên dòng lệnh, từ Workspace, hãy sử dụng bazel build //:everything để tạo với Bazel.

    Dự án hiện đã được xây dựng thành công bằng Bazel. Bạn sẽ cần để thêm các tệp BUILD khác nhằm 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 sẽ được sử dụng để xây dựng toàn bộ dự án. Đây là nội dung của BUILD ban đầu này trong thư mục không gian làm việc:

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. 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ước đầu tiên bản dựng. 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 Các gói Java có ít phần phụ thuộc nhất và giúp bạn tăng tốc cho 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 của gói, do đó số số gói tăng trưởng 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 nhớ thêm một tệp BUILD sang 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 dự án tiếp tục xây dựng cùng với Bazel khi bạn thêm mỗi 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.