กฎพื้นที่ทำงาน

กฎพื้นที่ทำงานใช้เพื่อดึงทรัพยากร Dependency ภายนอก ซึ่งโดยปกติแล้วซอร์สโค้ดอยู่นอกที่เก็บหลัก

หมายเหตุ: นอกเหนือจากกฎพื้นที่ทำงานดั้งเดิมแล้ว Bazel ยังฝังกฎพื้นที่ทำงานของ Starlark หลายกฎ โดยเฉพาะกฎสำหรับจัดการกับที่เก็บ Git หรือที่เก็บถาวรที่โฮสต์บนเว็บ

กฎ

bind

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

คำเตือน: ไม่แนะนำให้ใช้ bind() ดู "พิจารณานำการเชื่อมโยงออก" ที่มีการพูดถึงปัญหาและทางเลือกอื่นเป็นเวลานาน โดยเฉพาะอย่างยิ่ง ให้พิจารณาใช้แอตทริบิวต์ที่เก็บ repo_mapping

คำเตือน: select() ใช้ใน bind() ไม่ได้ ดูรายละเอียดได้ในคำถามที่พบบ่อยเกี่ยวกับแอตทริบิวต์ที่กำหนดค่าได้

กำหนดชื่อแทนให้เป้าหมายในแพ็กเกจ //external

แพ็กเกจ //external ไม่ใช่แพ็กเกจ "ปกติ" เพราะไม่มีไดเรกทอรีภายนอก/ อาจมองว่าเป็น "แพ็กเกจเสมือน" ที่มีเป้าหมายที่เชื่อมโยงทั้งหมด

ตัวอย่าง

หากต้องการกำหนดชื่อแทนให้เป้าหมาย ให้bindในไฟล์ WORKSPACE ตัวอย่างเช่น สมมติว่ามีเป้าหมาย java_library ที่ชื่อว่า //third_party/javacc-v2 ซึ่งอาจใช้นามแฝงได้โดยเพิ่มข้อมูลต่อไปนี้ลงในไฟล์ WORKSPACE

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

ตอนนี้เป้าหมายจะพึ่ง //external:javacc-latest แทน //third_party/javacc-v2 ได้ หากเผยแพร่ javacc-v3 แล้ว คุณจะอัปเดตกฎ bind ได้ และไฟล์ BUILD ทั้งหมดที่ขึ้นอยู่กับ //external:javacc-latest จะขึ้นอยู่กับ javacc-v3 โดยไม่ต้องแก้ไข

นอกจากนี้ ยังใช้การเชื่อมโยงเพื่อทำให้เป้าหมายในที่เก็บภายนอกพร้อมใช้งานในพื้นที่ทำงานของคุณได้ ตัวอย่างเช่น หากมีที่เก็บระยะไกลชื่อ @my-ssl ที่นำเข้ามาในไฟล์ WORKSPACE และมีที่เก็บ cc_library เป้าหมาย //src:openssl-lib คุณจะสร้างชื่อแทนสำหรับเป้าหมายนี้ได้โดยใช้ bind ดังนี้

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

จากนั้นในไฟล์ BUILD ในพื้นที่ทำงาน สามารถใช้เป้าหมายที่เชื่อมโยงดังนี้

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

ภายใน sign_in.cc และ sign_in.h ไฟล์ส่วนหัวที่แสดงโดย //external:openssl จะอ้างอิงโดยใช้เส้นทางของตนเองที่สัมพัทธ์กับรูทของที่เก็บได้ เช่น หากคำจำกัดความของกฎ @my-ssl//src:openssl-lib มีลักษณะดังนี้

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

ค่ารวมของ sign_in.cc อาจมีลักษณะเช่นนี้

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

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

actual

Label; optional

เป้าหมายที่จะใช้เป็นชื่อแทน

ต้องมีเป้าหมายนี้อยู่ แต่อาจเป็นกฎประเภทใดก็ได้ (รวมถึงการเชื่อมโยง)

