Ở bài viết trước mình đã nói về cách tích hợp Firebase hay cụ thể hơn là Firebase Crashlytics bằng cách thêm bazel depedency vào WORKSPACE rồi. Tuy nhiên Firebase là mình sử dụng framework đã được build sẵn. Lần này thì khác là mình tích hợp thư viện vào mà nó chưa được build sẵn.
Để bắt đầu mình sẽ sử dụng demo ở bài trước: https://github.com/vikage/DemoBazel/tree/firebase
1. Kéo thư viện về
Nếu dùng Cocoapods, Carthage, SPM thì quá đơn giản rồi 🤣. Khi dùng bazel thì có 1 số tools giúp tích hợp thư viện hỗ trợ Cocoapods vào tuy nhiên mình thấy không ổn định và bị lỗi. Vì vậy cách mình đưa ra là sử dụng git submodule để kéo source của thư viện về git repo của chúng ta và tự viết BUILD bằng cơm thì tốt hơn.
Giả sử mình muốn thêm thư viện Alamofire tại: https://github.com/Alamofire/Alamofire
Đầu tiên mình sẽ tạo thư mục cho package Alamofire trong thư mục Thirdparty
mkdir -p Thirdparty/Alamofire
Tiếp theo thì add submodule Alamofire vào git repo
git submodule add https://github.com/Alamofire/Alamofire Thirdparty/Alamofire/Sources
Cuối cùng thì cần cd tới Thirdparty/Alamofire/Sources và checkout tới bản release chúng ta mong muốn. Ví dụ ở đây mình muốn dùng bản 5.6.0
cd Thirdparty/Alamofire/Sources
git checkout 5.6.0
2. Viết build target
Đầu tiên chúng ta cần phải xem Podspec của Alamofire xem họ cần compile những file nào. Rồi dựa vào đó chúng ta viết build target cho Alamofire thôi.
Từ Podspec thì mình thấy Alamofire chỉ build source tại Source/*.swift. Tức là tất cả file swift trong thư mục Source
Mình tiến hành tạo file BUILD trong thư mục Thirdparty/Alamofire và viết nội dung như sau.
Giải thích kĩ 1 chút thì:
- Dòng 1 là load rule swift_library tại đường dẫn swift:swift.bzl của depedency build_bazel_rules_swift(rule_swift).
- Dòng 3 là gọi rule swift_library và truyền vào các thông số cần thiết như name(bắt buộc cho tất cả các rules), srcs, module_name và visibility(Để thể hiện là Alamofire có thể truy cập từ bên ngoài hay là đóng – private, ở đây là được public có thể truy cập từ các package bên ngoài).
3. Build thử
bazel build //Thirdparty/Alamofire:Alamofire
hoặc
bazel build //Thirdparty/Alamofire
Cả 2 lệnh trên đều sử dụng được. Vì tên build target là Alamofire trùng với tên package nên có thể bỏ đi 😎
4. Config depedency
Giờ thì chỉ việc sử dụng thôi. Gắn nó vào deps của các build target khác là xong. Ví dụ mình gắn vào App_Classes
5. Tổng kết
Quá ez phải không nào. Tuy nhiên đó mới là thư viện swift thôi. Còn thư viện objective-c thì hơi đánh vật 1 chút. Cái đó mình sẽ nói trong bài tiếp.
Demo project tại đây nhé: https://github.com/vikage/DemoBazel/tree/swift-library