เป้าหมายทั้งหมดอยู่ในแพ็กเกจเดียว ชื่อของเป้าหมายเรียกว่าป้ายกํากับ ป้ายกำกับแต่ละรายการระบุเป้าหมายได้โดยไม่ซ้ำกัน ป้ายกํากับทั่วไปในรูปแบบตามรูปแบบบัญญัติมีลักษณะดังนี้
@myrepo//my/app/main:app_binary
ส่วนแรกของป้ายกำกับคือชื่อที่เก็บ @myrepo//
ในกรณีทั่วไปที่ป้ายกำกับอ้างอิงถึงที่เก็บเดียวกันกับที่ใช้ป้ายกำกับนั้น ตัวระบุที่เก็บอาจย่อเป็น //
ดังนั้น ภายใน @myrepo
ป้ายกำกับนี้มักจะเขียนเป็น
//my/app/main:app_binary
ส่วนที่สองของป้ายกำกับคือชื่อแพ็กเกจแบบไม่ระบุข้อกำหนด 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
ตามลำดับ แต่เมื่อ Bazel คาดหวังแพ็กเกจ (เช่น ในข้อกำหนด 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 วิธีไม่ถูกต้อง 1 วิธีถูกต้อง) ในการอ้างอิงไฟล์นี้ภายใน//my/app:BUILD
ไม่ถูกต้อง — testdata
เป็นแพ็กเกจอื่น คุณจึงใช้เส้นทางแบบสัมพัทธ์ไม่ได้
testdata/testdepot.zip
ถูกต้อง — อ้างอิง testdata
ด้วยเส้นทางแบบเต็ม
//my/app/testdata:testdepot.zip
ป้ายกำกับที่ขึ้นต้นด้วย @//
คือการอ้างอิงถึงแท็กหลัก
ซึ่งยังคงใช้งานได้แม้จากที่เก็บภายนอก
ดังนั้น @//a/b/c
จึงแตกต่างจาก
//a/b/c
เมื่ออ้างอิงจากที่เก็บภายนอก
รายการแรกอ้างอิงกลับไปยังที่เก็บหลัก ในขณะที่รายการหลังอ้างอิงกลับไปยังที่เก็บหลัก
จะค้นหา //a/b/c
ในที่เก็บภายนอกเอง
ซึ่งจะเกี่ยวข้องโดยเฉพาะเมื่อเขียนกฎใน
ที่เก็บซึ่งอ้างถึงเป้าหมายในที่เก็บหลัก และจะ
ที่ใช้จากที่เก็บภายนอก
สำหรับข้อมูลเกี่ยวกับวิธีต่างๆ ที่คุณสามารถอ้างอิงถึงเป้าหมาย โปรดดู รูปแบบเป้าหมาย
ข้อกําหนดเชิงคําของป้ายกํากับ
ไวยากรณ์ของป้ายกำกับไม่สนับสนุนการใช้อักขระเมตาที่มีความหมายพิเศษกับ Shell วิธีนี้ช่วยหลีกเลี่ยงปัญหาการอ้างอิงโดยไม่ตั้งใจ และช่วยให้สร้างเครื่องมือและสคริปต์ที่จัดการกับป้ายกำกับได้ง่ายขึ้น เช่น Bazel Query Language
โปรดดูรายละเอียดที่แน่นอนของชื่อเป้าหมายที่อนุญาตด้านล่าง
ชื่อเป้าหมาย — package-name:target-name
target-name
คือชื่อของเป้าหมายภายในแพ็กเกจ ชื่อของกฎคือค่าของแอตทริบิวต์ name
ในการประกาศกฎในไฟล์ BUILD
ส่วนชื่อของไฟล์คือเส้นทางของไฟล์ซึ่งสัมพันธ์กับไดเรกทอรีที่มีไฟล์ 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
ชื่อแพ็กเกจต้องประกอบด้วยอักขระจากชุด 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
ที่มีอยู่ในกฎหลายข้อมีประเภทเป็น "รายการป้ายกำกับ" ค่าของแอตทริบิวต์นี้คือรายการป้ายกำกับ (หากมี) โดยแต่ละรายการจะเป็นชื่อของเป้าหมายที่เป็นอินพุตของกฎนี้
ในบางกรณี ชื่อของประเภทกฎอาจกำหนดขึ้นเอง และที่น่าสนใจกว่าคือชื่อของไฟล์ที่กฎสร้างขึ้น ซึ่งในกรณีนี้ก็คือ genrules สำหรับข้อมูลเพิ่มเติม โปรดดู กฎทั่วไป: genrule
ในกรณีอื่นๆ ชื่อจะมีความหมาย เช่น สําหรับกฎ *_binary
และ *_test
ชื่อกฎจะเป็นตัวกําหนดชื่อไฟล์ปฏิบัติการที่บิลด์สร้างขึ้น
กราฟแบบวนซ้ำที่มีทิศทางเหนือเป้าหมายนี้เรียกว่ากราฟเป้าหมาย หรือ กราฟการสร้างทรัพยากร Dependency และเป็นโดเมนที่ เครื่องมือ Query ของ Bazel จะทำงาน
เป้าหมาย | สร้างไฟล์ |