Migrating iOS Project to Bazel – Part 1

Lâu lắm rồi mình mới viết lại blog, nay mình sẽ viết về quá trình tìm hiểu Bazel và quá trình migrate từ project xcode sang dùng bazel và những thứ mình gặp phải. Chủ đề này sẽ chia thành rất nhiều phần. Mong mọi người theo dõi từ đầu tới cuối.

Lưu ý một chút là project dùng bazel thì phải dùng kiến trúc modular. Còn project nào vẫn dùng kiến trúc nguyên khối thì muốn dùng thì phải migrate sang dạng modular trước.

Phần 1 này tập trung vào giới thiệu bazel, lịch sử hình thành và nó có gì khác trong quá trình sử dụng so với Xcode.

1. Bazel là gì

Bazel là một phần mềm open source của Google được viết bằng Java giúp chúng ta build và test dự án phần mềm. Tương tự như Make hay Maven, Bazel có thể build được Java, C/C++, Swift, Objective C, Go, …

Nó được tạo ra dựa trên một build system của Google có tên là Blaze. Nhờ pha hoán đổi chữ “l” thần thánh của Google mà Blaze biến thành Bazel 🤣

Bazel build source code từ tập hợp các rule. Các rule được viết bằng ngôn ngữ Starlark( lúc trước có tên là Skylark) – một ngôn ngữ được dựa trên Python. Rules sẽ định nghĩa source code sẽ được build như thế nào, dùng command nào để build.

  • Ưu điểm
    • Có thể build được nhiều ngôn ngữ
    • Build nhanh, nhất là những hệ thống lớn
    • Có remote cache build trên server để share với các developer.
    • Ngôn ngữ starlark mạnh có thể viết thêm rules hoặc support để compile một ngôn ngữ mà chưa được support.
  • Nhược điểm
    • Khó tiếp cận
    • Phức tạp
    • Cộng đồng nhỏ, có vấn đề gì thì khó search.
    • Một số rules có thể chưa support official, phải tự tìm nguồn khác hoặc tự viết rules.

2. Ngôn ngữ Starlark

Starlark là ngôn ngữ được sử dụng trong bazel để viết các compile rules. Nó sử dụng 1 phần syntax của python.

def fizz_buzz(n):
  """Print Fizz Buzz numbers from 1 to n."""
  for i in range(1, n + 1):
    s = ""
    if i % 3 == 0:
      s += "Fizz"
    if i % 5 == 0:
      s += "Buzz"
    print(s if s else i)

fizz_buzz(20)

Khi áp dụng bazel vào project thì bazel xuất hiện ở 2 chỗ là ở file BUILD và .bzl file. File BUILD chứa nội dung là những build target được hình thành bằng cách gọi các rules được viết trong file .bzl.

Ví dụ file BUILD

load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library")

swift_library(
    name = "app_classes",
    srcs = glob([
        "*.swift"
    ])
)

Trong trường hợp bình thường thì chúng ta chỉ cần tạo ra các file BUILD (các bài sau sẽ nói cụ thể) để khai báo các build rules được viết trong bzl file.

3. Bazel đang được sử dụng bởi những công ty nào

Như trên trang chủ thì có những công ty này đang dùng, tuy nhiên vẫn còn thiếu rất nhiều. Mình có thể kể ra tên 1 số công ty quen thuộc nữa như LINE, Grab, Telegram, Pinterest, Binance. Điều này chứng tỏ năng lực của Bazel lớn như thế nào.

4. Một số điểm khác biệt giữa Bazel và Xcode

  • Bazel yêu cầu bạn chỉ định rõ ràng các build target bằng file cấu hình và sự phụ thuộc giữa các build target.
  • Để thêm file vào project. Thì bạn phải khai báo trong các file cấu hình build target thay vì kéo thẳng vào Xcode.
  • Nếu muốn sử dụng Xcode để dùng code completion thì bạn phải dùng 1 công cụ tên Tulsi để gen ra Xcode project(Sẽ nói ở các phần sau).

Các phần sau mình sẽ giới thiệu kĩ hơn về Bazel và cách cấu hình một project demo sử dụng Bazel từ đầu.

Tham khảo thêm tại:
https://bazel.build/
https://docs.bazel.build/versions/main/migrate-xcode.html
https://docs.bazel.build/versions/main/skylark/language.html

Leave a Reply