ป้ายกำกับคือตัวระบุของเป้าหมาย ป้ายกำกับทั่วไปใน Canonical แบบเต็ม ฟอร์มมีลักษณะเช่นนี้:
@@myrepo//my/app/main:app_binary
ส่วนแรกของป้ายกำกับคือชื่อที่เก็บ @@myrepo
ดับเบิล-@
ทางไวยากรณ์หมายความว่านี่เป็นที่เก็บ Canonical
name ซึ่งเป็นชื่อที่ไม่ซ้ำกันภายใน
พื้นที่ทำงาน ป้ายกำกับที่มีชื่อที่เก็บตามรูปแบบบัญญัติระบุเป้าหมายอย่างชัดเจน
ไม่ว่าจะปรากฏในบริบทใด
บ่อยครั้งที่ชื่อของที่เก็บแบบมาตรฐานจะเป็นสตริง Arcane ที่มีลักษณะดังนี้
@@rules_java++toolchains+local_jdk
สิ่งที่พบเห็นได้ทั่วไปคือ
ป้ายกำกับที่มีชื่อที่เก็บอย่างชัดเจน
ซึ่งมีลักษณะดังนี้
@myrepo//my/app/main:app_binary
ความแตกต่างเพียงอย่างเดียวคือชื่อที่เก็บขึ้นต้นด้วย @
แทนที่จะเป็น 2
หมายถึงที่เก็บที่มีชื่อ myrepo
ซึ่งสังเกตได้ ซึ่งอาจแตกต่างจากนี้
ตามบริบทที่ป้ายกำกับนี้ปรากฏ
ในกรณีทั่วไปที่ป้ายกำกับจะหมายถึงที่เก็บเดียวกับที่
มีการใช้งาน ส่วนชื่อที่เก็บอาจถูกตัดออก ดังนั้นใน @@myrepo
รายการแรก
มักจะเขียนเป็น
//my/app/main:app_binary
ส่วนที่ 2 ของป้ายกำกับคือชื่อแพ็กเกจที่ไม่ตรงตามข้อกำหนด
เส้นทางไปยังแพ็กเกจ my/app/main
ที่สัมพันธ์กับรูทของที่เก็บ ทั้งชื่อที่เก็บและ
ชื่อแพ็กเกจที่ไม่ตรงตามข้อกำหนดในรูปแบบชื่อแพ็กเกจแบบเต็ม
@@myrepo//my/app/main
เมื่อป้ายกำกับอ้างอิงถึง
ชื่อแพ็กเกจ ชื่อแพ็กเกจ (และไม่จำเป็นต้องใส่เครื่องหมายโคลอน)
อาจละเว้นได้ ดังนั้น ภายใน @@myrepo//my/app/main
ป้ายกำกับนี้สามารถเขียนโดยใช้วิธีดังต่อไปนี้:
app_binary
:app_binary
หลักปกติก็คือการละเว้นเครื่องหมายโคลอนสำหรับไฟล์ แต่ถูกเก็บไว้สำหรับกฎต่างๆ แต่ไม่มีนัยสำคัญเป็นอย่างอื่น
ส่วนของป้ายกำกับหลังเครื่องหมายโคลอน app_binary
คือเป้าหมายที่ไม่ตรงตามข้อกำหนด
ชื่อ เมื่อไฟล์ตรงกับคอมโพเนนต์สุดท้ายของเส้นทางแพ็กเกจ
เครื่องหมายโคลอน อาจละเว้นได้ ป้ายกำกับ 2 รายการนี้จึงเทียบเท่ากัน
//my/app/lib
//my/app/lib:lib
ชื่อของเป้าหมายไฟล์ในไดเรกทอรีย่อยของแพ็กเกจคือเส้นทางของไฟล์
ที่สัมพันธ์กับรูทของแพ็กเกจ (ไดเรกทอรีที่มีไฟล์ BUILD
) ดังนั้น
ไฟล์นี้อยู่ในไดเรกทอรีย่อย my/app/main/testdata
ของที่เก็บ:
//my/app/main:testdata/input.txt
สตริง เช่น //my/app
และ @@some_repo//my/app
มี 2 ความหมายขึ้นอยู่กับ
บริบทที่ใช้: เมื่อ Bazel คาดหวังว่าจะได้ป้ายกำกับ ก็หมายความว่า
//my/app:app
และ @@some_repo//my/app:app
ตามลำดับ แต่เมื่อบาเซล
ต้องการแพ็กเกจ (เช่น ในข้อกำหนดเฉพาะของ package_group
) เนื่องจากมีการอ้างอิงถึง
ที่มีป้ายกำกับดังกล่าว
ข้อผิดพลาดที่พบบ่อยในไฟล์ BUILD
คือการใช้ //my/app
เพื่ออ้างอิงแพ็กเกจ หรือ
กับเป้าหมายทั้งหมดในแพ็กเกจ แต่ไม่ได้เป็นเช่นนั้น โปรดจำไว้ว่า
เทียบเท่ากับ //my/app:app
ดังนั้นจึงตั้งชื่อเป้าหมาย app
ใน my/app
ของที่เก็บปัจจุบัน
อย่างไรก็ตาม เราขอแนะนำให้ใช้ //my/app
เพื่ออ้างถึงแพ็กเกจใน
ของ package_group
หรือใน .bzl
เนื่องจาก
แจ้งว่าชื่อแพ็กเกจสัมบูรณ์และรูทในระดับบนสุด
ของพื้นที่ทำงาน
ใช้ป้ายกำกับสัมพัทธ์เพื่ออ้างถึงเป้าหมายในแพ็กเกจอื่นๆ ไม่ได้ เวลา
ต้องระบุตัวระบุที่เก็บและชื่อแพ็กเกจไว้เสมอในกรณีนี้
ตัวอย่างเช่น หากโครงสร้างซอร์สมีทั้งแพ็กเกจ my/app
และ
แพ็คเกจ my/app/testdata
(แต่ละไดเรกทอรีมี
BUILD
) แพ็กเกจหลังจะมีไฟล์ชื่อ testdepot.zip
ที่นี่
มี 2 วิธี (ผิดวิธี 1 ข้อ) อ้างอิงไฟล์นี้ภายใน
//my/app:BUILD
:
ไม่ถูกต้อง — testdata
เป็นแพ็กเกจอื่น คุณจึงใช้เส้นทางแบบสัมพัทธ์ไม่ได้
testdata/testdepot.zip
ถูกต้อง — โปรดดู testdata
พร้อมเส้นทางแบบเต็ม
//my/app/testdata:testdepot.zip
ป้ายกำกับที่ขึ้นต้นด้วย @@//
คือการอ้างอิงถึงแท็กหลัก
ซึ่งยังคงใช้งานได้แม้จากที่เก็บภายนอก
ดังนั้น @@//a/b/c
จึงแตกต่างจาก
//a/b/c
เมื่ออ้างอิงจากที่เก็บภายนอก
รายการแรกอ้างอิงกลับไปยังที่เก็บหลัก ในขณะที่รายการหลังอ้างอิงกลับไปยังที่เก็บหลัก
จะค้นหา //a/b/c
ในที่เก็บภายนอกเอง
ซึ่งจะเกี่ยวข้องโดยเฉพาะเมื่อเขียนกฎใน
ที่เก็บซึ่งอ้างถึงเป้าหมายในที่เก็บหลัก และจะ
ที่ใช้จากที่เก็บภายนอก
สำหรับข้อมูลเกี่ยวกับวิธีต่างๆ ที่คุณสามารถอ้างอิงถึงเป้าหมาย โปรดดู รูปแบบเป้าหมาย
ข้อกำหนดด้านเทคนิคของป้ายกำกับ
ไวยากรณ์ของป้ายกำกับไม่สนับสนุนการใช้อักขระเมตาที่มีความหมายพิเศษกับ Shell ซึ่งช่วยหลีกเลี่ยงปัญหาการยกข้อความมาโดยไม่ตั้งใจ และทำให้ สร้างเครื่องมือและสคริปต์ที่จัดการป้ายกำกับ เช่น ภาษาของคำค้นหาบาเซล
โปรดดูรายละเอียดที่แน่นอนของชื่อเป้าหมายที่อนุญาตด้านล่าง
ชื่อเป้าหมาย — package-name:target-name
target-name
คือชื่อของเป้าหมายในแพ็กเกจ ชื่อกฎ
คือค่าของแอตทริบิวต์ name
ในการประกาศของกฎใน BUILD
file; ชื่อไฟล์คือชื่อพาธที่สัมพันธ์กับไดเรกทอรีที่มี
ไฟล์ BUILD
ชื่อเป้าหมายต้องประกอบด้วยอักขระทั้งหมดจากชุด a
–z
A
–Z
, 0
–9
และเครื่องหมายวรรคตอน !%-@^_"#$&'()*-+,;<=>?[]{|}~/.
ชื่อไฟล์ต้องเป็นชื่อพาธสัมพัทธ์ในรูปแบบปกติ ซึ่งหมายความว่า
ไม่ขึ้นต้นหรือลงท้ายด้วยเครื่องหมายทับ (เช่น /foo
และ foo/
เป็น
ไม่อนุญาต) หรือมีเครื่องหมายทับหลายตัวติดกันเป็นเส้นแบ่งเส้นทาง
(เช่น foo//bar
) ในทำนองเดียวกัน การอ้างอิงแบบยกระดับ (..
) และ
ห้ามการอ้างอิงไดเรกทอรีปัจจุบัน (./
)
ไม่ถูกต้อง - อย่าใช้ ..
เพื่ออ้างอิงไฟล์ในแพ็กเกจอื่นๆ
ถูกต้อง - ใช้
//package-name:filename
แม้ว่าจะมีการใช้ /
ในชื่อของไฟล์เป้าหมายโดยทั่วไป แต่ขอให้หลีกเลี่ยงการใช้
/
ในชื่อกฎ โดยเฉพาะอย่างยิ่ง เมื่อรูปแบบชวเลขของป้ายกำกับคือ
ซึ่งอาจทำให้ผู้อ่านสับสน ป้ายกำกับ //foo/bar/wiz
เป็นแบบย่อเสมอ
สำหรับ //foo/bar/wiz:wiz
แม้ว่าจะไม่มีแพ็กเกจดังกล่าว foo/bar/wiz
รายการดังกล่าว
ไม่อ้างอิง //foo:bar/wiz
แม้ว่าจะมีเป้าหมายนั้นอยู่
อย่างไรก็ตาม ก็มีบางกรณีที่การใช้เครื่องหมายทับเป็นไปอย่างสะดวก หรือ บางครั้งก็จำเป็นด้วยซ้ำ เช่น ชื่อของกฎบางกฎต้องตรงกัน ไฟล์ต้นฉบับหลัก ซึ่งอาจอยู่ในไดเรกทอรีย่อยของแพ็กเกจ
ชื่อแพ็กเกจ — //package-name:target-name
ชื่อของแพ็กเกจคือชื่อของไดเรกทอรีที่มีไฟล์ BUILD
ของแพ็กเกจ
เมื่อเทียบกับไดเรกทอรีระดับบนสุดของที่เก็บ
เช่น my/app
ในระดับทางเทคนิค Bazel บังคับใช้สิ่งต่อไปนี้
- อักขระที่อนุญาตในชื่อแพ็กเกจคืออักษรตัวพิมพ์เล็ก
a
ถึงz
ตัวอักษรพิมพ์ใหญ่A
ถึงZ
, ตัวเลข0
ถึง9
, อักขระ! \"#$%&'()*+,-.;<=>?@[]^_`{|}
(ใช่ มีอักขระเว้นวรรค ) และแน่นอน เครื่องหมายทับ/
(เนื่องจากเป็นไดเรกทอรี ตัวคั่น) - ชื่อแพ็กเกจต้องไม่ขึ้นต้นหรือลงท้ายด้วยเครื่องหมายทับ
/
- ชื่อแพ็กเกจต้องไม่มีสตริงย่อย
//
วิธีนี้ไม่ทำให้ แล้วเส้นทางไดเรกทอรีที่เกี่ยวข้องควรจะเป็นอย่างไร - ชื่อแพ็กเกจต้องไม่มีสตริงย่อย
/./
หรือ/../
หรือ/.../
ฯลฯ เราบังคับใช้มาตรการนี้เพื่อหลีกเลี่ยงความสับสนเมื่อต้องแปลความหมายระหว่างตรรกะ ชื่อแพ็กเกจและชื่อไดเรกทอรีทางกายภาพ โดยให้ความหมายตามเชิงอรรถศาสตร์ของ จุดในสตริงเส้นทาง
ในแง่ที่นำไปใช้ได้จริง:
- สำหรับภาษาที่มีโครงสร้างไดเรกทอรีที่สำคัญต่อโมดูล (ตัวอย่างเช่น Java) สิ่งสำคัญคือการเลือกชื่อไดเรกทอรีที่ ตัวระบุที่ถูกต้องในภาษานั้นๆ เช่น อย่าขึ้นต้นด้วย นําหน้า และหลีกเลี่ยงการใช้อักขระพิเศษ โดยเฉพาะขีดล่างและขีดกลาง
- แม้ว่า Bazel จะรองรับเป้าหมายในแพ็กเกจรูทของพื้นที่ทำงาน (ตัวอย่างเช่น
//:foo
) ควรปล่อยแพ็กเกจว่างไว้เพื่อให้แพ็กเกจทั้งหมดมีความหมาย มีชื่อที่สื่อความหมาย
กฎ
กฎจะระบุความสัมพันธ์ระหว่างอินพุตและเอาต์พุต และ ในการสร้างเอาต์พุต กฎอาจเป็นอย่างใดอย่างหนึ่ง (บางครั้งเรียกว่า คลาสกฎ) ซึ่งสร้างการรวบรวม ไฟล์ปฏิบัติการและไลบรารี ทดสอบไฟล์ปฏิบัติการและไฟล์อื่นๆ ที่สนับสนุน เอาต์พุตตามที่อธิบายไว้ใน Build Encyclopedia
ไฟล์ BUILD
รายการจะประกาศเป้าหมายโดยการเรียกใช้กฎ
เราดูการประกาศเป้าหมาย my_app
ในตัวอย่างด้านล่าง
โดยใช้กฎ cc_binary
cc_binary(
name = "my_app",
srcs = ["my_app.cc"],
deps = [
"//absl/base",
"//absl/strings",
],
)
การเรียกใช้กฎทุกรายการจะมีแอตทริบิวต์ name
(ซึ่งต้องเป็นแอตทริบิวต์ที่ถูกต้อง
ชื่อเป้าหมาย) ที่ประกาศเป้าหมายภายในแพ็กเกจ
ของไฟล์ BUILD
ทุกกฎจะมีชุดแอตทริบิวต์ แอตทริบิวต์ที่เกี่ยวข้องสำหรับ และความสำคัญและความหมายของแอตทริบิวต์แต่ละรายการเป็นฟังก์ชันของ ประเภทของกฎ โปรดดูสารานุกรมสำหรับ รายการกฎและแอตทริบิวต์ที่เกี่ยวข้อง แอตทริบิวต์แต่ละรายการมีชื่อและ ประเภท ประเภททั่วไปที่แอตทริบิวต์อาจมีคือจำนวนเต็ม ป้ายกำกับ รายการ ป้ายกำกับ สตริง รายการสตริง ป้ายกำกับเอาต์พุต รายการป้ายกำกับเอาต์พุต ไม่ใช่ ต้องระบุแอตทริบิวต์ทั้งหมดในทุกกฎ แอตทริบิวต์จึงกลายเป็น พจนานุกรมจากคีย์ (ชื่อ) ไปจนถึงค่าที่พิมพ์หรือไม่ก็ได้
แอตทริบิวต์ srcs
ที่แสดงในกฎจำนวนมากมีประเภทเป็น "รายการป้ายกำกับ"
(หากมี) เป็นรายการป้ายกำกับ โดยแต่ละป้ายกำกับจะเป็นชื่อของเป้าหมายที่
อินพุตลงในกฎนี้
ในบางกรณี ชื่อของประเภทกฎจะค่อนข้างกำหนดเอง และอื่นๆ ก็คือชื่อของไฟล์ที่กฎสร้างขึ้น และนี่เป็นเรื่องจริง ของ Genrule สำหรับข้อมูลเพิ่มเติม โปรดดู กฎทั่วไป: genrule
ในกรณีอื่นๆ ชื่อมีความสำคัญ: สำหรับกฎ *_binary
และ *_test
ตัวอย่างเช่น ชื่อกฎจะกำหนดชื่อของไฟล์ปฏิบัติการที่สร้างโดย
งานสร้าง
กราฟแบบวนซ้ำที่มีทิศทางเหนือเป้าหมายนี้เรียกว่ากราฟเป้าหมาย หรือ กราฟการสร้างทรัพยากร Dependency และเป็นโดเมนที่ เครื่องมือ Query ของ Bazel จะทำงาน
เป้าหมาย | สร้างไฟล์ |