Trang này mô tả cách tạo hoặc kiểm thử dự án Xcode bằng Bazel. Trang 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 dự án Xcode thành 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 phải chỉ định rõ ràng mọi mục tiêu xây 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 xây 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à các tệp nhập trong tệp
WORKSPACE.Khi tạo các dự án Xcode bằng Bazel, (các) tệp
BUILDsẽ trở thành nguồn thông tin chính xác. Nếu bạn 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ệpBUILDbằng Tulsi bất cứ khi nào bạn cập nhật các tệpBUILD. Nếu bạn không sử dụng Xcode, các lệnhbazel buildvàbazel testsẽ cung cấp các chức năng xây dựng và kiểm thử với một số hạn chế được mô tả sau trong hướng dẫn này.Do sự khác biệt trong các lược đồ cấu hình bản dựng, chẳng hạn như bố cục thư mục hoặc cờ bản dựng, Xcode có thể không nhận biết đầy đủ về "bức tranh tổng thể" của bản dựng và do đó, một số tính năng của Xcode có thể không hoạt động. Cụ thể:
Tuỳ thuộc vào các mục tiêu mà bạn chọn để chuyển đổi trong Tulsi, Xcode có thể không lập chỉ mục đúng cách cho nguồn dự án. Điều này ảnh hưởng đến tính năng hoàn thành mã và điều hướng trong Xcode, vì Xcode sẽ không thể thấy tất cả mã nguồn của dự án.
Tính năng phân tích tĩnh, trình dọn dẹp địa chỉ và trình dọn dẹp luồng có thể không hoạt động, vì Bazel không tạo ra các kết quả đầu ra mà Xcode mong đợi cho các tính năng đó.
Nếu bạn tạo một dự án Xcode bằng Tulsi và sử dụng dự án đó để chạy các bài kiểm thử trong Xcode, thì Xcode sẽ chạy các bài kiểm thử thay vì Bazel. Để chạy các bài kiểm thử bằng Bazel, hãy chạy lệnh
bazel testtheo cách thủ công.
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 cài đặt.
Nếu bạn chưa quen với Bazel và các khái niệm của Bazel, hãy hoàn tất hướng dẫn về ứng dụng iOS). Bạn cần hiểu không gian làm việc của Bazel, bao gồm các tệp
WORKSPACEvà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à 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 phải 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ử dự án Xcode bằng Bazel
Để tạo hoặc kiểm thử dự án Xcode bằng Bazel, hãy làm như sau:
Bước 1: Tạo tệp WORKSPACE
Tạo tệp WORKSPACE 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 nào, 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 WORKSPACE.
Bước 2: (Thử nghiệm) Tích hợp các phần phụ thuộc CocoaPods
Để tích hợp các phần phụ thuộc CocoaPods vào không gian làm việc 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 bài viết Chuyển đổi các phần phụ thuộc CocoaPods.
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 tệp BUILD cho Bazel biết cấu trúc của dự án. Tạo tệp BUILD ở thư mục gốc của không gian làm việc Bazel và định cấu hình tệp đó để 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 kiểm thử
- Bước 3c: Thêm(các) mục tiêu thư viện
Lưu ý: Để tìm hiểu thêm về các gói và các khái niệm khác của Bazel, hãy xem bài viết 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ục tiêu quy tắc macos_application
hoặ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 nội dung 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 (nếu tạo cho thiết bị iOS).families(chỉ dành cho iOS) – có tạo ứng dụng cho iPhone, iPad hay cả hai hay không.infoplists– danh sách các tệp .plist để 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ác 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 xây dựng Apple của Bazel hỗ trợ chạy các bài kiểm thử đơn vị dựa trên thư viện trên iOS và macOS, cũng như các bài kiểm thử dựa trên ứng dụng trên macOS. Đối với các bài kiểm thử dựa trên ứng dụng trên iOS hoặc các bài kiểm thử giao diện người dùng trên một trong hai nền tảng, Bazel sẽ tạo các kết quả đầu ra kiểm thử nhưng các bài kiểm thử phải chạy trong Xcode thông qua một dự án được tạo bằng Tulsi. 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à dựa trên ứng dụng trên macOS.ios_unit_testđể chạy các bài kiểm thử đơn vị dựa trên thư viện trên iOS. Đối với các bài kiểm thử yêu cầu trình mô phỏng iOS, Bazel sẽ tạo các kết quả đầu ra kiểm thử nhưng không chạy các bài kiểm thử. Bạn phải tạo một dự án Xcode bằng Tulsi và chạy các bài kiểm thử trong Xcode.ios_ui_testđể tạo các kết quả đầu ra cần thiết để chạy các bài kiểm thử giao diện người dùng trong trình mô phỏng iOS bằng Xcode. Bạn phải tạo một dự án Xcode bằng Tulsi và chạy các bài kiểm thử trong Xcode. Bazel không thể chạy các bài kiểm thử giao diện người dùng một cách tự nhiên.
Tối thiểu, 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_identifier và infoplists, mặc định là các giá trị được sử dụng phổ biến 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 các giá trị đó nếu cần. Đối với các bài 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 objc_library
mục tiêu cho mỗi thư viện Objective C và swift_library
mục tiêu 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 các 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 các 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.
Để biết thêm thông tin về các quy tắc xây dựng, hãy xem bài viết Quy tắc của Apple cho 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) Chia 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 việc chia dự án thành nhiều gói Bazel. Việc chia nhỏ này sẽ giúp:
Tăng tính gia tăng của các bản dựng,
Tăng khả năng song song hoá các tác vụ xây dựng,
Tăng khả năng bảo trì 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 gói Bazel riêng. Bắt đầu với những thư viện yêu cầu ít phần phụ thuộc nhất và từng bước phát triển cây phần phụ thuộc.
Khi bạn thêm các tệp
BUILDvà chỉ định các mục tiêu, hãy thêm các mục tiêu mới này vào các thuộc tínhdepscủa các mục tiêu phụ thuộc vào các mục tiêu mới này.Hàm
glob()không vượt qua ranh giới gói, vì vậy, khi số lượng gói tăng lên, các tệp khớp vớiglob()sẽ giảm.Khi thêm tệp
BUILDvào thư mụcmain, hãy thêm tệpBUILDvào thư mụctesttương ứng.Thi hành các giới hạn 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
BUILDvà khắc phục các lỗi xây 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 gốc của mọi lỗi xảy ra.
Ví dụ:
bazel build //:my-targetBước 6: Tạo dự án Xcode bằng Tulsi
Khi tạo bằng Bazel, các tệp WORKSPACE và BUILD sẽ trở thành nguồn thông tin chính xác 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 Tulsi.
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 bản cập nhật. Dưới đâ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/Developersudo xcodebuild -licensebazel 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.