Trang này mô tả cách tạo hoặc thử nghiệm dự án Xcode bằng Bazel. Nó 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 dự án Xcode thành dự án Bazel. Công cụ này cũng giú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à phần phụ thuộc, cùng với chế độ cài đặt bản dựng tương ứng thông qua quy tắc bản dựng.
Bazel yêu cầu phải có tất cả các tệp mà dự án phụ thuộc vào đó thư mục không gian làm việc hoặc được chỉ định làm phần phụ thuộc trong
MODULE.bazel
.Khi xây dựng dự án Xcode bằng Bazel, (các) tệp
BUILD
sẽ trở thành nguồn đá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ệpBUILD
sử dụng rules_xcodeproj mỗi khi bạn cập nhật các tệpBUILD
. Một số thay đổi đối với các tệpBUILD
chẳng hạn như thêm các phần phụ thuộc vào mục tiêu thì không cần phải tạo lại dự án có thể giúp đẩy nhanh quá trình phát triển. Nếu bạn không sử dụng Xcode, Các lệnhbazel build
vàbazel test
cung cấp chức năng tạo và kiểm thử với một số hạn chế nhất định được mô tả ở phần sau của hướng dẫn này.
Trước khi bắt đầu
Trước khi bắt đầu, hãy làm như sau:
Cài đặt Bazel nếu bạn chưa thực hiện việc này.
Nếu bạn chưa hiểu rõ về Bazel và các khái niệm của nó, hãy hoàn thành ứng dụng iOS hướng dẫn). Chắc hẳn bạn đã hiểu về không gian làm việc Bazel, bao gồm tệp
MODULE.bazel
vàBUILD
, 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.Phân tích và hiểu rõ 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 nội dung Làm việc với các phần phụ thuộc bên ngoài phần phụ thuộc.
Tạo hoặc thử nghiệm 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:
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 trở thành
Thư mục gốc 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, 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 thuộc 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 chúng thành các gói Bazel như được mô tả trong phần sau đây hướng dẫn của Google.
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 dự án. Tạo
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:
- Bước 3a: Thêm mục tiêu ứng dụng
- Bước 3b: (Không bắt buộc) Thêm(các) mục tiêu thử nghiệm
- Bước 3c: Thêm(các) mục tiêu thư viện
Mẹo: Để tìm hiểu thêm về gói và các khái niệm khác của Bazel, hãy xem 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 một
macos_application
hoặc
ios_application
mục tiêu của quy tắc. Mục tiêu này sẽ tạo gói ứng dụng macOS hoặc iOS tương ứng.
Trong mục tiêu, hãy xác định tối thiểu những thông tin sau:
bundle_id
– mã nhận dạng gói (đường dẫn ngược DNS theo sau là tên ứng dụng) của nhị phân.provisioning_profile
– hồ sơ cấp phép của Nhà phát triển Apple (nếu xây dựng cho thiết bị iOS).families
(chỉ iOS) - liệu có tạo ứng dụng cho iPhone, iPad, hoặc cả hai.infoplists
– danh sách các tệp .plist để hợp nhất thành 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 Google Maps hỗ trợ. Điều này đảm bảo rằng Bazel tạo ứng dụng bằng cấp độ API chính xác.
Bước 3b: (Không bắt buộc) Thêm(các) mục tiêu thử nghiệm
Bản dựng Apple của Bazel hỗ trợ chạy quy tắc trên tất cả các nền tảng của Apple. Thêm các mục tiêu kiểm thử như sau:
macos_unit_test
để chạy các bài kiểm thử đơn vị dựa trên thư viện và ứng dụng trên macOS.ios_unit_test
để tạo và chạy kiểm thử đơn vị dựa trên thư viện trên iOS.ios_ui_test
để tạo và chạy thử nghiệm giao diện người dùng trong trình mô phỏng iOS.Có các quy tắc kiểm thử tương tự cho tvOS, watchOS và visionOS.
Ở mức tối thiểu, hãy chỉ định một giá trị cho thuộc tính minimum_os_version
. Trong khi
các thuộc tính đóng gói khác, chẳng hạn như bundle_identifier
và infoplists
,
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 đó cũng tương thích
với dự án và điều chỉnh chúng nếu cần. Đối với các thử nghiệm yêu cầu iOS
trình mô phỏng, bạn cũng cần chỉ định tên mục tiêu ios_application
làm giá trị của lệnh
Thuộc tính test_host
.
Bước 3c: Thêm(các) mục tiêu thư viện
Thêm một mục tiêu objc_library
cho mỗi chiến dịch
Thư viện object-C và một
swift_library
nhắm mục tiêu cho mỗi thư viện Swift mà ứng dụng và/hoặc kiểm thử phụ thuộc.
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 dưới dạng phần phụ thuộc vào ứng dụng mục tiêu.
Thêm các mục tiêu thư viện kiểm thử dưới dạng phần phụ thuộc vào 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 qua các ví dụ hiện có cho nhiều loại ứng dụng ngay trong ví dụ về quy tắc_apple thư mục. Ví dụ:
Để biết thêm thông tin về quy tắc bản dựng, hãy xem 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) Thu nhỏ 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 chia nhỏ dự án thành nhiều Gói Bazel. Việc tăng độ chi tiết này mang lại:
Tăng mức độ gia tăng của các bản dựng,
Tăng song song các tác vụ tạo bản dựng,
Giúp người dùng trong tương lai có thể duy trì hoạt động hiệu quả hơn,
Kiểm soát tốt hơn chế độ hiển thị mã nguồn trên các mục tiêu và gói. Chiến dịch này ngăn chặn các sự cố như thư viện chứa thông tin triển khai bị rò rỉ vào các API công khai.
Mẹo chi tiết hoá dự án:
Đặt mỗi thư viện vào gói Bazel riêng. Bắt đầu với những người yêu cầu có ít phần phụ thuộc nhất và tìm cách 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ínhdeps
của các mục tiêu phụ thuộc vào các mục tiêu đó.Hàm
glob()
không vượt qua ranh giới gói, do đó số lượng Các gói phát triển các tệp phù hợp vớiglob()
sẽ thu nhỏ.Khi thêm một tệp
BUILD
vào thư mụcmain
, hãy thêm cả tệpBUILD
vào thư mụctest
tương ứng.Thực thi giới hạn mức độ hiển thị lành mạnh trên các gói.
Tạo dự án sau mỗi thay đổi lớn đối với các tệp
BUILD
và sửa bản dựng lỗi khi gặp phải.
Bước 5: Chạy bản dựng
Chạy bản dựng được di chuyển toàn bộ để đả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 từng ứng dụng và thử nghiệm mục tiêu riêng lẻ để tìm nguồn dễ dàng hơn bất kỳ lỗi nào 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ản dựng bằng Bazel, các tệp MODULE.bazel
và BUILD
sẽ trở thành nguồn
xác thực về bản dựng. Để Xcode biết về điều này, bạn phải tạo một
Dự án Xcode tương thích với Bazel đang sử dụng
rules_xcodeproj
của Google.
Khắc phục sự cố
Lỗi Bazel có thể phát sinh khi không đồng bộ hoá được 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 nên thử nếu bạn gặp phải lỗi với Xcode, ví dụ: "Phải chỉ định phiên bản Xcode thành hãy sử dụng CROSSTOOL của Apple".
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.
Hãy sử dụng lựa chọn Xcode để chỉ định 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
.