Di chuyển từ Xcode sang Bazel

Báo cáo vấn đề Xem nguồn Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Trang này mô tả cách tạo hoặc kiểm thử một dự án Xcode bằng Bazel. Tài liệu này mô tả sự khác biệt giữa Xcode và Bazel, đồng thời cung cấp các bước để chuyển đổi một dự án Xcode thành một dự án Bazel. Trang này cũng cung cấp các giải pháp khắc phục sự cố để giải quyết các lỗi thường gặp.

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

  • Bazel yêu cầu bạn chỉ định rõ ràng mọi mục tiêu bản dựng và các phần phụ thuộc của mục tiêu đó, cùng với các chế độ cài đặt bản dựng tương ứng thông qua các quy tắc bản dựng.

  • Bazel yêu cầu tất cả các tệp mà dự án phụ thuộc phải có trong thư mục không gian làm việc hoặc được chỉ định làm phần phụ thuộc trong tệp MODULE.bazel.

  • Khi tạo các dự án Xcode bằng Bazel, (các) tệp BUILD sẽ trở thành nguồn dữ liệu đáng tin cậy. Nếu làm việc trên dự án trong Xcode, bạn phải tạo một phiên bản mới của dự án Xcode khớp với các tệp BUILD bằng rules_xcodeproj bất cứ khi nào bạn cập nhật các tệp BUILD. Một số thay đổi đối với tệp BUILD (chẳng hạn như thêm các phần phụ thuộc vào một mục tiêu) không yêu cầu tạo lại dự án, điều này có thể giúp tăng tốc quá trình phát triển. Nếu không dùng Xcode, các lệnh bazel buildbazel test sẽ cung cấp khả năng tạo và kiểm thử với một số hạn chế được mô tả sau trong hướng dẫn này.

Trước khi bắt đầu

Trước khi bắt đầu, hãy làm như sau:

  1. Cài đặt Bazel nếu bạn chưa cài đặt.

  2. Nếu bạn chưa quen với Bazel và các khái niệm của Bazel, hãy hoàn thành hướng dẫn về ứng dụng iOS. Bạn nên hiểu rõ không gian làm việc Bazel, bao gồm cả các tệp MODULE.bazelBUILD, cũng như các khái niệm về mục tiêu, quy tắc xây dựng và gói Bazel.

  3. Phân tích và tìm hiểu các phần phụ thuộc của dự án.

Phân tích các phần phụ thuộc của dự án

Không giống như Xcode, Bazel yêu cầu bạn khai báo rõ ràng tất cả các phần phụ thuộc cho mọi mục tiêu trong tệp BUILD.

Để biết thêm thông tin về các phần phụ thuộc bên ngoài, hãy xem bài viết Làm việc với các phần phụ thuộc bên ngoài.

Tạo hoặc kiểm thử một dự án Xcode bằng Bazel

Để tạo hoặc kiểm thử một dự án Xcode bằng Bazel, hãy làm như sau:

  1. Tạo tệp MODULE.bazel

  2. (Thử nghiệm) Tích hợp các phần phụ thuộc SwiftPM

  3. Tạo tệp BUILD:

    a. Thêm mục tiêu ứng dụng

    b. (Không bắt buộc) Thêm(các) mục tiêu kiểm thử

    c. Thêm(các) mục tiêu thư viện

  4. (Không bắt buộc) Phân chia bản dựng thành các phần nhỏ

  5. Chạy bản dựng

  6. Tạo dự án Xcode bằng rules_xcodeproj

Bước 1: Tạo tệp MODULE.bazel

Tạo tệp MODULE.bazel trong một thư mục mới. Thư mục này sẽ trở thành thư mục gốc của không gian làm việc Bazel. Nếu dự án không sử dụng phần phụ thuộc bên ngoài, thì tệp này có thể trống. Nếu dự án phụ thuộc vào các tệp hoặc gói không có trong một trong 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 tệp MODULE.bazel.

Bước 2: (Thử nghiệm) Tích hợp các phần phụ thuộc SwiftPM

Để tích hợp các phần phụ thuộc SwiftPM vào không gian làm việc Bazel bằng swift_bazel, bạn phải chuyển đổi các phần phụ thuộc đó thành các gói Bazel như mô tả trong hướng dẫn sau.

Bước 3: Tạo tệp BUILD

Sau khi xác định không gian làm việc và các phần phụ thuộc bên ngoài, bạn cần tạo một tệp BUILD cho Bazel biết cấu trúc của dự án. Tạo tệp BUILD ở gốc của không gian làm việc Bazel và định cấu hình tệp này để thực hiện bản dựng ban đầu của dự án như sau:

Lưu ý: Để tìm hiểu thêm về các gói và khái niệm khác của Bazel, hãy xem phần Không gian làm việc, gói và mục tiêu.

Bước 3a: Thêm mục tiêu ứng dụng

Thêm macos_application hoặc mục tiêu quy tắc ios_application. Mục tiêu này sẽ tạo một gói ứng dụng macOS hoặc iOS tương ứng. Trong mục tiêu, hãy chỉ định tối thiểu những mục sau:

  • bundle_id – mã nhận dạng gói (đường dẫn DNS ngược theo sau là tên ứng dụng) của tệp nhị phân.

  • provisioning_profile – hồ sơ cung cấp từ Tài khoản nhà phát triển Apple của bạn (nếu tạo bản dựng cho thiết bị iOS).

  • families (chỉ dành cho iOS) – có tạo ứng dụng cho iPhone, iPad hay cả hai.

  • infoplists – danh sách các tệp .plist cần hợp nhất vào tệp Info.plist cuối cùng.

  • minimum_os_version – phiên bản macOS hoặc iOS tối thiểu mà ứng dụng hỗ trợ. Điều này đảm bảo Bazel tạo ứng dụng với cấp độ API chính xác.

