Quy tắc của Workspace

Báo cáo vấn đề Xem nguồn Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Các quy tắc không gian làm việc được dùng để kéo 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 ý: 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à những 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

xác thực

Xem nguồn quy tắ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(). Hãy xem phần "Cân nhắc việc xoá bind" để 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 việc sử dụng repo_mappingthuộc tính kho lưu trữ.

Cảnh báo: Bạn không thể dùng select() trong bind(). Hãy 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 cho mục tiêu một bí danh trong gói //external.

Gói //external không phải là một gói "bình thường": không có thư mục/ bên ngoài, vì vậy, bạn có thể coi đây là một "gói ảo" chứa tất cả các mục tiêu được liên kết.

Ví dụ

Để đặt mộ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 cho mục tiêu 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 javacc-v3 được phát hành, bạn có thể cập nhật quy tắc bind và tất cả các tệp BUILD tuỳ thuộc vào //external:javacc-latest giờ đây sẽ phụ thuộc vào javacc-v3 mà không cần chỉnh sửa.

Bạn cũng có thể dùng bind để cung cấp các mục tiêu trong kho lưu trữ bên ngoài cho không gian làm việc của mình. 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 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 được 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.ccsign_in.h, bạn có thể tham chiếu đến các tệp tiêu đề do //external:openssl hiển thị 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"],
)

Sau đó, các mục bao gồm của sign_in.cc có thể 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 riêng cho mục tiêu này.

actual

Nhãn; mặc định là None

Mục tiêu cần đượ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 (kể cả quy tắc liên kết).

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

local_repository

Xem nguồn quy tắc
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ộ. Đ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 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, được đặt tại thư mục ~/chat-app. Ứng dụng này 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 mục tiêu là //src:openssl-lib.

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 riêng 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à đường dẫn đến thư mục chứa tệp WORKSPACE của kho lưu trữ. Đường dẫn có thể là đường dẫn tuyệt đối hoặc đường dẫn tương đối đến tệp WORKSPACE của kho lưu trữ chính.

repo_mapping

Từ điển: Chuỗi -> Chuỗi; mặc định là {}

Từ điển từ tên kho lưu trữ cục bộ đến tên kho lưu trữ chung. Điều này cho phép kiểm soát quá trình phân giải phần phụ thuộc của không gian làm việc đối với 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ư một phần phụ thuộc vào "@foo//some:target"), thì kho lưu trữ đó thực sự phải phân giải phần phụ thuộc đó trong "@bar" ("@bar//some:target") được khai báo trên toàn cục.

new_local_repository

Xem nguồn quy tắc
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. Đ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 ở 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 đế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 liên quan đến 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, được đặt tại thư mục ~/chat-app. Ứng dụng này 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 một 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 có 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ể dùng new_local_repository để thêm các tệp riêng lẻ, chứ không chỉ các 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ần 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 đâ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

Tên; bắt buộc

Tên riêng cho mục tiêu này.

build_file

Name (Tên); mặc định là None

Tệp dùng làm tệp BUILD 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. Bạn không cần phải đặt tên tệp là BUILD, nhưng có thể đặt tên như vậy. (Một tên như BUILD.new-repo-name có thể phù hợp để phân biệt tên này 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à ""

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

Chuỗi; bắt buộc

Đường dẫn trên hệ thống tệp cục bộ.

Đây có thể là đường dẫn tuyệt đối hoặc đường dẫn tương đối đến tệp WORKSPACE của kho lưu trữ chính.

repo_mapping

Từ điển: Chuỗi -> Chuỗi; mặc định là {}

Từ điển từ tên kho lưu trữ cục bộ đến tên kho lưu trữ chung. Điều này cho phép kiểm soát quá trình phân giải phần phụ thuộc của không gian làm việc đối với 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ư một phần phụ thuộc vào "@foo//some:target"), thì kho lưu trữ đó thực sự phải phân giải phần phụ thuộc đó trong "@bar" ("@bar//some:target") được khai báo trên toàn cục.

workspace_file

Name (Tên); mặc định là None

Tệp 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 được 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. Bạn không bắt buộc phải đặt tên tệp là WORKSPACE, nhưng có thể đặt. (Một tên như WORKSPACE.new-repo-name có thể phù hợp để phân biệt tên này 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à ""

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

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