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.
WORKSPACE.bazel hay WORKSPACE trong bazel đều là 1.
![](https://codetoanbug.com/wp-content/uploads/2021/08/Screen-Shot-2021-08-15-at-12.12.01.png)
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.
![](https://codetoanbug.com/wp-content/uploads/2021/08/Screen-Shot-2021-08-15-at-12.21.17.png)
Ví dụ về cách tổ chức 1 package của Telegram-iOS:
![](https://codetoanbug.com/wp-content/uploads/2021/08/Screen-Shot-2021-08-15-at-12.22.32-1024x274.png)
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",
)