Các quy tắc của 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òn 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ữ được lưu trữ trên web.
Quy tắc
bind
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 phần "Cân nhắc xoá liên kết" để thảo luận dài về các vấn đề và lựa chọn thay thế. Cụ thể, hãy cân nhắc việ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.
Cấp cho một mục tiêu một bí danh trong gói //external
.
Gói //external
không phải là gói "bình thường": không có thư mục/ bên ngoài, vì vậy có thể được coi là một "gói ảo" chứa mọi mục tiêu ràng buộc.
Ví dụ
Để tạo bí danh 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 gọi là //third_party/javacc-v2
. Bạn có thể tạo bí danh cho tệp này bằng cách thêm nội dung sau đây vào tệp WORKSPACE:
bind( name = "javacc-latest", actual = "//third_party/javacc-v2", )
Hiện tại, các mục tiêu có thể phụ thuộc vào //external:javacc-latest
thay vì //third_party/javacc-v2
. Nếu javacc-v3 được phát hành, thì bạn có thể cập nhật quy tắc bind
và tất cả các tệp BUILD phụ 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.
Bạn cũng có thể sử dụng tính năng liên kết để cho phép truy cập vào không gian làm việc của mình các mục tiêu trong kho lưu trữ bên ngoài.
Ví dụ: nếu có một kho lưu trữ từ xa có tên là @my-ssl
được nhập vào tệp WORKSPACE và kho lưu trữ đó có đích cc_library //src:openssl-lib
, thì bạn có thể tạo đại diện cho mục tiêu này bằng bind
:
bind( name = "openssl", actual = "@my-ssl//src:openssl-lib", )
Sau đó, trong tệp BUILD trong không gian làm việc của bạn, bạn có thể sử dụng mục tiêu ràng buộc 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 bằng cách sử dụng đường dẫn tương ứng với gốc 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 đó, nội dung bao gồm của sign_in.cc
có thể có dạng như sau:
#include "sign_in.h" #include "src/openssl.h"
Đối số
Thuộc tính | |
---|---|
name |
Tên; bắt buộc Tên duy nhất cho mục tiêu này. |
actual
|
Nhãn; mặc định là Mục tiêu này phải tồn tại nhưng có thể là loại quy tắc bất kỳ (bao gồm cả ràng buộc). Nếu thuộc tính này bị bỏ qua, các quy tắc tham chiếu đến mục tiêu này trong |
local_repository
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ộ. Tức 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 phần liên kết để biết thêm 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 hệ thống tại thư mục ~/chat-app. Hệ thống muốn sử dụng một thư viện SSL được xác định trong một kho lưu trữ khác: ~/ssl. Thư viện SSL có một //src:openssl-lib
đích.
Người dùng có thể thêm một 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; bắt buộc Tên duy nhất cho mục tiêu này. |
path
|
Chuỗi; bắt buộc Đường dẫn đến thư mục của kho lưu trữ cục bộ.Đâ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 so với tệp WORKSPACE của kho lưu trữ chính. |
repo_mapping
|
Từ điển: Chuỗi -> Chuỗi; mặc định là Ví dụ: một mục |
new_local_repository
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 đổi một thư mục cục bộ thành kho lưu trữ Bazel. Tức 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ỳ vị trí nào trong hệ thống tệp.
Quy tắc này sẽ 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 đến tệp BUILD và đường dẫn đã cho. Tệp bản dựng phải tạo các mục tiêu tương ứng với path
. Đối với các thư mục đã chứa tệp WORKSPACE và tệp BUILD, bạn có thể sử dụng quy tắc
local_repository
.
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 hệ thống tại thư mục ~/chat-app. Hệ thống muốn sử dụng một 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 các 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 phần phụ thuộc của mục tiêu.
Bạn cũng có thể sử dụng new_local_repository
để đưa vào các tệp đơn 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
có thể chỉ thêm tệp đó vào bản dựng bằng cách thêm đoạn mã 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 đây:
java_import( name = "play-music", jars = ["piano.jar"], visibility = ["//visibility:public"], )Khi đó, 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; bắt buộc Tên duy nhất cho mục tiêu này. |
build_file
|
Tên; mặc định là Bạn phải chỉ định tệp build_file hoặc build_file_content. Thuộc tính này là một nhãn liên quan đến không gian làm việc chính. Bạn không cần đặt tên tệp là BUILD nhưng có thể đặt tên. (chẳng hạn như BUILD.new-repo-name có thể hoạt động tốt để phân biệt với các tệp BUILD thực tế của kho lưu trữ.) |
build_file_content
|
Chuỗi; giá trị mặc định là Bạn phải chỉ định tệp build_file hoặc build_file_content. |
path
|
Chuỗi; bắt buộc Một đường dẫn trên hệ thống tệp cục bộ.Giá trị này có thể là tuyệt đối hoặc tương đối so với tệp WORKSPACE của kho lưu trữ chính. |
repo_mapping
|
Từ điển: Chuỗi -> Chuỗi; mặc định là Ví dụ: một mục |
workspace_file
|
Tên; mặc định là Bạn chỉ 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 liên quan đến không gian làm việc chính. Tệp này không cần phải được đặt tên là WORKSPACE nhưng có thể là. (Một số thuộc tính như WORKSPACE.new-repo-name có thể phù hợp để phân biệt với các tệp WORKSPACE thực tế của kho lưu trữ.) |
workspace_file_content
|
Chuỗi; giá trị mặc định là Bạn chỉ có thể chỉ định workspace_file hoặc workspace_file_content, nhưng không thể chỉ định cả hai. |