กฎพื้นที่ทำงานใช้เพื่อดึงข้อมูลทรัพยากร 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 |
ชื่อที่ไม่ซ้ำกันของเป้าหมายนี้ |
actual
|
เป้าหมายนี้ต้องมีอยู่ แต่อาจเป็นกฎประเภทใดก็ได้ (รวมถึงการเชื่อมโยง) หากละเว้นแอตทริบิวต์นี้ กฎที่อ้างถึงเป้าหมายนี้ใน |
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 |
ชื่อที่ไม่ซ้ำกันของเป้าหมายนี้ |
path
|
ซึ่งต้องเป็นเส้นทางไปยังไดเรกทอรีที่มีไฟล์ WORKSPACE ของที่เก็บ เส้นทางอาจเป็นค่าสัมบูรณ์หรือสัมพัทธ์กับไฟล์ WORKSPACE ของที่เก็บหลัก |
repo_mapping
|
เช่น รายการ |
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
ผู้ใช้จะเพิ่มทรัพยากร Dependency ได้โดยการสร้างไฟล์ 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 |
ชื่อที่ไม่ซ้ำกันของเป้าหมายนี้ |
build_file
|
ต้องระบุ create_file หรือ create_file_content แอตทริบิวต์นี้เป็นป้ายกำกับที่เกี่ยวข้องกับพื้นที่ทำงานหลัก ไฟล์ไม่จำเป็นต้องมีชื่อว่า BUILD แต่สามารถตั้งชื่อได้ (เช่น BUILD.new-repo-name อาจเหมาะสำหรับแยกความแตกต่างจากไฟล์ BUILD จริงของที่เก็บ) |
build_file_content
|
ต้องระบุ create_file หรือ create_file_content |
path
|
ซึ่งอาจเป็นแบบสัมบูรณ์หรือสัมพัทธ์กับไฟล์ WORKSPACE ของที่เก็บหลัก |
repo_mapping
|
เช่น รายการ |
workspace_file
|
สามารถระบุ workspace_file หรือ workspace_file_content ได้ แต่ระบุทั้งคู่ไม่ได้ แอตทริบิวต์นี้เป็นป้ายกำกับที่เกี่ยวข้องกับพื้นที่ทำงานหลัก ไฟล์ไม่จำเป็นต้องมีชื่อว่า WORKSPACE แต่สามารถตั้งชื่อได้ (เช่น WORKSPACE.new-repo-name อาจช่วยให้แยกความแตกต่างจากไฟล์ WORKSPACE จริงของที่เก็บได้) |
workspace_file_content
|
สามารถระบุ workspace_file หรือ workspace_file_content ได้ แต่ระบุทั้งคู่ไม่ได้ |