ป้ายกำกับ

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

ป้ายกำกับคือตัวระบุของเป้าหมาย ป้ายกำกับทั่วไปใน Canonical แบบเต็ม ฟอร์มมีลักษณะเช่นนี้:

@@myrepo//my/app/main:app_binary

ส่วนแรกของป้ายกำกับคือชื่อที่เก็บ @@myrepo ดับเบิล-@ ทางไวยากรณ์หมายความว่านี่เป็นที่เก็บ Canonical name ซึ่งเป็นชื่อที่ไม่ซ้ำกันภายใน พื้นที่ทำงาน ป้ายกำกับที่มีชื่อที่เก็บตามรูปแบบบัญญัติระบุเป้าหมายอย่างชัดเจน ไม่ว่าจะปรากฏในบริบทใด

บ่อยครั้งที่ชื่อของที่เก็บแบบมาตรฐานจะเป็นสตริง Arcane ที่มีลักษณะดังนี้ @@rules_java~7.1.0~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

ชื่อเป้าหมายต้องประกอบด้วยอักขระทั้งหมดจากชุด 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 ที่แสดงในกฎจำนวนมากมีประเภทเป็น "รายการป้ายกำกับ" (หากมี) เป็นรายการป้ายกำกับ โดยแต่ละป้ายกำกับจะเป็นชื่อของเป้าหมายที่ อินพุตลงในกฎนี้

ในบางกรณี ชื่อของประเภทกฎจะค่อนข้างกำหนดเอง และอื่นๆ ก็คือชื่อของไฟล์ที่กฎสร้างขึ้น และนี่คือเรื่องจริง ของ Genrule สำหรับข้อมูลเพิ่มเติม โปรดดู กฎทั่วไป: genrule

ในกรณีอื่นๆ ชื่อมีความสำคัญ: สำหรับกฎ *_binary และ *_test ตัวอย่างเช่น ชื่อกฎจะกำหนดชื่อของไฟล์ปฏิบัติการที่สร้างโดย งานสร้าง

กราฟแบบวนซ้ำที่มีทิศทางเหนือเป้าหมายนี้เรียกว่ากราฟเป้าหมาย หรือ กราฟการสร้างทรัพยากร Dependency และเป็นโดเมนที่ เครื่องมือ Query ของ Bazel จะทำงาน

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