Bước 3b: (Không bắt buộc) Thêm(các) mục tiêu kiểm thử

Các quy tắc bản dựng của Apple của Bazel hỗ trợ chạy các bài kiểm thử đơn vị và giao diện người dùng trên tất cả các nền tảng của Apple. Thêm mục tiêu kiểm thử như sau:

  • macos_unit_test để chạy các kiểm thử đơn vị dựa trên thư viện và dựa trên ứng dụng trên macOS.

  • ios_unit_test để tạo và chạy các kiểm thử đơn vị dựa trên thư viện trên iOS.

  • ios_ui_test để tạo và chạy các kiểm thử giao diện người dùng trong trình mô phỏng iOS.

  • Các quy tắc kiểm thử tương tự cũng tồn tại cho tvOS, watchOSvisionOS.

Ít nhất, hãy chỉ định một giá trị cho thuộc tính minimum_os_version. Mặc dù các thuộc tính đóng gói khác, chẳng hạn như bundle_identifierinfoplists, mặc định là các giá trị thường dùng nhất, hãy đảm bảo rằng các giá trị mặc định đó tương thích với dự án và điều chỉnh chúng nếu cần. Đối với các kiểm thử yêu cầu trình mô phỏng iOS, hãy chỉ định tên mục tiêu ios_application làm giá trị của thuộc tính test_host.

Bước 3c: Thêm(các) mục tiêu thư viện

Thêm một đích objc_library cho mỗi thư viện Objective-C và một đích swift_library cho mỗi thư viện Swift mà ứng dụng và/hoặc các bài kiểm thử phụ thuộc vào.

Thêm các mục tiêu thư viện như sau:

  • Thêm các mục tiêu thư viện ứng dụng làm phần phụ thuộc vào các mục tiêu ứng dụng.

  • Thêm các mục tiêu thư viện kiểm thử làm phần phụ thuộc vào các mục tiêu kiểm thử.

  • Liệt kê các nguồn triển khai trong thuộc tính srcs.

  • Liệt kê các tiêu đề trong thuộc tính hdrs.

Bạn có thể duyệt xem các ví dụ hiện có cho nhiều loại ứng dụng ngay trong thư mục rules_apple examples. Ví dụ:

Để biết thêm thông tin về các quy tắc xây dựng, hãy xem Các quy tắc của Apple đối với Bazel.

Tại thời điểm này, bạn nên kiểm thử bản dựng:

bazel build //:<application_target>

Bước 4: (Không bắt buộc) Phân chia bản dựng

Nếu dự án lớn hoặc khi dự án phát triển, hãy cân nhắc việc chia dự án thành nhiều gói Bazel. Độ chi tiết cao hơn này mang lại:

  • Tăng mức độ gia tăng của các bản dựng,

  • Tăng khả năng song song hoá các tác vụ bản dựng,

  • Khả năng duy trì tốt hơn cho người dùng trong tương lai,

  • Kiểm soát tốt hơn khả năng hiển thị mã nguồn trên các mục tiêu và gói. Điều này giúp ngăn chặn các vấn đề như thư viện chứa thông tin chi tiết về việc triển khai bị rò rỉ vào các API công khai.

Mẹo để chia nhỏ dự án:

  • Đặt mỗi thư viện vào một gói Bazel riêng. Bắt đầu với những phần phụ thuộc ít nhất và từng bước xây dựng cây phần phụ thuộc.

  • 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 thuộc tính deps của những mục tiêu phụ thuộc vào chúng.

  • Hàm glob() không vượt quá ranh giới gói, vì vậy, khi số lượng gói tăng lên, các tệp do glob() so khớp sẽ giảm xuống.

  • Khi thêm tệp BUILD vào thư mục main, hãy thêm tệp BUILD vào thư mục test tương ứng.

  • Thực thi các giới hạn về chế độ hiển thị lành mạnh trên các gói.

  • Xây dựng dự án sau mỗi thay đổi lớn đối với các tệp BUILD và khắc phục lỗi bản dựng khi bạn gặp phải.

Bước 5: Chạy bản dựng

Chạy bản dựng đã di chuyển hoàn toàn để đảm bảo bản dựng hoàn tất mà không có lỗi hoặc cảnh báo. Chạy riêng từng ứng dụng và mục tiêu kiểm thử để dễ dàng tìm thấy nguồn của mọi lỗi xảy ra.

Ví dụ:

bazel build //:my-target

Bước 6: Tạo dự án Xcode bằng rules_xcodeproj

Khi tạo bằng Bazel, các tệp MODULE.bazelBUILD sẽ trở thành nguồn thông tin đáng tin cậy về bản dựng. Để Xcode nhận biết được điều này, bạn phải tạo một dự án Xcode tương thích với Bazel bằng cách sử dụng rules_xcodeproj.

Khắc phục sự cố

Lỗi Bazel có thể xảy ra khi Bazel không đồng bộ hoá với phiên bản Xcode đã chọn, chẳng hạn như khi bạn áp dụng một bản cập nhật. Sau đây là một số việc bạn có thể thử nếu gặp lỗi với Xcode, chẳng hạn như "Bạn phải chỉ định phiên bản Xcode để sử dụng Apple CROSSTOOL".

  • Chạy Xcode theo cách thủ công và chấp nhận mọi điều khoản và điều kiện.

  • Sử dụng Xcode select để cho biết phiên bản chính xác, chấp nhận giấy phép và xoá trạng thái của Bazel.

  sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
  sudo xcodebuild -license
  bazel sync --configure
  • Nếu cách này không hiệu quả, bạn cũng có thể thử chạy bazel clean --expunge.