Quy tắc của Workspace

Các quy tắc không gian làm việc được dùng để lấy các phần phụ thuộc bên ngoài, thường là mã nguồn nằm ngoài kho lưu trữ chính.

Lưu ý: Ngoài 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à các quy tắc để xử lý kho lưu trữ git hoặc kho lưu trữ được lưu trữ trên web.

Quy tắc

bind

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(). Hãy xem phần "Cân nhắc việc xoá liên kết" để biết nội dung thảo luận chi tiết 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 thuộc tính kho lưu trữ repo_mapping.

Cảnh báo: Không thể sử dụng select() trong bind(). Vui lòng xem phần 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ạo 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ó thư mục/ bên ngoài nên 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 bí danh cho mục tiêu, hãy bind mục tiêu đó trong tệp WORKSPACE. Ví dụ: giả sử có một mục tiêu java_library tên là //third_party/javacc-v2. Bạn có thể đặt bí danh tệp này bằng cách thêm đoạn mã 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 javacc-v3 được phát hành, thì bạn có thể cập nhật quy tắc bind. Giờ đây, tất cả các tệp BUILD phụ thuộc vào //external:javacc-latest 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 tên là @my-ssl được nhập vào tệp WORKSPACE và kho lưu trữ đó có mục tiêu cc_library //src:openssl-lib, bạn có thể tạo bí danh 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 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 đề 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ữ của các tệp đó. Ví dụ: nếu định nghĩa quy tắc cho @my-ssl//src:openssl-lib sẽ có dạng như sau:

cc_library(
    name = "openssl-lib",
    srcs = ["openssl.cc"],
    hdrs = ["openssl.h"],
)

Sau đó, phần include 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à bất kỳ loại quy tắc nào (bao gồm cả quy tắ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ẽ đơn giản là không thấy cạnh phần phụ thuộc này. Xin lưu ý rằng thao tác này khác với việc bỏ qua hoàn toàn quy tắc bind: sẽ là lỗi nếu phần phụ thuộc //external không có quy tắc bind được 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. Hãy xem phần 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 hệ thống tại thư mục ~/chat-app. Kho lưu trữ này 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ộ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

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à 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ể 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

Từ điển từ tên kho lưu trữ cục bộ thành tên kho lưu trữ toàn cầu. Nhờ vậy, bạn có thể kiểm soát quá trình phân giải phần phụ thuộc không gian làm việc cho các phần phụ thuộc của kho lưu trữ này.

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

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 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 cứ đâu trên 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 được cung cấp. 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. Kho lưu trữ này 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 tượng trưng đế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 đơ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 chỉ có thể 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 để sử dụng làm tệp XÂY DỰNG cho thư mục này.

Bạn phải chỉ định 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 này không cần phải được đặt tên là BUILD, nhưng có thể là. (Một số nội dung như BUILD.new-repo-name có thể hoạt động hiệu quả để phân biệt với các 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 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

Từ điển từ tên kho lưu trữ cục bộ thành tên kho lưu trữ toàn cầu. Nhờ vậy, bạn có thể kiểm soát quá trình phân giải phần phụ thuộc không gian làm việc cho các phần phụ thuộc của kho lưu trữ này.

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

workspace_file

String; optional

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

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 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ố nội dung như WORKSPACE.new-repo-name có thể hoạt động hiệu quả để 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 có thể chỉ định workspace_file hoặc workspace_file_content, nhưng không thể chỉ định cả hai.