Quy tắc của Workspace

Các quy tắc của Workspace được 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 của Starlark, đặc biệt là những quy tắc giao dịch với kho lưu trữ git hoặc các bản lưu trữ được lưu trữ trên web.

Quy tắc

xác thực

bind(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(). Xem "Cân nhắc xóa liên kết" trong một khoảng thời gian dài thảo luận về các vấn đề và phương án thay thế. Cụ thể, hãy cân nhắc việc sử dụng repo_mapping các thuộc tính của kho lưu trữ.

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 để 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" gói: không có thư mục/ bên ngoài, nên có thể được coi là một "gói ảo" chứa tất cả các 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 bí danh tên này bằng cách thêm mã sau vào Tệp WORKSPACE:

bind(
    name = "javacc-latest",
    actual = "//third_party/javacc-v2",
)

Các mục tiêu hiện 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ì quy tắc bind có thể là được cập nhật 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 trong Tệp WORKSPACE và tệp này có mục tiêu cc_library là //src:openssl-lib, bạn có thể tạo bí danh 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.ccsign_in.h, các tệp tiêu đề hiển thị bởi Bạn có thể tham chiếu //external:openssl bằng cách sử dụng đường dẫn tương ứng với kho lưu trữ của chúng thư mục gốc. Ví dụ: nếu định nghĩa quy tắc cho @my-ssl//src:openssl-lib giố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

Name; required

Tên duy nhất cho mục tiêu này.

actual

Label; optional

Mục tiêu được đặt bí danh.

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 //external sẽ không thấy cạnh phần phụ thuộc này. Xin lưu ý rằng điều này khác với việc bỏ qua Quy tắc hoàn toàn bind: đó là lỗi nếu phần phụ thuộc //external không có quy tắc bind liên kết.

local_repository

local_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. Xem 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. Nó muốn sử dụng thư viện SSL được xác định trong kho lưu trữ khác: ~/ssl. Chiến lược phát hành đĩa đơn 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 điều này thư viện của bạn.

Đối số

Thuộc tính
name

Name; required

Tên duy nhất cho mục tiêu này.

path

String; required

Đường dẫn đến thư mục của kho lưu trữ cục bộ.

Đây phải là đường dẫn đến thư mục chứa WORKSPACE. Đường dẫn có thể tuyệt đối hoặc tương đối so với kho lưu trữ chính WORKSPACE.

repo_mapping

Dictionary: String -> String; optional

Một từ điển từ tên kho lưu trữ cục bộ thành tên kho lưu trữ toàn cục. Chế độ này cho phép kiểm soát giải pháp phần phụ thuộc Workspace cho các phần phụ thuộc của kho lưu trữ này.

Ví dụ: mục nhập "@foo": "@bar" khai báo rằng, bất cứ lúc nào điều này kho lưu trữ phụ thuộc vào "@foo" (chẳng hạn như phần phụ thuộc trên "@foo//some:target"), thì tệp này sẽ giải quyết phần phụ thuộc đó trong "@bar" ("@bar//some:target") được khai báo toàn cầu.

new_local_repository

new_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. Điều này có nghĩa là giá trị kho lưu trữ có thể xác định và sử dụng các mục tiêu từ bất kỳ vị trí nào 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 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, giá trị 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. Nó 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) có 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 một mục tiêu phần phụ thuộc.

Bạn cũng có thể dùng new_local_repository để đưa vào các tệp đơn lẻ, chứ không chỉ . Ví dụ: giả sử bạn có một tệp jar tại /home/username/Downloads/piano.jar. Bạn 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"],
)
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

Name; required

Tên duy nhất cho mục tiêu này.

build_file

String; optional

Một tệp dùng làm tệp BUILD cho thư mục này.

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. Tệp không cần phải có tên là BUILD, nhưng cũng có thể. (Một cái gì đó như BUILD.new-repo-name có thể hoạt động tốt đối với phân biệt với tệp BUILD thực tế của kho lưu trữ.)

build_file_content

String; optional

Nội dung của tệp BUILD cho kho lưu trữ này.

Bạn phải chỉ định tệp build_file hoặc build_file_content.

path

String; required

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

Dictionary: String -> String; optional

Một từ điển từ tên kho lưu trữ cục bộ thành tên kho lưu trữ toàn cục. Chế độ này cho phép kiểm soát giải pháp phần phụ thuộc Workspace cho các phần phụ thuộc của kho lưu trữ này.

Ví dụ: mục nhập "@foo": "@bar" khai báo rằng, bất cứ lúc nào điều này kho lưu trữ phụ thuộc vào "@foo" (chẳng hạn như phần phụ thuộc trên "@foo//some:target"), thì tệp này sẽ giải quyết phần phụ thuộc đó trong "@bar" ("@bar//some:target") được khai báo toàn cầu.

workspace_file

String; optional

Tệp này để sử dụng làm tệp WORKSPACE cho kho lưu trữ này.

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 không cần phải có tên WORKSPACE nhưng cũng có thể. (Một dịch vụ như WORKSPACE.new-repo-name có thể hoạt động hiệu quả đối với phân biệt với các tệp WORKSPACE thực tế của kho lưu trữ.)

workspace_file_content

String; optional

Nội dung của tệp WORKSPACE cho kho lưu trữ này.

Bạn chỉ có thể chỉ định workspace_file hoặc workspace_file_content, nhưng không thể chỉ định cả hai.