Migrating iOS Project to Bazel – Part 7 – Tích hợp Swift Third party library

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.

Alamofire.podspec

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.

Alamofire BUILD

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_namevisibility(Để 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 😎

Vậy là xong rồi. Quá ez phải không

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

Dòng 14 nhé

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

Leave a Reply