หากละเว้นแอตทริบิวต์นี้ กฎที่อ้างถึงเป้าหมายนี้ใน //external จะไม่เห็น Edge Dependency นี้เพียงอย่างเดียว โปรดทราบว่าสิ่งนี้แตกต่างจากการละเว้นกฎ bind โดยสิ้นเชิง ซึ่งจะเป็นข้อผิดพลาดหากทรัพยากร Dependency //external ไม่มีกฎ bind ที่เกี่ยวข้อง

local_repository

local_repository(name, path, repo_mapping)

อนุญาตให้เชื่อมโยงเป้าหมายจากไดเรกทอรีในเครื่อง ซึ่งหมายความว่าที่เก็บปัจจุบันจะใช้เป้าหมายที่กำหนดไว้ในไดเรกทอรีอื่นได้ ดูรายละเอียดเพิ่มเติมได้ที่ส่วนการเชื่อมโยง

ตัวอย่าง

สมมติว่าที่เก็บปัจจุบันเป็นไคลเอ็นต์แชทที่รูทที่ไดเรกทอรี ~/chat-app และต้องการใช้ไลบรารี SSL ซึ่งกำหนดไว้ในที่เก็บอื่น: ~/ssl ไลบรารี SSL มี //src:openssl-lib เป้าหมาย

ผู้ใช้จะเพิ่มทรัพยากร Dependency ให้กับเป้าหมายนี้ได้โดยการเพิ่มบรรทัดต่อไปนี้ใน ~/chat-app/WORKSPACE

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

เป้าหมายจะระบุ @my-ssl//src:openssl-lib เป็นทรัพยากร Dependency เพื่อใช้ไลบรารีนี้

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

path

String; required

เส้นทางไปยังไดเรกทอรีของที่เก็บในเครื่อง

ต้องเป็นเส้นทางไปยังไดเรกทอรีที่มีไฟล์ WORKSPACE ของที่เก็บ เส้นทางอาจเป็นได้ทั้งแบบสัมบูรณ์หรือสัมพัทธ์กับไฟล์ WORKSPACE ของที่เก็บหลัก

repo_mapping

Dictionary: String -> String; optional

พจนานุกรมจากชื่อที่เก็บในเครื่องไปจนถึงชื่อที่เก็บส่วนกลาง การดำเนินการนี้จะช่วยให้ควบคุมความละเอียดของทรัพยากร Dependency ของพื้นที่ทำงานสำหรับทรัพยากร Dependency ของที่เก็บนี้ได้

ตัวอย่างเช่น รายการ "@foo": "@bar" ประกาศว่าเมื่อที่เก็บนี้ต้องพึ่งพา "@foo" (เช่น ทรัพยากร Dependency ใน "@foo//some:target") ทุกครั้งที่ที่เก็บดังกล่าวควรแก้ไขทรัพยากร Dependency ดังกล่าวภายใน "@bar" ("@bar//some:target") ที่ประกาศทั่วโลก

new_local_repository

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

อนุญาตให้เปลี่ยนไดเรกทอรีในเครื่องเป็นที่เก็บ Bazel ซึ่งหมายความว่าที่เก็บปัจจุบันจะกำหนดและใช้เป้าหมายได้จากทุกที่ในระบบไฟล์

กฎนี้สร้างที่เก็บ Bazel โดยการสร้างไฟล์ WORKSPACE และไดเรกทอรีย่อยซึ่งมีลิงก์สัญลักษณ์ไปยังไฟล์ BUILD และเส้นทางที่กำหนด ไฟล์บิลด์ควรสร้างเป้าหมายที่สัมพันธ์กับ path คุณใช้กฎ local_repository ได้สำหรับไดเรกทอรีที่มีไฟล์ WORKSPACE และไฟล์ BUILD อยู่แล้ว

ตัวอย่าง

สมมติว่าที่เก็บปัจจุบันเป็นไคลเอ็นต์แชทที่รูทที่ไดเรกทอรี ~/chat-app และต้องการใช้ไลบรารี SSL ซึ่งกำหนดไว้ในไดเรกทอรีอื่น: ~/ssl

ผู้ใช้จะเพิ่มการอ้างอิงได้โดยสร้างไฟล์ BUILD สำหรับไลบรารี SSL (~/chat-app/BUILD.my-ssl) ที่ประกอบด้วย

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

