Bazel 4.1.0: Bài 2 – khái niệm và thuật ngữ

546

Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh

Workspace, packages và targets

Workspace

Workspace là file để giúp bazel hiểu các thành phần source code để build ứng dụng của bạn. Nó là text file và có tên là WORKSPACE, nó có thể rỗng hoặc chứa các phụ thuộc bên ngoài để build ứng dụng.

  Bazel 4.1.0: Bài 1 – Cài đặt bazel 4.1.0
  "Làm PM, theo anh không cần biết về code, nhưng phải hiểu về SQL, database, những khái niệm cơ bản của code"

WORKSPACE.bazel hay WORKSPACE trong bazel đều là 1.

ví dụ về WORKSPACE của telegram. File này nằm ở thư mục root của source code.

Repositories

Cách tổ chức source code gọi là repositories. Thư mục có chứa file WORKSPACE gọi là thư mục chính, đặt tên là @. Các repositories bên ngoài định nghĩa trong WORKSPACE theo workspace rules. Các quy tắc xem ở đây.

Các repositories bên ngoài cũng có WORKSPACE. Tuy nhiên Bazel sẽ bỏ qua chúng.

Packages

Đơn vị tổ chức source code bằng repository gọi là package. Một package là cách tổ chức các files liên quan tới nhau và phụ thuộc giữa chúng.

Một package được định nghĩa trong 1 thư mục và chứa file BUILD hay BUILD.bazel, nằm bên trong thư mục root chứa file WORKSPACE. Chúng ta hiểu nôm na là các submodule cũng được.

Các package của Telegram-iOS

Ví dụ về cách tổ chức 1 package của Telegram-iOS:

Targets

Một package thì gọi là 1 nơi chứa source code. Còn các thành phần của 1 package thì gọi là target. Các target được quy định qua file và quy tắc của nó. Group target được định nghĩa ở đây.

Các package group được định nghĩa bởi package_group.

Labels

Tên của 1 target gọi là label. Tên điển hình có dạng như sau:

@myrepo//my/app/main:app_binary

Label @myrepo  thường được viết như sau:

//my/app/main:app_binary

Package names, //package-name:...

Tên của package được định nghĩa ở BUILD file của nó.

Rules

Rules là quy tắc giữa input và output, và các bước để build ra outputs. Mọi rule đều có 1 tên định nghĩa qua attribute name. Ví dụ:

swift_library(
    name = "AccountContext",
    module_name = "AccountContext",
    srcs = glob([
        "Sources/**/*.swift",
    ]),

BUILD files

Là tập hợp các quy tắc mà chúng ta đã mô tả qua packages, targets và labels ở trên. Mỗi package chứa 1 BUILD file là 1 chương trình nhỏ.

Loading an extension

Bazel sử dụng các file kết thúc bằng .bzl để load các extension:

load("//foo/bar:file.bzl", "some_library")

Nó sẽ load thư viện some_library bên ngoài và đưa vào chương trình.

Kiểu của build rule

Tùy ngôn ngữ mà sẽ có từng type khác nhau, ví dụ cc_binary, cc_library và cc_test là rule của C++.

Dependencies

Một target A phụ thuộc 1 target B thì cần 1 quy tắc để mô tả nó, gọi là dependency graph. Nếu B sử dụng code trong C nữa thì khi đó A sẽ có ràng buộc trong BUILD file như sau:

rule(
    name = "a",
    srcs = "a.in",
    deps = "//b:b",
)

B có build file như sau:

rule(
    name = "b",
    srcs = "b.in",
    deps = "//c:c",
)
a_b_c.svgbiểu đồ phụ thuộc nhau
Danh mục
Có thể bạn quan tâm: