Aturan Workspace

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Aturan Workspace digunakan untuk menarik dependensi eksternal, biasanya kode sumber yang terletak di luar repositori utama.

Catatan: selain aturan ruang kerja native, Bazel juga menyematkan berbagai aturan ruang kerja Starlark, khususnya aturan untuk menangani repositori atau arsip git yang dihosting di web.

Aturan

mengikat

bind(name, actual, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

Peringatan: penggunaan bind() tidak direkomendasikan. Lihat "Pertimbangkan untuk menghapus binding" untuk diskusi lama tentang masalah dan alternatifnya. Secara khusus, pertimbangkan penggunaan atribut repositori repo_mapping.

Peringatan: select() tidak dapat digunakan di bind(). Lihat FAQ Atribut yang Dapat Dikonfigurasi untuk mengetahui detailnya.

Memberi alias target dalam paket //external.

Paket //external bukanlah "normal" paket: tidak ada direktori eksternal/, sehingga dapat dianggap sebagai "paket virtual" yang berisi semua target terikat.

Contoh

Untuk memberi alias pada target, bind alias di file WORKSPACE. Misalnya, ada target java_library yang disebut //third_party/javacc-v2. Ini dapat berupa alias dengan menambahkan kode berikut ke file WORKSPACE:

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

Sekarang target dapat bergantung pada //external:javacc-latest, bukan //third_party/javacc-v2. Jika javacc-v3 dirilis, aturan bind dapat diperbarui dan semua file BUILD, bergantung pada //external:javacc-latest, sekarang akan bergantung pada javacc-v3 tanpa perlu diedit.

Bind juga dapat digunakan untuk membuat target di repositori eksternal tersedia untuk ruang kerja Anda. Misalnya, jika ada repositori jarak jauh bernama @my-ssl yang diimpor dalam file WORKSPACE dan memiliki target cc_library //src:openssl-lib, Anda dapat membuat alias untuk target ini menggunakan bind:

bind(
    name = "openssl",
    actual = "@my-ssl//src:openssl-lib",
)

Kemudian, pada file BUILD di ruang kerja Anda, target terikat dapat digunakan sebagai berikut:

cc_library(
    name = "sign-in",
    srcs = ["sign_in.cc"],
    hdrs = ["sign_in.h"],
    deps = ["//external:openssl"],
)

Dalam sign_in.cc dan sign_in.h, file header yang diekspos oleh //external:openssl dapat dirujuk menggunakan jalurnya yang berkaitan dengan root repositori. Misalnya, jika definisi aturan untuk @my-ssl//src:openssl-lib terlihat seperti ini:

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

Kemudian, penyertaan sign_in.cc mungkin terlihat seperti ini:

#include "sign_in.h"
#include "src/openssl.h"

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

actual

Label; optional

Target yang akan dialias.

Target ini harus ada, tetapi dapat berupa jenis aturan apa pun (termasuk binding).

Jika atribut ini dihilangkan, aturan yang merujuk pada target ini di //external tidak akan melihat tepi dependensi ini. Perhatikan bahwa aturan ini berbeda dengan menghapus aturan bind sepenuhnya: error merupakan error jika dependensi //external tidak memiliki aturan bind yang terkait.

repositori_lokal

local_repository(name, path, repo_mapping)

Mengizinkan target dari direktori lokal untuk diikat. Artinya, repositori saat ini dapat menggunakan target yang ditentukan dalam direktori lainnya. Lihat bagian binding untuk detail selengkapnya.

Contoh

Misalkan repositori saat ini adalah klien chat, yang di-root di direktori ~/chat-app. Repositori ini ingin menggunakan library SSL yang ditentukan dalam repositori lain: ~/ssl. Library SSL memiliki //src:openssl-lib target.

Pengguna dapat menambahkan dependensi pada target ini dengan menambahkan baris berikut ke ~/chat-app/WORKSPACE:

local_repository(
    name = "my-ssl",
    path = "/home/user/ssl",
)

Target akan menentukan @my-ssl//src:openssl-lib sebagai dependensi yang bergantung pada library ini.

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

path

String; required

Jalur ke direktori repositori lokal.

Jalur ini harus berupa jalur ke direktori yang berisi file WORKSPACE repositori. Jalur ini dapat bersifat absolut atau relatif terhadap file WORKSPACE repositori utama.

repo_mapping

Dictionary: String -> String; optional

Kamus dari nama repositori lokal ke nama repositori global. Hal ini memungkinkan kontrol atas resolusi dependensi ruang kerja untuk dependensi repositori ini.

Misalnya, entri "@foo": "@bar" mendeklarasikan bahwa, setiap kali repositori ini bergantung pada "@foo" (seperti dependensi pada "@foo//some:target"), repositori tersebut harus benar-benar mengatasi dependensi tersebut dalam "@bar" yang dideklarasikan secara global ("@bar//some:target").

repositori_lokal_baru

new_local_repository(name, build_file, build_file_content, path, repo_mapping, workspace_file, workspace_file_content)

Mengizinkan direktori lokal diubah menjadi repositori Bazel. Artinya, repositori saat ini dapat menentukan dan menggunakan target dari mana saja pada sistem file.

Aturan ini membuat repositori Bazel dengan membuat file dan subdirektori WORKSPACE yang berisi symlink ke file dan jalur BUILD yang diberikan. File build harus membuat target yang relatif terhadap path. Untuk direktori yang sudah berisi file WORKSPACE dan file BUILD, aturan local_repository dapat digunakan.

Contoh

Misalkan repositori saat ini adalah klien chat, yang di-root di direktori ~/chat-app. Repositori ini ingin menggunakan library SSL yang ditentukan dalam direktori yang berbeda: ~/ssl.

Pengguna dapat menambahkan dependensi dengan membuat file BUILD untuk library SSL (~/chat-app/BUILD.my-ssl) yang berisi:

java_library(
    name = "openssl",
    srcs = glob(['*.java'])
    visibility = ["//visibility:public"],
)

Kemudian, mereka dapat menambahkan baris berikut ke ~/chat-app/WORKSPACE:

new_local_repository(
    name = "my-ssl",
    path = "/home/user/ssl",
    build_file = "BUILD.my-ssl",
)

Ini akan membuat repositori @my-ssl yang terhubung ke /home/user/ssl. Target dapat bergantung pada library ini dengan menambahkan @my-ssl//:openssl ke dependensi target.

Anda juga dapat menggunakan new_local_repository untuk menyertakan satu file, bukan hanya direktori. Misalnya, Anda memiliki file jar di /home/username/Downloads/piano.jar. Anda dapat menambahkan file tersebut saja ke build dengan menambahkan kode berikut ke file WORKSPACE:

new_local_repository(
    name = "piano",
    path = "/home/username/Downloads/piano.jar",
    build_file = "BUILD.piano",
)

Dan membuat file BUILD.piano berikut:

java_import(
    name = "play-music",
    jars = ["piano.jar"],
    visibility = ["//visibility:public"],
)
Lalu, target dapat bergantung pada @piano//:play-music untuk menggunakan piano.jar.

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

build_file

String; optional

File yang akan digunakan sebagai file BUILD untuk direktori ini.

Build_file atau build_file_content harus ditentukan.

Atribut ini adalah label yang relatif terhadap ruang kerja utama. Nama file tidak harus BUILD, tetapi dapat diberi nama BUILD. (Sesuatu seperti BUILD.new-repo-name mungkin berfungsi dengan baik untuk membedakannya dari file BUILD yang sebenarnya pada repositori.)

build_file_content

String; optional

Konten untuk file BUILD untuk repositori ini.

Build_file atau build_file_content harus ditentukan.

path

String; required

Jalur di sistem file lokal.

Hal ini dapat berupa absolut atau relatif terhadap file WORKSPACE repositori utama.

repo_mapping

Dictionary: String -> String; optional

Kamus dari nama repositori lokal ke nama repositori global. Hal ini memungkinkan kontrol atas resolusi dependensi ruang kerja untuk dependensi repositori ini.

Misalnya, entri "@foo": "@bar" mendeklarasikan bahwa, setiap kali repositori ini bergantung pada "@foo" (seperti dependensi pada "@foo//some:target"), repositori tersebut harus benar-benar mengatasi dependensi tersebut dalam "@bar" yang dideklarasikan secara global ("@bar//some:target").

workspace_file

String; optional

File yang akan digunakan sebagai file WORKSPACE untuk repositori ini.

workspace_file atau workspace_file_content dapat ditetapkan, namun tidak keduanya.

Atribut ini adalah label yang relatif terhadap ruang kerja utama. Nama file tidak harus berupa WORKSPACE, tetapi bisa juga. (Sesuatu seperti WORKSPACE.new-repo-name mungkin berfungsi dengan baik untuk membedakannya dari file WORKSPACE yang sebenarnya dari repositori.)

workspace_file_content

String; optional

Konten untuk file WORKSPACE untuk repositori ini.

workspace_file atau workspace_file_content dapat ditetapkan, namun tidak keduanya.