จากนั้นจึงเพิ่มบรรทัดต่อไปนี้ใน ~/chat-app/WORKSPACE

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

การดำเนินการนี้จะสร้างที่เก็บ @my-ssl ที่เชื่อมโยงกับ /home/user/ssl เป้าหมายอ้างอิงไลบรารีนี้ได้โดยการเพิ่ม @my-ssl//:openssl ไปยังทรัพยากร Dependency ของเป้าหมาย

นอกจากนี้ คุณยังใช้ new_local_repository เพื่อรวมไฟล์เดี่ยวๆ ไม่ใช่แค่ไดเรกทอรี ตัวอย่างเช่น สมมติว่าคุณมีไฟล์ jar อยู่ที่ /home/username/Downloads/piano.jar คุณสามารถเพิ่มเฉพาะไฟล์นั้นลงในบิลด์โดยการเพิ่มข้อมูลต่อไปนี้ลงในไฟล์ WORKSPACE:

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

และกำลังสร้างไฟล์ BUILD.piano ดังต่อไปนี้

java_import(
    name = "play-music",
    jars = ["piano.jar"],
    visibility = ["//visibility:public"],
)
เพื่อให้เป้าหมายใช้ @piano//:play-music ในการใช้ piano.jar ได้

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

build_file

String; optional

ไฟล์ที่จะใช้เป็นไฟล์ BUILD สำหรับไดเรกทอรีนี้

ต้องระบุbuild_file หรือbuild_file_content

แอตทริบิวต์นี้เป็นป้ายกำกับที่เกี่ยวข้องกับพื้นที่ทำงานหลัก ไฟล์ไม่จำเป็นต้องมีชื่อว่า BUILD แต่สามารถเป็นได้ (เช่น BUILD.new-repo-name อาจใช้ได้ดีในการแยกความแตกต่างจากไฟล์ BUILD จริงของที่เก็บ)

build_file_content

String; optional

เนื้อหาสำหรับไฟล์ BUILD สำหรับที่เก็บนี้

ต้องระบุbuild_file หรือbuild_file_content

path

String; required

เส้นทางบนระบบไฟล์ในเครื่อง

ค่านี้อาจเป็นค่าสัมบูรณ์หรือสัมพัทธ์กับไฟล์ WORKSPACE ของที่เก็บหลัก

repo_mapping

Dictionary: String -> String; optional

พจนานุกรมจากชื่อที่เก็บในเครื่องไปจนถึงชื่อที่เก็บส่วนกลาง การดำเนินการนี้จะช่วยให้ควบคุมความละเอียดของทรัพยากร Dependency ของพื้นที่ทำงานสำหรับทรัพยากร Dependency ของที่เก็บนี้ได้

ตัวอย่างเช่น รายการ "@foo": "@bar" ประกาศว่าเมื่อที่เก็บนี้ต้องพึ่งพา "@foo" (เช่น ทรัพยากร Dependency ใน "@foo//some:target") ทุกครั้งที่ที่เก็บดังกล่าวควรแก้ไขทรัพยากร Dependency ดังกล่าวภายใน "@bar" ("@bar//some:target") ที่ประกาศทั่วโลก

workspace_file

String; optional

ไฟล์ที่จะใช้เป็นไฟล์ WORKSPACE สำหรับที่เก็บนี้

สามารถระบุ workspace_file หรือ workspace_file_content ได้อย่างใดอย่างหนึ่ง แต่ระบุทั้ง 2 อย่างไม่ได้

แอตทริบิวต์นี้เป็นป้ายกำกับที่เกี่ยวข้องกับพื้นที่ทำงานหลัก ไฟล์ไม่จำเป็นต้องมีชื่อ WORKSPACE แต่สามารถเป็นได้ (เช่น WORKSPACE.new-repo-name อาจเหมาะสำหรับการแยกออกจากไฟล์ WORKSPACE จริงของที่เก็บ)

workspace_file_content

String; optional

เนื้อหาสำหรับไฟล์ WORKSPACE สำหรับที่เก็บนี้

สามารถระบุ workspace_file หรือ workspace_file_content ได้อย่างใดอย่างหนึ่ง แต่ระบุทั้ง 2 อย่างไม่ได้