ป้ายกำกับ

รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.4 ที่ใช้เวลาเพียง 2 นาที 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

@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

ชื่อเป้าหมายต้องประกอบด้วยอักขระจากชุด az, AZ, 09 และสัญลักษณ์เครื่องหมายวรรคตอน !%-@^_"#$&'()*-+,;<=>?[]{|}~/. ทั้งหมด

ชื่อไฟล์ต้องเป็นชื่อพาธสัมพัทธ์ในรูปแบบปกติ ซึ่งหมายความว่า ไม่ขึ้นต้นหรือลงท้ายด้วยเครื่องหมายทับ (เช่น /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, az, 09, '/', '-', '.', '@' และ '_' เท่านั้น และต้องไม่ขึ้นต้นด้วยเครื่องหมายทับ

สำหรับภาษาที่มีโครงสร้างไดเรกทอรีที่สำคัญต่อโมดูล (ตัวอย่างเช่น 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 จะทำงาน

เป้าหมาย สร้างไฟล์