Các quy tắc Workspace dùng để lấy các phần phụ thuộc bên ngoài, thường là mã nguồn nằm bên ngoài kho lưu trữ chính.
Lưu ý: bên cạnh các quy tắc không gian làm việc gốc, Bazel cũng nhúng nhiều quy tắc không gian làm việc Starlark, đặc biệt là những quy tắc đó để xử lý các kho lưu trữ git hoặc các bản lưu trữ trên web.
Quy tắc
liên kết
Xem nguồn quy tắcbind(name, actual, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
Cảnh báo: bạn không nên sử dụng bind()
. Hãy xem "Cân nhắc việc xoá liên kết" để biết nội dung thảo luận dài về các vấn đề và giải pháp thay thế. Cụ thể, hãy cân nhắc sử dụng các thuộc tính kho lưu trữ repo_mapping
.
Cảnh báo: Không thể sử dụng select()
trong bind()
. Xem Câu hỏi thường gặp về thuộc tính có thể định cấu hình để biết thông tin chi tiết.
Đặt bí danh cho mục tiêu trong gói //external
.
Gói //external
không phải là gói "bình thường": không có gói bên ngoài/ thư mục,
vì vậy, bạn có thể coi gói này là một "gói ảo" chứa tất cả mục tiêu liên kết.
Ví dụ
Để đặt bí danh cho mục tiêu, hãy bind
bí danh đó trong tệp WORKSPACE. Ví dụ: Giả sử có một mục tiêu java_library
có tên là //third_party/javacc-v2
. Bạn có thể đặt bí danh này bằng cách thêm nội dung sau vào tệp WORKSPACE:
bind( name = "javacc-latest", actual = "//third_party/javacc-v2", )
Giờ đây, các mục tiêu có thể phụ thuộc vào //external:javacc-latest
thay vì
//third_party/javacc-v2
. Nếu bạn phát hành javacc-v3, thì quy tắc bind
có thể
được cập nhật và tất cả tệp BUILD tuỳ thuộc vào //external:javacc-latest
hiện sẽ
phụ thuộc vào javacc-v3 mà không cần chỉnh sửa.
Liên kết cũng có thể được dùng để cung cấp mục tiêu trong kho lưu trữ bên ngoài cho không gian làm việc của bạn.
Ví dụ: nếu có một kho lưu trữ từ xa có tên là @my-ssl
được nhập trong tệp
WORKSPACE và có mục tiêu cc_library //src:openssl-lib
, bạn có thể
tạo một đại diện cho mục tiêu này bằng cách sử dụng bind
:
bind( name = "openssl", actual = "@my-ssl//src:openssl-lib", )
Sau đó, trong tệp BUILD trong không gian làm việc, bạn có thể sử dụng mục tiêu liên kết như sau:
cc_library( name = "sign-in", srcs = ["sign_in.cc"], hdrs = ["sign_in.h"], deps = ["//external:openssl"], )
Trong sign_in.cc
và sign_in.h
, các tệp tiêu đề do
//external:openssl
hiển thị có thể được tham chiếu đến việc sử dụng đường dẫn tương ứng với thư mục
gốc của kho lưu trữ. Ví dụ: nếu định nghĩa quy tắc cho @my-ssl//src:openssl-lib
có dạng như sau:
cc_library( name = "openssl-lib", srcs = ["openssl.cc"], hdrs = ["openssl.h"], )
Khi đó, sign_in.cc
sẽ có dạng như sau:
#include "sign_in.h" #include "src/openssl.h"
Đối số
Thuộc tính | |
---|---|
name |
Tên duy nhất cho mục tiêu này. |
actual
|
Mục tiêu này phải tồn tại nhưng có thể là bất kỳ loại quy tắc nào (bao gồm cả quy tắc liên kết). Nếu thuộc tính này bị bỏ qua, thì các quy tắc tham chiếu đến mục tiêu này trong |
kho lưu trữ cục bộ
Xem nguồn quy tắclocal_repository(name, path, repo_mapping)
Cho phép liên kết các mục tiêu từ một thư mục cục bộ. Điều này có nghĩa là kho lưu trữ hiện tại có thể sử dụng các mục tiêu được xác định trong thư mục khác này. Hãy xem mục liên kết để biết thêm thông tin chi tiết.
Ví dụ
Giả sử kho lưu trữ hiện tại là một ứng dụng trò chuyện đã bị can thiệp vào thư mục ~/chat-app. Ứng dụng muốn sử dụng thư viện SSL được xác định trong một kho lưu trữ khác: ~/ssl. Thư viện SSL có mục tiêu là //src:openssl-lib
.
Người dùng có thể thêm phần phụ thuộc vào mục tiêu này bằng cách thêm các dòng sau vào ~/chat-app/WORKSPACE:
local_repository( name = "my-ssl", path = "/home/user/ssl", )
Các mục tiêu sẽ chỉ định @my-ssl//src:openssl-lib
làm phần phụ thuộc phụ thuộc vào
thư viện này.
Đối số
Thuộc tính | |
---|---|
name |
Tên duy nhất cho mục tiêu này. |
path
|
Đây phải là một đường dẫn đến thư mục chứa tệp WORKSPACE của kho lưu trữ. Đường dẫn có thể tuyệt đối hoặc tương đối với tệp WORKSPACE của kho lưu trữ chính. |
repo_mapping
|
Ví dụ: một mục |
kho lưu trữ cục bộ mới
Xem nguồn quy tắcnew_local_repository(name, build_file, build_file_content, path, repo_mapping, workspace_file, workspace_file_content)
Cho phép chuyển một thư mục cục bộ thành kho lưu trữ Bazel. Điều này có nghĩa là kho lưu trữ hiện tại có thể xác định và sử dụng các mục tiêu từ bất kỳ đâu trên hệ thống tệp.
Quy tắc này tạo một kho lưu trữ Bazel bằng cách tạo một tệp WORKSPACE và thư mục con chứa các đường liên kết tượng trưng cho tệp BUILD và đường dẫn đã cho. Tệp bản dựng phải tạo các mục tiêu liên quan đến
path
. Đối với các thư mục đã chứa tệp WORKSPACE và tệp BUILD, có thể sử dụng quy tắc local_repository
.
Ví dụ
Giả sử kho lưu trữ hiện tại là ứng dụng trò chuyện, đã can thiệp vào hệ thống thư mục ~/chat-app. Người dùng muốn sử dụng thư viện SSL được xác định trong một thư mục khác: ~/ssl.
Người dùng có thể thêm phần phụ thuộc bằng cách tạo tệp BUILD cho thư viện SSL (~/chat-app/BUILD.my-ssl) chứa:
java_library( name = "openssl", srcs = glob(['*.java']) visibility = ["//visibility:public"], )
Sau đó, họ có thể thêm các dòng sau vào ~/chat-app/WORKSPACE:
new_local_repository( name = "my-ssl", path = "/home/user/ssl", build_file = "BUILD.my-ssl", )
Thao tác này sẽ tạo một kho lưu trữ @my-ssl
liên kết đến /home/user/ssl.
Các mục tiêu có thể phụ thuộc vào thư viện này bằng cách thêm @my-ssl//:openssl
vào các phần phụ thuộc
của mục tiêu.
Bạn cũng có thể sử dụng new_local_repository
để bao gồm các tệp riêng lẻ, chứ không chỉ
thư mục. Ví dụ: giả sử bạn có một tệp jar tại /home/username/Downloads/piano.jar. Bạn chỉ có thể thêm tệp đó vào bản dựng bằng cách thêm nội dung sau vào tệp WORKSPACE:
new_local_repository( name = "piano", path = "/home/username/Downloads/piano.jar", build_file = "BUILD.piano", )
Và tạo tệp BUILD.piano sau:
java_import( name = "play-music", jars = ["piano.jar"], visibility = ["//visibility:public"], )Sau đó, các mục tiêu có thể phụ thuộc vào
@piano//:play-music
để sử dụng piano.jar.
Đối số
Thuộc tính | |
---|---|
name |
Tên duy nhất cho mục tiêu này. |
build_file
|
Phải chỉ định build_file hoặc build_file_content. Thuộc tính này là một nhãn tương ứng với không gian làm việc chính. Bạn không cần phải đặt tên tệp là BUILD, nhưng có thể đặt tên tệp. (Các tên như BUILD.new-repo-name có thể hoạt động hiệu quả để phân biệt tệp đó với các tệp BUILD thực tế của kho lưu trữ.) |
build_file_content
|
Phải chỉ định build_file hoặc build_file_content. |
path
|
Giá trị này có thể tuyệt đối hoặc tương đối so với tệp WORKSPACE của kho lưu trữ chính. |
repo_mapping
|
Ví dụ: một mục |
workspace_file
|
Bạn có thể chỉ định workspace_file hoặc workspace_file_content, nhưng không thể chỉ định cả hai. Thuộc tính này là một nhãn tương ứng với không gian làm việc chính. Tệp không cần phải có tên WORKSPACE, nhưng có thể có. (Chẳng hạn như WORKSPACE.new-repo-name có thể hoạt động hiệu quả để phân biệt tệp đó với tệp WORKSPACE thực tế của kho lưu trữ.) |
workspace_file_content
|
Bạn có thể chỉ định workspace_file hoặc workspace_file_content, nhưng không thể chỉ định cả hai. |