การดำเนินการ
คำสั่งที่จะเรียกใช้ระหว่างการสร้าง เช่น การเรียกคอมไพเลอร์ที่ใช้อาร์ติแฟกต์เป็นอินพุตและสร้างอาร์ติแฟกต์อื่นๆ เป็นเอาต์พุต รวมถึงข้อมูลเมตา เช่น อาร์กิวเมนต์บรรทัดคำสั่ง คีย์การดำเนินการ ตัวแปรสภาพแวดล้อม และอาร์ติแฟกต์อินพุต/เอาต์พุตที่ประกาศ
ดูข้อมูลเพิ่มเติมได้ที่ เอกสารประกอบเกี่ยวกับกฎ
แคชการดำเนินการ
แคชในดิสก์ที่จัดเก็บการแมปการดำเนินการที่ใช้กับเอาต์พุตที่สร้างขึ้น คีย์แคชเรียกว่าคีย์การดำเนินการ คอมโพเนนต์หลักสำหรับรูปแบบการทํางานแบบเพิ่มของ Bazel ระบบจะจัดเก็บแคชไว้ในไดเรกทอรีฐานเอาต์พุต จึงจะยังคงอยู่เมื่อเซิร์ฟเวอร์ Bazel รีสตาร์ท
กราฟการดำเนินการ
กราฟในหน่วยความจําของการดําเนินการและอาร์ติแฟกต์ที่การดําเนินการเหล่านี้อ่านและสร้าง กราฟอาจประกอบด้วยอาร์ติแฟกต์ที่เป็นไฟล์ต้นฉบับ (เช่น ในระบบไฟล์) รวมถึงอาร์ติแฟกต์ระดับกลาง/ขั้นสุดท้ายที่สร้างขึ้นซึ่งไม่ได้กล่าวถึงในไฟล์ BUILD
สร้างขึ้นระหว่างระยะการวิเคราะห์และใช้ระหว่างระยะการดำเนินการ
การค้นหากราฟการดำเนินการ (aquery)
เครื่องมือการค้นหาที่สามารถค้นหาการดำเนินการของบิลด์ ซึ่งจะช่วยให้วิเคราะห์ได้ว่ากฎของบิลด์ส่งผลต่อการทำงานจริงของบิลด์อย่างไร
คีย์การดำเนินการ
คีย์แคชของการดำเนินการ คำนวณตามข้อมูลเมตาของการดำเนินการ ซึ่งอาจรวมถึงคำสั่งที่จะดำเนินการในการดำเนินการ แฟล็กคอมไพเลอร์ ตำแหน่งไลบรารี หรือส่วนหัวของระบบ ทั้งนี้ขึ้นอยู่กับการดำเนินการ ช่วยให้ Bazel แคชหรือ ล้างการดำเนินการแต่ละรายการได้อย่างแน่นอน
ระยะการวิเคราะห์
เฟสที่ 2 ของบิลด์ ประมวลผลกราฟเป้าหมายที่ระบุไว้ในไฟล์ BUILD
เพื่อสร้างกราฟการดำเนินการในหน่วยความจำ ซึ่งจะกำหนดลำดับการดำเนินการที่จะทำงานในช่วงระยะการดําเนินการ ระยะนี้คือระยะที่ประเมินการติดตั้งใช้งานกฎ
อาร์ติแฟกต์
ไฟล์ต้นฉบับหรือไฟล์ที่สร้างขึ้น หรืออาจเป็นไดเรกทอรีของไฟล์ที่เรียกว่าอาร์ติแฟกต์แผนผัง
อาร์ติแฟกต์อาจเป็นอินพุตของการดำเนินการหลายอย่าง แต่ต้องสร้างขึ้นจากการดำเนินการอย่างน้อย 1 อย่างเท่านั้น
อาร์ติแฟกต์ที่สอดคล้องกับเป้าหมายไฟล์สามารถระบุได้ด้วยป้ายกำกับ
Aspect
กลไกสําหรับกฎในการสร้างการดําเนินการเพิ่มเติมในรายการที่ขึ้นต่อกัน เช่น หากเป้าหมาย A ขึ้นอยู่กับ B ผู้ใช้สามารถใช้ Aspect ใน A ที่มีทิศทางพุ่งขึ้นตามขอบของกราฟการขึ้นต่อกันไปยัง B และเรียกใช้การดำเนินการเพิ่มเติมใน B เพื่อสร้างและรวบรวมไฟล์เอาต์พุตเพิ่มเติม ระบบจะแคชการดําเนินการเพิ่มเติมเหล่านี้ไว้และนําไปใช้ซ้ำระหว่างเป้าหมายที่จําเป็นต้องใช้ Aspect เดียวกัน สร้างด้วย
aspect()
ฟังก์ชัน Starlark Build API สามารถใช้ได้ เช่น เพื่อสร้างข้อมูลเมตาสําหรับ IDE และสร้างการดำเนินการสําหรับการวิเคราะห์ซอร์สโค้ด
ดูข้อมูลเพิ่มเติมได้ที่ เอกสารประกอบเกี่ยวกับ Aspect
Aspect-on-aspect
กลไกการคอมโพสิชันที่สามารถใช้ Aspect กับผลลัพธ์ของ Aspect อื่นๆ ได้ ตัวอย่างเช่น คุณสามารถใช้ Aspect ที่สร้างข้อมูลให้ IDE ใช้ได้กับ Aspect ที่สร้างไฟล์ .java
จาก proto
หากต้องการให้ Aspect A
มีผลเหนือ Aspect B
ผู้ให้บริการที่ B
โฆษณาในแอตทริบิวต์ provides
ต้องตรงกับสิ่งที่ A
ประกาศว่าต้องการในแอตทริบิวต์ required_aspect_providers
แอตทริบิวต์
พารามิเตอร์ของกฎที่ใช้แสดงข้อมูลบิลด์ต่อเป้าหมาย
ตัวอย่างเช่น srcs
, deps
และ copts
ซึ่งจะประกาศไฟล์ต้นฉบับของเป้าหมาย ไลบรารีที่ใช้ร่วมกัน และตัวเลือกคอมไพเลอร์ที่กำหนดเองตามลำดับ แอตทริบิวต์ที่พร้อมใช้งานสําหรับเป้าหมายหนึ่งๆ จะขึ้นอยู่กับประเภทกฎ
.bazelrc
ไฟล์การกำหนดค่าของ Bazel ใช้เพื่อเปลี่ยนค่าเริ่มต้นสำหรับFlag เริ่มต้นและFlag คำสั่ง รวมถึงเพื่อกำหนดกลุ่มตัวเลือกทั่วไปที่สามารถตั้งค่าร่วมกันในบรรทัดคำสั่งของ Bazel โดยใช้ Flag --config
Bazel สามารถรวมการตั้งค่าจากไฟล์ bazelrc หลายไฟล์
(ทั่วทั้งระบบ ต่อพื้นที่ทำงาน ต่อผู้ใช้ หรือจากตำแหน่งที่กำหนดเอง) และไฟล์ bazelrc
อาจนำเข้าการตั้งค่าจากไฟล์ bazelrc
อื่นๆ ได้ด้วย
Blaze
Bazel เวอร์ชันภายในของ Google ระบบบิลด์หลักของ Google สำหรับ ที่เก็บข้อมูลแบบโมโน
ไฟล์ BUILD
ไฟล์ BUILD
คือไฟล์การกําหนดค่าหลักที่บอก Bazel ว่าต้องสร้างเอาต์พุตซอฟต์แวร์ใด รายการใดบ้างที่ขึ้นต่อกัน และวิธีสร้าง Bazel จะรับไฟล์ BUILD
เป็นอินพุต และใช้ไฟล์ดังกล่าวเพื่อสร้างกราฟการขึ้นต่อกัน และดึงข้อมูลการดําเนินการที่ต้องทำเพื่อสร้างเอาต์พุตซอฟต์แวร์ระดับกลางและขั้นสุดท้าย ไฟล์ BUILD
จะทําเครื่องหมายไดเรกทอรีและไดเรกทอรีย่อยที่ไม่มีไฟล์ BUILD
เป็นแพ็กเกจ และอาจมีเป้าหมายที่สร้างขึ้นโดยกฎ หรือจะตั้งชื่อไฟล์เป็น
BUILD.bazel
ก็ได้
ไฟล์ BUILD.bazel
ดูไฟล์ BUILD
มีความสำคัญเหนือกว่าไฟล์ BUILD
ในไดเรกทอรีเดียวกัน
ไฟล์ .bzl
ไฟล์ที่กําหนดกฎ มาโคร และค่าคงที่ที่เขียนใน Starlark จากนั้นจะนําเข้าข้อมูลเหล่านี้ไปยังไฟล์ BUILD
ได้โดยใช้ฟังก์ชัน load()
กราฟบิลด์
กราฟการขึ้นต่อกันที่ Bazel สร้างและเรียกใช้เพื่อทำการบิลด์ ซึ่งรวมถึงโหนดต่างๆ เช่น เป้าหมาย เป้าหมายที่กําหนดค่าแล้ว การดําเนินการ และอาร์ติแฟกต์ ระบบจะถือว่าบิลด์เสร็จสมบูรณ์เมื่ออาร์ติแฟกต์ทั้งหมดที่ชุดเป้าหมายที่ขอใช้นั้นได้รับการยืนยันแล้วว่าเป็นเวอร์ชันล่าสุด
การตั้งค่าบิลด์
การกําหนดค่าที่ Starlark กำหนด ทรานซิชันสามารถตั้งค่าการสร้างเพื่อเปลี่ยนการกำหนดค่าของกราฟย่อย หากแสดงต่อผู้ใช้เป็นFlag บรรทัดคำสั่ง หรือที่เรียกว่า Flag บิลด์
บิลด์เปล่า
บิลด์ที่ไม่ได้ใช้ผลลัพธ์ของบิลด์ก่อนหน้า โดยทั่วไปแล้ววิธีนี้จะช้ากว่าบิลด์แบบเพิ่ม แต่มักถือว่าถูกต้องกว่า Bazel รับประกันว่าทั้งบิลด์เปล่าและบิลด์แบบเพิ่มจะถูกต้องเสมอ
รูปแบบไคลเอ็นต์-เซิร์ฟเวอร์
ไคลเอ็นต์บรรทัดคำสั่ง bazel
จะเริ่มต้นเซิร์ฟเวอร์เบื้องหลังบนเครื่องโดยอัตโนมัติเพื่อเรียกใช้คําสั่ง Bazel เซิร์ฟเวอร์จะยังคงทำงานอยู่สำหรับคำสั่งต่างๆ แต่จะหยุดโดยอัตโนมัติหลังจากไม่มีการใช้งานเป็นระยะเวลาหนึ่ง (หรือผ่านคำสั่ง "bazel shutdown" อย่างชัดแจ้ง) การแยก Bazel เป็นเซิร์ฟเวอร์และไคลเอ็นต์จะช่วยกระจายเวลาเริ่มต้นของ JVM และรองรับบิลด์แบบเพิ่มได้เร็วขึ้นเนื่องจากกราฟการดำเนินการจะยังคงอยู่ในหน่วยความจำสำหรับคำสั่งต่างๆ
คำสั่ง
ใช้ในบรรทัดคำสั่งเพื่อเรียกใช้ฟังก์ชัน Bazel ต่างๆ เช่น bazel
build
, bazel test
, bazel run
และ bazel query
Flag คำสั่ง
ชุดแฟล็กที่เฉพาะเจาะจงสำหรับคำสั่ง ระบุ Flag ของคำสั่งหลังจากคำสั่ง (bazel build <command flags>
) โดย Flag อาจใช้กับคำสั่งอย่างน้อย 1 รายการ
ตัวอย่างเช่น --configure
เป็น Flag สำหรับคำสั่ง bazel sync
เท่านั้น แต่ --keep_going
ใช้ได้กับ sync
, build
, test
และอื่นๆ มักใช้แฟล็กเพื่อวัตถุประสงค์ในการกำหนดค่า
ดังนั้นการเปลี่ยนแปลงค่าแฟล็กอาจทำให้ Bazel ล้างกราฟในหน่วยความจำ
และรีสตาร์ทระยะการวิเคราะห์
การกำหนดค่า
ข้อมูลนอกคําจํากัดความของกฎที่ส่งผลต่อวิธีสร้างการดําเนินการของกฎ บิลด์ทุกรายการมีการกําหนดค่าอย่างน้อย 1 รายการที่ระบุแพลตฟอร์มเป้าหมาย ตัวแปรสภาพแวดล้อมการดำเนินการ และ Flag บิลด์บรรทัดคำสั่ง การเปลี่ยนอาจสร้างการกำหนดค่าเพิ่มเติม เช่น สําหรับเครื่องมือโฮสต์หรือการคอมไพล์แบบข้ามระบบ
ดูเพิ่มเติม การกำหนดค่า
การตัดแต่งการกำหนดค่า
กระบวนการรวมเฉพาะการกําหนดค่าที่เป้าหมายจําเป็นต้องใช้เท่านั้น เช่น หากคุณสร้างไบนารี Java //:j
ที่มี C++ Dependency //:c
จะเป็นการสิ้นเปลืองหากรวมค่าของ --javacopt
ไว้ในการกำหนดค่าของ //:c
เนื่องจากการเปลี่ยนแปลง --javacopt
จะทําลายความสามารถในการแคชบิลด์ของ C++ โดยไม่จําเป็น
การค้นหาที่กำหนดค่า (cquery)
เครื่องมือการค้นหาที่ค้นหาเป้าหมายที่กําหนดค่าไว้ (หลังจากระยะการวิเคราะห์เสร็จสมบูรณ์) ซึ่งหมายความว่า select()
และ Flag บิลด์ (เช่น --platforms
) จะแสดงผลในผลการค้นหาอย่างถูกต้อง
ดูข้อมูลเพิ่มเติมได้ที่ เอกสารประกอบเกี่ยวกับ cquery
เป้าหมายที่กำหนดค่า
ผลลัพธ์ของการประเมินเป้าหมายด้วยการกำหนดค่า ระยะการวิเคราะห์จะสร้างสิ่งนี้โดยการรวมตัวเลือกของบิลด์กับเป้าหมายที่ต้องสร้าง
เช่น หาก //:foo
สร้างขึ้นสำหรับสถาปัตยกรรม 2 แบบที่แตกต่างกันในการบิลด์เดียวกัน ก็จะมีเป้าหมายที่กำหนดค่าไว้ 2 รายการ ได้แก่ <//:foo, x86>
และ <//:foo, arm>
ความถูกต้อง
บิลด์จะถูกต้องเมื่อเอาต์พุตของบิลด์แสดงสถานะของอินพุตแบบทรานซิทีฟอย่างถูกต้อง Bazel พยายามที่จะปิดผนึก ทำซ้ำได้ และทำให้การวิเคราะห์ บิลด์และการดำเนินการ เป็นแบบดีเทอร์มินิสติกเพื่อให้ได้บิลด์ที่ถูกต้อง
การขึ้นต่อกัน
ขอบที่กํากับทิศระหว่างเป้าหมาย 2 รายการ เป้าหมาย //:foo
มีการอ้างอิงเป้าหมายในเป้าหมาย //:bar
หากค่าแอตทริบิวต์ของ //:foo
มีการอ้างอิงถึง //:bar
//:foo
มีการขึ้นต่อกันของการดำเนินการกับ //:bar
หากการดำเนินการใน //:foo
ขึ้นอยู่กับอาร์ติแฟกต์อินพุตที่สร้างขึ้นโดยการดำเนินการใน //:bar
ในบางบริบท คำนี้อาจหมายถึงการอ้างอิงภายนอกด้วย โปรดดูโมดูล
Depset
โครงสร้างข้อมูลสําหรับการรวบรวมข้อมูลเกี่ยวกับทรัพยากร Dependency แบบทรานซิทีฟ ได้รับการเพิ่มประสิทธิภาพเพื่อให้การผสานรวม Depset มีประสิทธิภาพทั้งด้านเวลาและพื้นที่ เนื่องจากมักจะมี Depset ขนาดใหญ่มาก (ไฟล์หลายแสนไฟล์) ใช้เพื่อ อ้างอิงชุดทรัพยากรอื่นๆ แบบเรียกซ้ำเพื่อเหตุผลด้านประสิทธิภาพของพื้นที่ กฎ การใช้งานไม่ควร "ทำให้" depsets แบนราบด้วยการแปลงเป็นรายการ เว้นแต่ กฎจะอยู่ที่ระดับบนสุดของกราฟการสร้าง การทำให้ Depset ขนาดใหญ่แบนราบจะทำให้ใช้หน่วยความจำ จำนวนมาก หรือที่เรียกว่าชุดที่ซ้อนกันในการใช้งานภายในของ Bazel
ดูข้อมูลเพิ่มเติมได้ที่ เอกสารประกอบเกี่ยวกับ Depset
แคชดิสก์
ที่เก็บ Blob ในเครื่องสำหรับฟีเจอร์การแคชระยะไกล ใช้ร่วมกับที่เก็บข้อมูลออบเจ็กต์ระยะไกลจริงได้
Distdir
ไดเรกทอรีแบบอ่านอย่างเดียวที่มีไฟล์ที่ Bazel จะดึงข้อมูลจากอินเทอร์เน็ตโดยใช้กฎของที่เก็บ ช่วยให้บิลด์ทำงานแบบออฟไลน์ได้อย่างเต็มที่
การดำเนินการแบบไดนามิก
กลยุทธ์การดำเนินการที่เลือกระหว่างการดำเนินการในเครื่องและการดำเนินการจากระยะไกลตาม ฮิวริสติกต่างๆ และใช้ผลการดำเนินการของวิธีการที่สำเร็จเร็วที่สุด การดำเนินการบางอย่างจะดำเนินการในเครื่องได้เร็วกว่า (เช่น การลิงก์) และการดำเนินการอื่นๆ จะดำเนินการจากระยะไกลได้เร็วกว่า (เช่น การคอมไพล์ ที่ขนานกันได้สูง) กลยุทธ์การดำเนินการแบบไดนามิกจะช่วยให้เวลาในการสร้างที่เพิ่มขึ้นและเวลาในการสร้างที่สะอาดดีที่สุดเท่าที่จะเป็นไปได้
ระยะการดำเนินการ
เฟสที่ 3 ของบิลด์ เรียกใช้การดำเนินการในกราฟการดำเนินการที่สร้างขึ้นในระยะการวิเคราะห์ การดำเนินการเหล่านี้จะเรียกใช้ไฟล์ที่ปฏิบัติการได้ (คอมไพเลอร์ สคริปต์) เพื่ออ่านและเขียนอาร์ติแฟกต์ กลยุทธ์การสร้างจะควบคุมวิธีดำเนินการต่อไปนี้ ในเครื่อง ระยะไกล แบบไดนามิก แซนด์บ็อกซ์ Docker และอื่นๆ
รูทการดำเนินการ
ไดเรกทอรีในพื้นที่ทำงานของไดเรกทอรีเอาต์พุตฐาน
ซึ่งมีการดำเนินการการดำเนินการในเครื่อง
ในบิลด์ที่ไม่ได้แซนด์บ็อกซ์ เนื้อหาในไดเรกทอรีส่วนใหญ่เป็นลิงก์สัญลักษณ์
ของอาร์ติแฟกต์อินพุตจากพื้นที่ทำงาน รูทการดำเนินการยังมี
ลิงก์สัญลักษณ์ไปยังที่เก็บภายนอกเป็นอินพุตอื่นๆ และbazel-out
ไดเรกทอรีสำหรับจัดเก็บเอาต์พุตด้วย เตรียมไว้ในระยะการโหลด
โดยการสร้างป่าลิงก์สัญลักษณ์ของไดเรกทอรีที่แสดงถึงการปิดทรานซิทีฟ
ของแพ็กเกจที่บิลด์ขึ้นอยู่กับ เข้าถึงได้ด้วย bazel info
execution_root
ในบรรทัดคำสั่ง
ไฟล์
การเป็นระบบปิด
บิลด์จะเป็นระบบปิดหากไม่มีปัจจัยภายนอกที่ส่งผลต่อบิลด์และการทดสอบ ซึ่งช่วยให้มั่นใจได้ว่าผลลัพธ์จะแน่นอนและถูกต้อง ตัวอย่างเช่น โดยทั่วไปแล้วบิลด์แบบระบบปิดจะไม่อนุญาตให้เครือข่ายเข้าถึงการดำเนินการ จำกัดการเข้าถึงอินพุตที่ประกาศ ใช้การประทับเวลาและเขตเวลาแบบคงที่ จำกัดการเข้าถึงตัวแปรสภาพแวดล้อม และใช้ค่าตั้งต้นแบบคงที่สำหรับเครื่องมือสร้างตัวเลขสุ่ม
บิลด์แบบเพิ่ม
บิลด์แบบเพิ่มจะนําผลลัพธ์ของบิลด์ก่อนหน้ามาใช้ซ้ำเพื่อลดเวลาบิลด์และการใช้ทรัพยากร การตรวจสอบและแคชการขึ้นต่อกันมีจุดประสงค์เพื่อให้ได้ผลลัพธ์ที่ถูกต้องสำหรับบิลด์ประเภทนี้ บิลด์แบบเพิ่มจะตรงข้ามกับบิลด์เปล่า
ป้ายกำกับ
ตัวระบุสำหรับเป้าหมาย โดยทั่วไปจะมีรูปแบบเป็น
@repo//path/to/package:target
โดยที่ repo
คือชื่อ (ที่ปรากฏ) ของ
ที่เก็บที่มีเป้าหมาย path/to/package
คือเส้นทาง
ไปยังไดเรกทอรีที่มีไฟล์ BUILD
ที่ประกาศ
เป้าหมาย (ไดเรกทอรีนี้เรียกอีกอย่างว่าแพ็กเกจ) และ target
คือชื่อของเป้าหมายเอง ระบบอาจละเว้นบางส่วนของไวยากรณ์นี้ ทั้งนี้ขึ้นอยู่กับสถานการณ์
ดูเพิ่มเติม: ป้ายกำกับ
ระยะการโหลด
ระยะแรกของการสร้างที่ Bazel เรียกใช้ไฟล์ BUILD
เพื่อสร้างแพ็กเกจ ระบบจะประเมินมาโครและฟังก์ชันบางอย่าง เช่น glob()
ในระยะนี้ แทรกอยู่ในระยะที่ 2 ของบิลด์ ซึ่งก็คือระยะการวิเคราะห์ เพื่อสร้างกราฟเป้าหมาย
มาโครเดิม
รูปแบบของมาโครที่ประกาศเป็นฟังก์ชัน Starlark ทั่วไป และทํางานเป็นผลข้างเคียงของการเรียกใช้ไฟล์ BUILD
มาโครเดิมทำได้ทุกอย่างที่ฟังก์ชันทำได้ ซึ่งอาจสะดวก
แต่ก็อาจอ่าน เขียน และใช้งานได้ยากกว่าด้วย มาโครเดิมอาจ
เปลี่ยนแปลงอาร์กิวเมนต์โดยไม่คาดคิดหรือล้มเหลวเมื่อได้รับอาร์กิวเมนต์ select()
หรืออาร์กิวเมนต์ที่มีการพิมพ์ไม่ถูกต้อง
เปรียบเทียบกับมาโครสัญลักษณ์
ดูข้อมูลเพิ่มเติมได้ที่ เอกสารประกอบเกี่ยวกับมาโครเดิม
มาโคร
กลไกในการเขียนประกาศเป้าหมายกฎหลายรายการไว้ด้วยกันภายใต้ Starlark ที่เรียกใช้ได้รายการเดียว เปิดใช้การนํารูปแบบประกาศกฎทั่วไปไปใช้ซ้ำในไฟล์ BUILD
ขยายไปยังเป้าหมายกฎพื้นฐานที่มีการประกาศในช่วงระยะการโหลด
มี 2 รูปแบบ ได้แก่ มาโครสัญลักษณ์ (ตั้งแต่ Bazel 8) และมาโครเดิม
นิวมอนิกโค้ด
สตริงสั้นๆ ที่มนุษย์อ่านได้ซึ่งผู้เขียนกฎเลือกไว้เพื่อให้เข้าใจการดำเนินการในกฎได้อย่างรวดเร็ว คุณสามารถใช้เป็นตัวระบุสำหรับการเลือกกลยุทธ์การสร้าง ตัวอย่างนิวมอนิกโค้ดสําหรับการดําเนินการ ได้แก่ Javac
จากกฎ Java, CppCompile
จากกฎ C++ และ AndroidManifestMerger
จากกฎ Android
โมดูล
โปรเจ็กต์ Bazel ที่มีได้หลายเวอร์ชัน โดยแต่ละเวอร์ชันอาจมี การอ้างอิงโมดูลอื่นๆ ซึ่งคล้ายกับแนวคิดที่คุ้นเคยในระบบการจัดการทรัพยากร Dependency อื่นๆ เช่น Artifact ของ Maven, Package ของ npm, Module ของ Go หรือ Crate ของ Cargo โมดูลเป็นกระดูกสันหลังของระบบการจัดการ การอ้างอิงภายนอกของ Bazel
โมดูลแต่ละรายการได้รับการสนับสนุนจาก repo ที่มีไฟล์ MODULE.bazel
ที่รูท ไฟล์นี้มีข้อมูลเมตาเกี่ยวกับโมดูลเอง (เช่น ชื่อและเวอร์ชัน) โมดูลที่ขึ้นต่อกันโดยตรง และข้อมูลอื่นๆ อีกมากมาย รวมถึงการลงทะเบียน Toolchain และอินพุตส่วนขยายโมดูล
ระบบจะโฮสต์ข้อมูลเมตาของโมดูลในรีจิสทรี Bazel
ดูเพิ่มเติม: โมดูล Bazel
ส่วนขยายโมดูล
ตรรกะที่สามารถเรียกใช้เพื่อสร้าง repo โดยการอ่านอินพุตจากกราฟการขึ้นต่อกันของโมดูล และเรียกใช้กฎของ repo ส่วนขยายโมดูลมีความสามารถคล้ายกับกฎของ repo ซึ่งช่วยให้เข้าถึงอินเทอร์เน็ต ดำเนินการ I/O ของไฟล์ และอื่นๆ ได้
ดูเพิ่มเติม: ส่วนขยายโมดูล
กฎเนทีฟ
กฎที่สร้างไว้ใน Bazel และนำไปใช้ใน Java กฎดังกล่าวจะปรากฏในไฟล์ .bzl
เป็นฟังก์ชันในโมดูลเนทีฟ (เช่น native.cc_library
หรือ native.java_library
) ส่วนกฎที่ผู้ใช้กำหนด (ที่ไม่ใช่เนทีฟ) จะสร้างขึ้นโดยใช้ Starlark
ฐานเอาต์พุต
ไดเรกทอรีเฉพาะพื้นที่ทํางานสําหรับจัดเก็บไฟล์เอาต์พุตของ Bazel ใช้เพื่อแยกเอาต์พุตออกจากแผนผังที่มาของพื้นที่ทํางาน (repo หลัก) อยู่ในรูทผู้ใช้เอาต์พุต
กลุ่มเอาต์พุต
กลุ่มไฟล์ที่คาดว่าจะสร้างขึ้นเมื่อ Bazel สร้างเป้าหมายเสร็จ กฎจะวางเอาต์พุตปกติไว้ใน "กลุ่มเอาต์พุตเริ่มต้น"
(เช่น ไฟล์ .jar
ของ java_library
, .a
และ .so
สำหรับเป้าหมาย cc_library
) กลุ่มเอาต์พุตเริ่มต้นคือกลุ่มเอาต์พุตที่มีการสร้างอาร์ติแฟกต์เมื่อมีการขอเป้าหมายในบรรทัดคำสั่ง
กฎสามารถกำหนดกลุ่มเอาต์พุตที่มีชื่อเพิ่มเติมซึ่งระบุได้อย่างชัดเจนในBUILD
ไฟล์ (กฎ filegroup
) หรือบรรทัดคำสั่ง (แฟล็ก --output_groups
)
เอาต์พุตรูทของผู้ใช้
ไดเรกทอรีเฉพาะผู้ใช้สำหรับจัดเก็บเอาต์พุตของ Bazel ชื่อไดเรกทอรีได้มาจากชื่อผู้ใช้ระบบของผู้ใช้ ป้องกันการทับซ้อนของไฟล์เอาต์พุตในกรณีที่ ผู้ใช้หลายคนสร้างโปรเจ็กต์เดียวกันในระบบพร้อมกัน มีไดเรกทอรีย่อยที่สอดคล้องกับเอาต์พุตการสร้างของแต่ละพื้นที่ทำงาน หรือที่เรียกว่าฐานเอาต์พุต
แพ็กเกจ
ชุดเป้าหมายที่กําหนดโดยไฟล์ BUILD
ชื่อแพ็กเกจคือเส้นทางของไฟล์ BUILD
สัมพัทธ์กับรูท repo แพ็กเกจอาจมีแพ็กเกจย่อยหรือไดเรกทอรีย่อยที่มีไฟล์ BUILD
ซึ่งจะทำให้เกิดลําดับชั้นของแพ็กเกจ
กลุ่มแพ็กเกจ
เป้าหมายที่แสดงถึงชุดแพ็กเกจ มักใช้ในค่าแอตทริบิวต์ visibility
แพลตฟอร์ม
"ประเภทเครื่อง" ที่เกี่ยวข้องกับการสร้าง ซึ่งรวมถึงเครื่องที่ Bazel ทำงานอยู่ (แพลตฟอร์ม "โฮสต์"), เครื่องที่เครื่องมือบิลด์ทำงานอยู่ (แพลตฟอร์ม "exec") และเครื่องที่สร้างเป้าหมาย (แพลตฟอร์ม "เป้าหมาย")
ตัวจัดหาข้อมูล
สคีมาอธิบายหน่วยข้อมูลที่จะส่งระหว่างเป้าหมายกฎตามความสัมพันธ์แบบมีลําดับชั้น โดยปกติแล้วไฟล์นี้จะมีข้อมูล เช่น ตัวเลือกคอมไพเลอร์ ไฟล์ต้นทางหรือไฟล์เอาต์พุตแบบทรานซิทีฟ และข้อมูลเมตาของบิลด์ ใช้ร่วมกับ depsets บ่อยครั้งเพื่อจัดเก็บข้อมูลที่ส่งผ่านซึ่งสะสมไว้อย่างมีประสิทธิภาพ ตัวอย่างตัวจัดหาข้อมูลในตัวคือ DefaultInfo
ดูข้อมูลเพิ่มเติมได้ที่ เอกสารประกอบของตัวจัดหาข้อมูล
การค้นหา (แนวคิด)
กระบวนการวิเคราะห์กราฟบิลด์เพื่อทำความเข้าใจพร็อพเพอร์ตี้เป้าหมายและโครงสร้างการขึ้นต่อกัน Bazel รองรับรูปแบบการค้นหา 3 รูปแบบ ได้แก่ query, cquery และ aquery
คำค้นหา (คำสั่ง)
เครื่องมือการค้นหาที่ทำงานในกราฟเป้าหมายระยะหลังการโหลดของบิลด์ ซึ่งค่อนข้างรวดเร็ว
แต่ไม่สามารถวิเคราะห์ผลกระทบของ select()
, Build Flag,
อาร์ติแฟกต์ หรือการดำเนินการของบิลด์ได้
ดูเพิ่มเติม: วิธีการค้นหา การอ้างอิงการค้นหา
ที่เก็บ
แผนผังไดเรกทอรีที่มีไฟล์เครื่องหมายขอบเขตที่รูท ซึ่งมีไฟล์ต้นฉบับที่ใช้ได้ในบิลด์ Bazel มักเรียกสั้นๆ ว่า repo
ไฟล์เครื่องหมายขอบเขตของ repo อาจเป็น MODULE.bazel
(บ่งบอกว่า repo นี้แสดงโมดูล Bazel), REPO.bazel
หรือในบริบทเดิม WORKSPACE
หรือ WORKSPACE.bazel
ไฟล์เครื่องหมายขอบเขตของ repo จะระบุขอบเขตของ repo โดยไฟล์ดังกล่าวจะอยู่ในไดเรกทอรีร่วมกันได้หลายไฟล์
ที่เก็บหลักคือที่เก็บที่กำลังเรียกใช้คำสั่ง Bazel ปัจจุบัน
ที่เก็บข้อมูลภายนอกจะกำหนดโดยการระบุโมดูลในไฟล์ MODULE.bazel
หรือเรียกใช้กฎของ repo ในส่วนขยายของโมดูล โดยสามารถดึงข้อมูลได้ตามคําขอไปยังตําแหน่ง "วิเศษ" บนดิสก์ที่กำหนดไว้ล่วงหน้า
โดยแต่ละรีโปจะมีชื่อCanonical ที่ไม่ซ้ำกันและคงที่ และอาจมีชื่อApparent ที่แตกต่างกันเมื่อดูจากรีโปอื่น
ดูเพิ่มเติม: ภาพรวมของการอ้างอิงภายนอก
แคชที่เก็บ
แคชที่ระบุเนื้อหาซึ่งแชร์สำหรับไฟล์ที่ Bazel ดาวน์โหลดสำหรับบิลด์ ซึ่งแชร์ได้ทั่วทั้งพื้นที่ทำงาน เปิดใช้บิลด์แบบออฟไลน์หลังจากการดาวน์โหลดครั้งแรก มักใช้เพื่อแคชไฟล์ที่ดาวน์โหลดผ่านกฎของที่เก็บ เช่น http_archive
และ API กฎของที่เก็บ เช่น repository_ctx.download
ระบบจะแคชไฟล์ก็ต่อเมื่อมีระบุการตรวจสอบ SHA-256 ไว้สำหรับการดาวน์โหลด
กฎที่เก็บ
สคีมาสำหรับคำจำกัดความของที่เก็บข้อมูลที่บอก Bazel ว่าจะแสดง (หรือ "ดึงข้อมูล") ที่เก็บข้อมูลอย่างไร มักเรียกสั้นๆ ว่ากฎของ repo
Bazel จะเรียกใช้กฎของ repo ภายในเพื่อกำหนด repo ที่รองรับโดยโมดูล หรือส่วนขยายโมดูลจะเรียกใช้กฎได้
กฎของ repo สามารถเข้าถึงอินเทอร์เน็ตหรือดำเนินการ I/O ของไฟล์ได้ กฎของ repo ที่ใช้กันมากที่สุดคือ http_archive
เพื่อดาวน์โหลดไฟล์เก็บถาวรที่มีไฟล์ต้นฉบับจากอินเทอร์เน็ต
ดูข้อมูลเพิ่มเติมได้ที่ เอกสารประกอบเกี่ยวกับกฎของ repo
ความสามารถในการทำซ้ำ
คุณสมบัติของบิลด์หรือการทดสอบที่ชุดอินพุตไปยังบิลด์หรือการทดสอบจะ สร้างชุดเอาต์พุตเดียวกันทุกครั้งเสมอ ไม่ว่าจะเป็นเวลา วิธีการ หรือสภาพแวดล้อม โปรดทราบว่าการดำเนินการนี้ไม่ได้หมายความว่าเอาต์พุตจะถูกต้องหรือเป็นเอาต์พุตที่ต้องการเสมอไป
กฎ
สคีมาสําหรับกําหนดเป้าหมายกฎในไฟล์ BUILD
เช่น
cc_library
ในมุมมองของผู้เขียนไฟล์ BUILD
กฎประกอบด้วยชุดแอตทริบิวต์และตรรกะกล่องดำ ตรรกะจะบอกเป้าหมายกฎวิธีสร้างอาร์ติแฟกต์เอาต์พุตและส่งข้อมูลไปยังเป้าหมายกฎอื่นๆ ในมุมมองของ.bzl
ผู้เขียน กฎเป็นวิธีหลักในการขยาย Bazel เพื่อรองรับภาษาโปรแกรมและสภาพแวดล้อมใหม่ๆ
ระบบจะสร้างอินสแตนซ์ของกฎเพื่อสร้างเป้าหมายกฎในระยะการโหลด ในระยะการวิเคราะห์ เป้าหมายของกฎจะสื่อสารข้อมูลไปยังการขึ้นต่อกันแบบดาวน์สตรีมในรูปแบบของตัวจัดหาข้อมูล และลงทะเบียนการดำเนินการที่อธิบายวิธีสร้างอาร์ติแฟกต์เอาต์พุต ระบบจะเรียกใช้การดำเนินการเหล่านี้ในระยะการดําเนินการ
ดูข้อมูลเพิ่มเติมได้ที่ เอกสารประกอบเกี่ยวกับกฎ
เป้าหมายของกฎ
เป้าหมายที่เป็นอินสแตนซ์ของกฎ แตกต่างจากเป้าหมายไฟล์ และกลุ่มแพ็กเกจ อย่าสับสนกับกฎ
Runfiles
ทรัพยากร Dependency ของรันไทม์ของเป้าหมายที่เรียกใช้งานได้ โดยส่วนใหญ่แล้ว ไฟล์ที่เรียกใช้งานได้คือเอาต์พุตที่เรียกใช้งานได้ของกฎการทดสอบ และไฟล์ที่เรียกใช้คือการขึ้นต่อกันของข้อมูลรันไทม์ ของการทดสอบ ก่อนเรียกใช้ไฟล์ที่เรียกใช้งานได้ (ระหว่าง bazel test) Bazel จะเตรียมโครงสร้างของไฟล์ที่เรียกใช้ได้ควบคู่กับไฟล์ที่เรียกใช้งานได้ของเทสต์ ตามโครงสร้างไดเรกทอรีแหล่งที่มา
ดูข้อมูลเพิ่มเติมได้ที่ เอกสารประกอบเกี่ยวกับไฟล์รันไทม์
แซนด์บ็อกซ์
เทคนิคในการแยกการดำเนินการที่ทำงานอยู่ภายในรูทการเรียกใช้ที่ถูกจํากัดและชั่วคราว ซึ่งช่วยให้มั่นใจว่าการดำเนินการดังกล่าวจะไม่อ่านอินพุตที่ไม่ได้ประกาศหรือเขียนเอาต์พุตที่ไม่ได้ประกาศ การใช้แซนด์บ็อกซ์ช่วยเพิ่มความเป็นระบบปิดได้อย่างมาก แต่มักจะมีต้นทุนด้านประสิทธิภาพและต้องใช้การสนับสนุนจากระบบปฏิบัติการ ค่าใช้จ่ายด้านประสิทธิภาพจะขึ้นอยู่กับแพลตฟอร์ม ใน Linux จะไม่ส่งผลมากนัก แต่อาจทำให้ใช้แซนด์บ็อกซ์ไม่ได้ใน macOS
Skyframe
Skyframe เป็นเฟรมเวิร์กการประเมินแบบขนาน ฟังก์ชัน และแบบเพิ่มทีละรายการหลักของ Bazel
การประทับ
ฟีเจอร์สำหรับฝังข้อมูลเพิ่มเติมลงในอาร์ติแฟกต์ที่ Bazel สร้างขึ้น เช่น สามารถใช้สำหรับการควบคุมแหล่งที่มา เวลาบิลด์ และข้อมูลอื่นๆ เกี่ยวกับพื้นที่ทำงานหรือสภาพแวดล้อมสำหรับบิลด์ที่เผยแพร่
เปิดใช้ผ่าน Flag --workspace_status_command
และกฎที่รองรับแอตทริบิวต์การประทับ
Starlark
ภาษาส่วนขยายสําหรับเขียนกฎและมาโคร ชุดย่อยของ Python ที่จำกัด (ทางวากยสัมพันธ์และไวยากรณ์) ซึ่งมีไว้เพื่อกำหนดค่าและเพื่อประสิทธิภาพที่ดียิ่งขึ้น ใช้นามสกุลไฟล์ .bzl
ไฟล์ BUILD
ใช้ Starlark เวอร์ชันที่จำกัดมากขึ้น (เช่น ไม่มีคําจํากัดความของฟังก์ชัน def
) ซึ่งก่อนหน้านี้เรียกว่า Skylark
ดูข้อมูลเพิ่มเติมได้ที่ เอกสารประกอบเกี่ยวกับภาษา Starlark
แฟล็กเริ่มต้น
ชุดแฟล็กที่ระบุระหว่าง bazel
กับคำสั่ง
เช่น bazel --host_jvm_debug
build แฟล็กเหล่านี้จะแก้ไขการกำหนดค่าของเซิร์ฟเวอร์ Bazel ดังนั้นการแก้ไขแฟล็กเริ่มต้นจะทำให้เซิร์ฟเวอร์รีสตาร์ท โดยแฟล็กการเริ่มต้นใช้งานไม่ได้เจาะจงคำสั่งใดคำสั่งหนึ่ง
มาโครเชิงสัญลักษณ์
รูปแบบของมาโครที่ประกาศโดยใช้สคีมาแอตทริบิวต์ที่คล้ายกับกฎจะอนุญาตให้ซ่อนเป้าหมายที่ประกาศภายในจากแพ็กเกจของตนเอง และบังคับใช้รูปแบบการตั้งชื่อที่คาดเดาได้สำหรับเป้าหมายที่มาโครประกาศ ออกแบบมาเพื่อหลีกเลี่ยงปัญหาบางอย่างที่พบในฐานของโค้ดมาโครเดิมขนาดใหญ่
ดูข้อมูลเพิ่มเติมได้ที่ เอกสารประกอบเกี่ยวกับมาโครสัญลักษณ์
เป้าหมาย
ออบเจ็กต์ที่กำหนดไว้ในไฟล์ BUILD
และระบุด้วยป้ายกำกับ เป้าหมายแสดงถึงหน่วยที่สร้างได้ของพื้นที่ทำงานจากมุมมองของผู้ใช้ปลายทาง
เป้าหมายที่ประกาศโดยการสร้างอินสแตนซ์ของกฎเรียกว่าเป้าหมาย
กฎ โดยอาจเรียกใช้ได้ (เช่น cc_binary
) หรือทดสอบได้ (เช่น cc_test
) ทั้งนี้ขึ้นอยู่กับกฎ เป้าหมายของกฎมักขึ้นอยู่กับเป้าหมายอื่นๆ ผ่านแอตทริบิวต์ (เช่น deps
) ซึ่งการอ้างอิงเหล่านี้เป็นพื้นฐานของกราฟเป้าหมาย
นอกเหนือจากเป้าหมายกฎแล้ว ยังมีเป้าหมายไฟล์และเป้าหมายกลุ่มแพ็กเกจ
ด้วย เป้าหมายไฟล์จะสอดคล้องกับอาร์ติแฟกต์ที่มีการอ้างอิง
ภายในไฟล์ BUILD
ในกรณีพิเศษ BUILD
ไฟล์ของแพ็กเกจใดก็ตามจะ
ถือเป็นเป้าหมายไฟล์ต้นฉบับในแพ็กเกจนั้นเสมอ
ระบบจะค้นพบเป้าหมายในช่วงระยะการโหลด ในระหว่างระยะการวิเคราะห์ ระบบจะเชื่อมโยงเป้าหมายกับการกำหนดค่าบิลด์เพื่อสร้างเป้าหมายที่กำหนดค่าไว้
กราฟเป้าหมาย
กราฟในหน่วยความจำของเป้าหมายและการขึ้นต่อกัน สร้างขึ้นในระหว่างระยะการโหลด และใช้เป็นแหล่งข้อมูลในระยะการวิเคราะห์
รูปแบบเป้าหมาย
วิธีระบุกลุ่มเป้าหมายในบรรทัดคำสั่ง รูปแบบที่ใช้กันโดยทั่วไป ได้แก่ :all
(เป้าหมายกฎทั้งหมด), :*
(เป้าหมายกฎ + ไฟล์ทั้งหมด), ...
(แพ็กเกจปัจจุบันและแพ็กเกจย่อยทั้งหมดแบบซ้ำ) ใช้ร่วมกันได้ เช่น //...:*
หมายถึงเป้าหมายกฎและไฟล์ทั้งหมดในแพ็กเกจทั้งหมดแบบย้อนกลับจากรูทของพื้นที่ทำงาน
การทดสอบ
กฎเป้าหมายที่สร้างขึ้นจากกฎการทดสอบจึงมีไฟล์ที่เรียกใช้ได้สำหรับการทดสอบ รหัสคืนค่าเป็น 0 จากการดำเนินการที่เรียกใช้ได้ แสดงว่าการทดสอบสำเร็จ สัญญาที่แน่นอนระหว่าง Bazel กับการทดสอบ (เช่น ตัวแปรสภาพแวดล้อมของ การทดสอบ วิธีการรวบรวมผลการทดสอบ) จะระบุไว้ในสารานุกรมการทดสอบ
Toolchain
ชุดเครื่องมือในการสร้างเอาต์พุตสำหรับภาษาหนึ่งๆ โดยปกติแล้ว Toolchain จะประกอบด้วยคอมไพเลอร์ ลิงเกอร์ โปรแกรมแปลภาษา หรือ/และโปรแกรมวิเคราะห์ซอร์สโค้ด Toolchain ยังอาจแตกต่างกันไปตามแพลตฟอร์มด้วย กล่าวคือ คอมโพเนนต์ของเครื่องมือชุดค่าผสมคอมไพเลอร์ Unix อาจแตกต่างจากตัวแปร Windows แม้ว่า Toolchain จะใช้กับภาษาเดียวกันก็ตาม การเลือกเครื่องมือทางเทคนิคที่เหมาะสมสําหรับแพลตฟอร์มเรียกว่า "การแก้ปัญหา Toolchain"
เป้าหมายระดับบนสุด
เป้าหมายบิลด์จะเป็นระดับบนสุดหากมีการขอในบรรทัดคำสั่ง Bazel ตัวอย่างเช่น หาก //:foo
ขึ้นอยู่กับ //:bar
และมีการเรียกใช้ bazel build //:foo
สำหรับบิลด์นี้ //:foo
จะเป็นระดับบนสุดและ //:bar
จะไม่ได้เป็นระดับบนสุด แม้ว่าจะต้องสร้างทั้ง 2 เป้าหมายก็ตาม ความแตกต่างที่สําคัญระหว่างเป้าหมายระดับบนสุดกับเป้าหมายที่ไม่ใช่ระดับบนสุดคือ Flag ของคําสั่งที่ตั้งค่าในบรรทัดคําสั่งของ Bazel (หรือผ่าน .bazelrc) จะตั้งค่าการกําหนดค่าสําหรับเป้าหมายระดับบนสุด แต่อาจแก้ไขโดยทรานซิชันสําหรับเป้าหมายที่ไม่ใช่ระดับบนสุด
ทรานซิชัน
การแมปสถานะการกําหนดค่าจากค่าหนึ่งไปยังอีกค่าหนึ่ง ช่วยให้เป้าหมายในกราฟบิลด์มีการกําหนดค่าที่แตกต่างกันได้ แม้ว่าจะสร้างจากกฎเดียวกันก็ตาม การใช้งานทรานซิชันที่พบบ่อยคือการใช้กับทรานซิชันแยก ซึ่งมีการแยกกราฟเป้าหมายบางส่วนออกเป็นหลายส่วนโดยมีการกําหนดค่าที่แตกต่างกันสําหรับแต่ละส่วน เช่น คุณสามารถสร้าง APK ของ Android ที่มีไบนารีแบบเนทีฟที่คอมไพล์สำหรับ ARM และ x86 โดยใช้ทรานซิชันแบบแยกในบิลด์เดียว
ดูเพิ่มเติม: การเปลี่ยนฉากที่ผู้ใช้กำหนด
อาร์ติแฟกต์แผนผัง
อาร์ติแฟกต์ที่แสดงถึงคอลเล็กชันไฟล์ เนื่องจากไฟล์เหล่านี้ไม่ใช่อาร์ติแฟกต์ การดำเนินการที่ทำงานกับไฟล์เหล่านี้จึงต้องลงทะเบียนอาร์ติแฟกต์แผนผังเป็นอินพุตหรือเอาต์พุตแทน
ระดับการเข้าถึง
กลไกการป้องกันการขึ้นต่อกันที่ไม่ต้องการในระบบบิลด์มี 2 อย่าง ได้แก่ ระดับการเข้าถึงเป้าหมายสำหรับควบคุมว่าเป้าหมายอื่นๆ จะพึ่งพาเป้าหมายได้หรือไม่ และระดับการเข้าถึงการโหลดสำหรับควบคุมว่าไฟล์ BUILD
หรือ .bzl
จะโหลดไฟล์ .bzl
หนึ่งๆ ได้หรือไม่ หากไม่มีบริบท "ระดับการเข้าถึง" มักจะหมายถึงระดับการเข้าถึงเป้าหมาย
ดูข้อมูลเพิ่มเติมได้ที่ เอกสารประกอบเกี่ยวกับระดับการเข้าถึง
พื้นที่ทำงาน
สภาพแวดล้อมที่คำสั่ง Bazel ทั้งหมดใช้ร่วมกันจะทำงานจากที่เก็บหลักเดียวกัน
โปรดทราบว่าที่ผ่านมาแนวคิด "ที่เก็บข้อมูล" และ "พื้นที่ทำงาน" มักใช้รวมๆ กัน คำว่า "พื้นที่ทำงาน" มักใช้เพื่ออ้างอิงถึงที่เก็บข้อมูลหลัก และบางครั้งยังใช้เป็นคำพ้องความหมายของ "ที่เก็บข้อมูล" ด้วย คุณควรหลีกเลี่ยงการใช้คำดังกล่าวเพื่อความชัดเจน