คําจํากัดความที่พบบ่อย

รายงานปัญหา ดูแหล่งที่มา

ส่วนนี้จะระบุคำศัพท์และแนวคิดต่างๆ ที่ใช้กันทั่วไปสำหรับหลายฟังก์ชันหรือสร้างกฎ

เนื้อหา

การแปลง Bourne Shell เป็นโทเค็น

แอตทริบิวต์สตริงบางรายการของกฎบางกฎจะแยกเป็นหลายคำตามกฎการแปลงข้อมูลเป็นโทเค็นของเชลล์ Bourne กล่าวคือ การเว้นวรรคที่ไม่ได้ใส่เครื่องหมายคำพูดจะคั่นคำแยกกัน และจะมีการใช้อักขระเครื่องหมายคำพูดเดี่ยวและคู่และแบ็กสแลชเพื่อป้องกันการแปลงข้อมูลเป็นโทเค็น

แอตทริบิวต์ที่ขึ้นอยู่กับการแปลงเป็นโทเค็นนี้จะมีการระบุไว้อย่างชัดเจนในคำจำกัดความในเอกสารนี้

แอตทริบิวต์ที่อยู่ภายใต้การขยายตัวแปร "Make" และการแปลงเป็นโทเค็นเชลล์ Bourne มักใช้เพื่อส่งตัวเลือกที่กำหนดเองไปยังคอมไพเลอร์และเครื่องมืออื่นๆ ตัวอย่างของแอตทริบิวต์ เช่น cc_library.copts และ java_library.javacopts การใช้แทนเหล่านี้ร่วมกันช่วยให้ตัวแปรสตริงเดียวขยายเป็นรายการคำตัวเลือกเฉพาะการกำหนดค่าได้

การขยายป้ายกำกับ

แอตทริบิวต์สตริงบางรายการของกฎไม่กี่ข้อขึ้นอยู่กับการขยายป้ายกำกับ หากสตริงเหล่านั้นมีป้ายกำกับที่ถูกต้องเป็นสตริงย่อย เช่น //mypkg:target และป้ายกำกับนั้นเป็นข้อกำหนดเบื้องต้นที่ประกาศแล้วของกฎปัจจุบัน ระบบจะขยายไปยังชื่อพาธของไฟล์ที่มีสัญลักษณ์เป็น target //mypkg:target

ตัวอย่างแอตทริบิวต์ ได้แก่ genrule.cmd และ cc_binary.linkopts รายละเอียดอาจแตกต่างกันไปในแต่ละกรณี เช่น ปัญหาขยายป้ายกำกับแบบสัมพัทธ์ วิธีจัดการกับป้ายกำกับที่ขยายไปยังไฟล์หลายไฟล์ได้อย่างไร ฯลฯ โปรดดูข้อมูลเฉพาะในเอกสารแอตทริบิวต์ของกฎ

แอตทริบิวต์ทั่วไปที่กำหนดโดยกฎบิลด์ส่วนใหญ่

ส่วนนี้อธิบายแอตทริบิวต์ที่กฎการสร้างหลายข้อกำหนด แต่ไม่ใช่ทั้งหมด

แอตทริบิวต์ คำอธิบาย
data

รายการป้ายกำกับ ค่าเริ่มต้นคือ []

ไฟล์ที่กฎนี้ต้องใช้ขณะรันไทม์ อาจแสดงไฟล์หรือกฎเป้าหมาย โดยทั่วไปแล้ว อนุญาตให้ทุกเป้าหมายได้

เอาต์พุตเริ่มต้นและไฟล์เรียกใช้ของเป้าหมายในแอตทริบิวต์ data ควรปรากฏในพื้นที่ *.runfiles ของไฟล์ปฏิบัติการใดๆ ซึ่งเป็นเอาต์พุตโดยหรือมีทรัพยากร Dependency ของรันไทม์ในเป้าหมายนี้ ซึ่งอาจรวมถึงไฟล์ข้อมูลหรือไบนารีที่ใช้เมื่อเรียกใช้ srcs ของเป้าหมายนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีพึ่งพาและใช้ไฟล์ข้อมูลได้ในส่วนการอ้างอิงข้อมูล

กฎใหม่ควรกำหนดแอตทริบิวต์ data หากประมวลผลอินพุตที่อาจใช้อินพุตอื่นๆ ขณะรันไทม์ นอกจากนี้ ฟังก์ชันการใช้งานของกฎต้องป้อนข้อมูล Runfiles ของเป้าหมายจากเอาต์พุตและไฟล์ Runfile ของแอตทริบิวต์ data รวมถึง Runfile จากแอตทริบิวต์ทรัพยากร Dependency ที่มีซอร์สโค้ดหรือทรัพยากร Dependency ของรันไทม์

deps

รายการป้ายกำกับ ค่าเริ่มต้นคือ []

ทรัพยากร Dependency ของเป้าหมายนี้ โดยทั่วไปควรแสดงเฉพาะเป้าหมายของกฎเท่านั้น (แม้ว่าบางกฎจะอนุญาตให้ระบุไฟล์โดยตรงใน deps แต่ก็ควรหลีกเลี่ยงสถานการณ์นี้เมื่อเป็นไปได้)

โดยทั่วไปแล้ว กฎเฉพาะภาษาจะจำกัดเป้าหมายที่แสดงในรายการไว้ให้กับผู้ที่มีผู้ให้บริการที่เจาะจง

ความหมายที่แม่นยำของความหมายของเป้าหมายที่ต้องอาศัยวัตถุอื่นที่ใช้ deps มีความเฉพาะเจาะจงกับประเภทของกฎ และเอกสารที่เจาะจงกฎจะมีรายละเอียดเพิ่มเติม สำหรับกฎที่ประมวลผลซอร์สโค้ด โดยทั่วไป deps จะระบุทรัพยากร Dependency ของโค้ดที่โค้ดใช้ใน srcs

โดยส่วนใหญ่ มีการใช้ทรัพยากร Dependency deps เพื่ออนุญาตให้โมดูลหนึ่งใช้สัญลักษณ์ที่กำหนดไว้ในโมดูลอื่นที่เขียนในภาษาโปรแกรมเดียวกันและคอมไพล์แยกต่างหากได้ นอกจากนี้ยังอนุญาตให้ใช้ทรัพยากร Dependency ข้ามภาษาได้ในหลายๆ กรณี เช่น เป้าหมาย java_library อาจต้องใช้โค้ด C++ ในเป้าหมาย cc_library โดยระบุรายการหลังในแอตทริบิวต์ deps ดูคำจำกัดความของทรัพยากร Dependency สำหรับข้อมูลเพิ่มเติม

licenses

รายการสตริง ไม่สามารถกำหนดค่าได้ ค่าเริ่มต้นคือ ["none"]

รายการสตริงประเภทใบอนุญาตที่จะใช้กับเป้าหมายนี้โดยเฉพาะ นี่เป็นส่วนหนึ่งของ API การอนุญาตให้ใช้สิทธิที่เลิกใช้งานแล้วซึ่ง Bazel ไม่ได้ใช้อีกต่อไป อย่าใช้ตัวเลือกนี้

srcs

รายการป้ายกำกับ ค่าเริ่มต้นคือ []

ไฟล์ที่ประมวลผลหรือรวมโดยกฎนี้ โดยทั่วไปจะแสดงไฟล์โดยตรง แต่อาจแสดงรายการเป้าหมายของกฎ (เช่น filegroup หรือ genrule) เพื่อรวมเอาต์พุตเริ่มต้น

กฎเฉพาะภาษามักกำหนดให้ไฟล์ที่แสดงในรายการต้องมีนามสกุลไฟล์เฉพาะ

แอตทริบิวต์ที่ใช้กับกฎบิลด์ทั้งหมด

ส่วนนี้อธิบายแอตทริบิวต์ที่เพิ่มลงในกฎของบิลด์ทั้งหมดโดยปริยาย

แอตทริบิวต์ คำอธิบาย
compatible_with

รายการป้ายกำกับ ไม่สามารถกำหนดค่าได้ ค่าเริ่มต้นคือ []

รายการสภาพแวดล้อมที่เป้าหมายนี้สร้างขึ้นได้นอกเหนือจากสภาพแวดล้อมที่สนับสนุนเริ่มต้น

นี่เป็นส่วนหนึ่งของระบบข้อจำกัดของ Bazel ซึ่งให้ผู้ใช้ประกาศได้ว่าเป้าหมายใดสามารถพึ่งพากันและไม่ได้ ตัวอย่างเช่น ไบนารีที่ติดตั้งใช้งานได้จากภายนอกไม่ควรอาศัยไลบรารีที่มีรหัสลับของบริษัท ดูรายละเอียดได้ที่ ConstraintSemantics

deprecation

สตริง nonconfigurable ค่าเริ่มต้นคือ None

ข้อความแจ้งเตือนคำอธิบายที่เชื่อมโยงกับเป้าหมายนี้ โดยทั่วไปจะใช้เพื่อแจ้งให้ผู้ใช้ทราบว่าเป้าหมายล้าสมัยหรือถูกแทนที่ด้วยกฎอื่น เป็นแบบส่วนตัวในแพ็กเกจ หรืออาจได้รับการพิจารณาว่าเป็นอันตรายด้วยเหตุผลบางอย่าง คุณควรใส่ข้อมูลอ้างอิงบางส่วน (เช่น หน้าเว็บ หมายเลขข้อบกพร่อง หรือ CL ตัวอย่างการย้ายข้อมูล) ไว้ด้วย เพื่อจะได้ทราบว่าต้องทำการเปลี่ยนแปลงใดเพื่อไม่ให้มีข้อความดังกล่าว หากมีเป้าหมายใหม่ที่ใช้แทนที่การลดลงได้ ก็ควรย้ายข้อมูลผู้ใช้ทั้งหมดของเป้าหมายเดิม

แอตทริบิวต์นี้ไม่มีผลต่อวิธีสร้างสิ่งต่างๆ แต่อาจส่งผลต่อเอาต์พุตการวินิจฉัยของเครื่องมือบิลด์ เครื่องมือสร้างออกคำเตือนเมื่อกฎที่มีแอตทริบิวต์ deprecation ขึ้นอยู่กับเป้าหมายในแพ็กเกจอื่น

ทรัพยากร Dependency ภายในแพ็กเกจจะได้รับการยกเว้นจากคำเตือนนี้ ตัวอย่างเช่น การสร้างการทดสอบของกฎที่เลิกใช้งานแล้วจะไม่ได้รับคำเตือน

หากเป้าหมายที่เลิกใช้งานแล้วขึ้นอยู่กับเป้าหมายอื่นที่เลิกใช้งานแล้ว จะไม่มีการออกข้อความเตือน

เมื่อผู้คนหยุดใช้แล้ว คุณจะนำเป้าหมายออกได้

distribs

รายการสตริง ไม่สามารถกำหนดค่าได้ ค่าเริ่มต้นคือ []

รายการสตริงวิธีการกระจายที่จะใช้กับเป้าหมายนี้โดยเฉพาะ นี่เป็นส่วนหนึ่งของ API การอนุญาตให้ใช้สิทธิที่เลิกใช้งานแล้วซึ่ง Bazel ไม่ได้ใช้อีกต่อไป อย่าใช้ตัวเลือกนี้

exec_compatible_with

รายการป้ายกำกับ ไม่สามารถกำหนดค่าได้ ค่าเริ่มต้นคือ []

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

exec_properties

พจนานุกรมของสตริง ค่าเริ่มต้นคือ {}

พจนานุกรมของสตริงที่จะเพิ่มลงใน exec_properties ของแพลตฟอร์มที่เลือกไว้สำหรับเป้าหมายนี้ ดูกฎแพลตฟอร์ม exec_properties

หากมีคีย์อยู่ทั้งในพร็อพเพอร์ตี้แพลตฟอร์มและพร็อพเพอร์ตี้ระดับเป้าหมาย ระบบจะนำค่ามาจากเป้าหมาย

features

รายการสตริงฟีเจอร์ ค่าเริ่มต้นคือ []

ฟีเจอร์คือแท็กสตริงที่สามารถเปิดหรือปิดใช้ในเป้าหมาย ความหมายของฟีเจอร์หนึ่งจะขึ้นอยู่กับกฎเอง

แอตทริบิวต์ features นี้รวมกับแอตทริบิวต์ features ระดับ แพ็กเกจ เช่น หากเปิดใช้ฟีเจอร์ ["a", "b"] ในระดับแพ็กเกจ และแอตทริบิวต์ features ของเป้าหมายมี ["-a", "c"] ฟีเจอร์ที่เปิดใช้สำหรับกฎจะเป็น "b" และ "c" ดูตัวอย่าง

restricted_to

รายการป้ายกำกับ ไม่สามารถกำหนดค่าได้ ค่าเริ่มต้นคือ []

รายการสภาพแวดล้อมที่เป้าหมายนี้สร้างขึ้นได้แทนสภาพแวดล้อมที่สนับสนุนเริ่มต้น

นี่เป็นส่วนหนึ่งของระบบข้อจำกัดของ Bazel ดูรายละเอียดได้ที่ compatible_with

tags

รายการสตริง ไม่สามารถกำหนดค่าได้ ค่าเริ่มต้นคือ []

แท็กใช้ได้กับกฎใดก็ได้ แท็กในการทดสอบและกฎ test_suite มีประโยชน์ในการจัดหมวดหมู่การทดสอบ แท็กในเป้าหมายที่ไม่ใช่การทดสอบใช้เพื่อควบคุมการดำเนินการของ genrule และ Starlark ที่ทำแซนด์บ็อกซ์ไว้และสำหรับการแยกวิเคราะห์โดยมนุษย์และ/หรือเครื่องมือภายนอก

Bazel จะแก้ไขลักษณะการทำงานของโค้ดแซนด์บ็อกซ์หากพบคีย์เวิร์ดต่อไปนี้ในแอตทริบิวต์ tags ของการทดสอบหรือเป้าหมาย genrule หรือคีย์ execution_requirements สำหรับการดำเนินการ Starlark

  • คีย์เวิร์ด no-sandbox ให้ผลลัพธ์ในการดําเนินการหรือการทดสอบโดยไม่เคยมีการแซนด์บ็อกซ์เลย คีย์เวิร์ดนี้จะยังคงแคชหรือเรียกใช้จากระยะไกลได้ ให้ใช้ no-cache หรือ no-remote เพื่อป้องกันทั้ง 2 อย่าง
  • คีย์เวิร์ด no-cache คำส่งผลให้เกิดการดำเนินการหรือการทดสอบที่ไม่มีการแคช (ในเครื่องหรือจากระยะไกล) หมายเหตุ: สำหรับวัตถุประสงค์ของแท็กนี้ ดิสก์แคชจะถือเป็นแคชในเครื่อง ขณะที่แคช HTTP และ gRPC จะถือว่าเป็นแคชระยะไกล ส่วนแคชอื่นๆ เช่น Skyframe หรือแคชการดำเนินการถาวรจะไม่ได้รับผลกระทบ
  • คีย์เวิร์ด no-remote-cache รายการส่งผลให้การดําเนินการหรือการทดสอบไม่มีการแคชจากระยะไกล (แต่อาจมีการแคชในเครื่อง และอาจมีการเรียกใช้จากระยะไกลด้วย) หมายเหตุ: สำหรับวัตถุประสงค์ของแท็กนี้ ดิสก์แคชจะถือเป็นแคชในเครื่อง ขณะที่แคช HTTP และ gRPC จะถือว่าเป็นรีโมต ส่วนแคชอื่นๆ เช่น Skyframe หรือแคชการดำเนินการถาวรจะไม่ได้รับผลกระทบ หากมีการใช้ดิสก์แคชในเครื่องและรีโมทแคชร่วมกัน (แคชแบบรวม) ระบบจะถือว่าเป็นแคชระยะไกลและปิดใช้ทั้งหมด เว้นแต่จะมีการตั้งค่า --incompatible_remote_results_ignore_disk ซึ่งในกรณีนี้ระบบจะใช้คอมโพเนนต์ในเครื่อง
  • คีย์เวิร์ด no-remote-exec รายการส่งผลให้การดําเนินการหรือการทดสอบไม่มีการเรียกใช้จากระยะไกล (แต่อาจมีการแคชจากระยะไกล)
  • คีย์เวิร์ด no-remote จะป้องกันไม่ให้เรียกใช้การดำเนินการหรือการทดสอบจากระยะไกลหรือแคชจากระยะไกล ซึ่งเทียบเท่ากับการใช้ทั้ง no-remote-cache และ no-remote-exec
  • คีย์เวิร์ด no-remote-cache-upload ปิดใช้การอัปโหลดส่วนการแคชระยะไกลของการสร้าง จะไม่มีการปิดใช้การดำเนินการจากระยะไกล
  • คีย์เวิร์ด local ปิดกั้นการดำเนินการหรือการทดสอบจากการแคชจากระยะไกล การดำเนินการจากระยะไกล หรือการทำงานภายในแซนด์บ็อกซ์ สำหรับ Genrules และการทดสอบ การทำเครื่องหมายกฎด้วยแอตทริบิวต์ local = True จะมีผลเหมือนกัน
  • คีย์เวิร์ด requires-network อนุญาตให้เข้าถึงเครือข่ายภายนอกจากภายในแซนด์บ็อกซ์ แท็กนี้จะมีผลต่อเมื่อเปิดใช้แซนด์บ็อกซ์เท่านั้น
  • คีย์เวิร์ด block-network จะบล็อกการเข้าถึงเครือข่ายภายนอกจากภายในแซนด์บ็อกซ์ ในกรณีนี้ ระบบจะอนุญาตให้สื่อสารกับ localhost เท่านั้น แท็กนี้จะมีผลต่อเมื่อเปิดใช้แซนด์บ็อกซ์เท่านั้น
  • requires-fakeroot เรียกใช้การทดสอบหรือการดำเนินการเป็น uid และ gid 0 (เช่น ผู้ใช้รูท) ฟีเจอร์นี้รองรับเฉพาะใน Linux เท่านั้น แท็กนี้จะมีลำดับความสำคัญเหนือตัวเลือกบรรทัดคำสั่ง --sandbox_fake_username

โดยทั่วไปแท็กในการทดสอบจะใช้เพื่ออธิบายบทบาทของการทดสอบในกระบวนการแก้ไขข้อบกพร่องและการเผยแพร่ โดยทั่วไปแล้ว แท็กจะมีประโยชน์มากที่สุดสำหรับการทดสอบ C++ และ Python ซึ่งไม่มีความสามารถในการใส่คำอธิบายประกอบรันไทม์ การใช้แท็กและองค์ประกอบขนาดช่วยเพิ่มความยืดหยุ่นในการประกอบชุดการทดสอบตามนโยบายการตรวจสอบของโค้ดเบส

Bazel จะแก้ไขพฤติกรรมการทดสอบที่ทำงานอยู่หากพบคีย์เวิร์ดต่อไปนี้ในแอตทริบิวต์ tags ของกฎทดสอบ

  • exclusive จะบังคับให้ทำการทดสอบในโหมด "ยกเว้น" เพื่อให้มั่นใจว่าไม่มีการทดสอบอื่นๆ ทำงานพร้อมกัน การทดสอบดังกล่าวจะดำเนินการในแบบต่อเนื่องหลังจากที่กิจกรรมบิลด์และการทดสอบแบบไม่ผูกขาดทั้งหมดเสร็จสมบูรณ์แล้ว มีการปิดใช้การดำเนินการจากระยะไกลสำหรับการทดสอบดังกล่าวเนื่องจาก Bazel ควบคุมสิ่งที่ทำงานอยู่ในเครื่องระยะไกลไม่ได้
  • exclusive-if-local จะบังคับให้การทดสอบทำงานในโหมด "พิเศษ" หากดำเนินการในเครื่อง แต่จะทำการทดสอบพร้อมกันหากดำเนินการจากระยะไกล
  • คีย์เวิร์ด manual จะยกเว้นเป้าหมายจากการขยายไวลด์การ์ดรูปแบบเป้าหมาย (..., :*, :all ฯลฯ) และกฎ test_suite รายการที่ไม่ได้แสดงการทดสอบอย่างชัดเจนเมื่อประมวลผลชุดเป้าหมายระดับบนสุดเพื่อสร้าง/เรียกใช้สำหรับคำสั่ง build, test และ coverage โดยจะไม่ส่งผลต่อไวลด์การ์ดเป้าหมายหรือการขยายชุดทดสอบในบริบทอื่นๆ รวมถึงคําสั่ง query โปรดทราบว่า manual ไม่ได้กล่าวเป็นนัยว่าไม่ควรสร้าง/เรียกใช้เป้าหมายโดยอัตโนมัติโดยระบบบิลด์/การทดสอบอย่างต่อเนื่อง เช่น คุณอาจต้องยกเว้นเป้าหมายจาก bazel test ... เนื่องจากต้องมีแฟล็ก Bazel ที่เจาะจง แต่ยังรวมเป้าหมายดังกล่าวไว้ในการส่งล่วงหน้าหรือการทดสอบอย่างต่อเนื่องที่กำหนดค่าอย่างถูกต้อง
  • คีย์เวิร์ด external จะบังคับให้ทำการทดสอบอย่างไม่มีเงื่อนไข (โดยไม่คำนึงถึงค่า --cache_test_results)
ดู แบบแผนเกี่ยวกับแท็กในสารานุกรมการทดสอบสำหรับแบบแผนเพิ่มเติมเกี่ยวกับแท็กที่แนบกับเป้าหมายทดสอบ
target_compatible_with

รายการป้ายกำกับ ค่าเริ่มต้นคือ []

รายการ constraint_value ที่ต้องแสดงในแพลตฟอร์มเป้าหมายเพื่อให้เป้าหมายนี้ใช้งานร่วมกันได้ ซึ่งเป็นส่วนเพิ่มเติมจากข้อจำกัดใดๆ ที่ตั้งค่าโดยประเภทกฎไว้แล้ว หากแพลตฟอร์มเป้าหมายไม่เป็นไปตามข้อจำกัดที่ระบุไว้ทั้งหมด ระบบจะถือว่าเป้าหมายincompatible ระบบจะข้ามเป้าหมายที่เข้ากันไม่ได้เพื่อสร้างและทดสอบเมื่อมีการขยายรูปแบบเป้าหมาย (เช่น //..., :all) เมื่อระบุอย่างชัดแจ้งในบรรทัดคำสั่ง เป้าหมายที่เข้ากันไม่ได้จะทำให้ Bazel พิมพ์ข้อผิดพลาดและทำให้การสร้างหรือการทดสอบล้มเหลว

เป้าหมายที่เปลี่ยนไปสู่เป้าหมายที่เข้ากันไม่ได้จะถือว่าเข้ากันไม่ได้ รวมถึงจะข้ามการสร้างและการทดสอบด้วย

รายการที่ว่างเปล่า (ซึ่งเป็นค่าเริ่มต้น) บ่งบอกว่าเป้าหมายใช้ได้กับทุกแพลตฟอร์ม

กฎทั้งหมดที่ไม่ใช่กฎ Workspace รองรับแอตทริบิวต์นี้ แอตทริบิวต์นี้จะไม่มีผลสำหรับบางกฎ ตัวอย่างเช่น การระบุ target_compatible_with สำหรับ cc_toolchain จะไม่มีประโยชน์

ดูข้อมูลเพิ่มเติมเกี่ยวกับการข้ามเป้าหมายที่ใช้ร่วมกันไม่ได้ในหน้าแพลตฟอร์ม

testonly

บูลีน ไม่สามารถกำหนดค่าได้ ค่าเริ่มต้นคือ False ยกเว้นเป้าหมายชุดทดสอบและชุดทดสอบ

หากตั้งค่าเป็น True เฉพาะเป้าหมายสำหรับการทดสอบเท่านั้น (เช่น การทดสอบ) จะขึ้นอยู่กับเป้าหมายนี้

ในทำนองเดียวกัน กฎที่ไม่ใช่ testonly จะไม่ได้รับอนุญาตให้อ้างอิงกฎใดๆ ที่เป็น testonly

การทดสอบ (*_test กฎ) และชุดทดสอบ (กฎ test_suite) จะมีค่า testonly โดยค่าเริ่มต้น

แอตทริบิวต์นี้มีไว้เพื่อหมายความว่าไม่ควรมีเป้าหมายอยู่ในไบนารีที่เปิดตัวเป็นเวอร์ชันที่ใช้งานจริง

เนื่องจากจะมีการบังคับใช้แบบ "ทดสอบ" เท่านั้น ณ เวลาที่สร้าง ไม่ใช่เวลาเรียกใช้ และเผยแพร่แบบไวๆ ผ่านแผนผังทรัพยากร Dependency จึงควรใช้อย่างรอบคอบ ตัวอย่างเช่น สตับและแท็กปลอมที่เป็นประโยชน์ต่อการทดสอบ 1 หน่วยอาจมีประโยชน์สำหรับการทดสอบการผสานรวมที่เกี่ยวข้องกับไบนารีเดียวกันซึ่งจะปล่อยเป็นเวอร์ชันที่ใช้งานจริงด้วย ดังนั้น คุณไม่ควรทำเครื่องหมายเป็นทดสอบเท่านั้น ในทางกลับกัน กฎที่อันตรายต่อการลิงก์เข้ามาเพราะอาจลบล้างลักษณะการทำงานปกติโดยไม่มีเงื่อนไข ควรมีสถานะเป็น "ทดสอบเท่านั้น" อย่างแน่นอน

toolchains

รายการป้ายกำกับ ไม่สามารถกำหนดค่าได้ ค่าเริ่มต้นคือ []

ชุดของเป้าหมายที่มีสร้างตัวแปรให้เป้าหมายนี้เข้าถึงได้ เป้าหมายเหล่านี้เป็นอินสแตนซ์ของกฎที่ระบุ TemplateVariableInfo หรือเป้าหมายพิเศษสำหรับประเภทเชนเครื่องมือที่สร้างขึ้นใน Bazel ซึ่งรวมถึง

  • @bazel_tools//tools/cpp:current_cc_toolchain
  • @bazel_tools//tools/jdk:current_java_runtime

โปรดทราบว่าวิธีนี้แตกต่างจากแนวคิดของการแก้ไข Toolchain ซึ่งใช้โดยการติดตั้งใช้งานกฎสำหรับการกำหนดค่าที่ขึ้นอยู่กับแพลตฟอร์ม คุณใช้แอตทริบิวต์นี้เพื่อระบุว่าเป้าหมายจะใช้ cc_toolchain หรือ java_toolchain ใดไม่ได้

visibility

รายการป้ายกำกับ nonconfigurable ค่าเริ่มต้นคือ default_visibility จากแพ็กเกจ (หากระบุ) หรือ "//visibility:private" ในกรณีอื่นๆ

แอตทริบิวต์ visibility ในเป้าหมายจะควบคุมว่าเป้าหมายนั้น จะใช้ในแพ็กเกจอื่นๆ ได้หรือไม่ ดูเอกสารสำหรับระดับการเข้าถึง

แอตทริบิวต์ทั่วไปสำหรับกฎการทดสอบทั้งหมด (*_test)

ส่วนนี้จะอธิบายถึงแอตทริบิวต์ที่ใช้กับกฎการทดสอบทั้งหมด

แอตทริบิวต์ คำอธิบาย
args

รายการสตริง โดยขึ้นอยู่กับการแทนที่ $(location) และ "สร้างตัวแปร" และ การแปลงข้อมูลเป็นโทเค็นของ Bourne shell ค่าเริ่มต้นคือ []

อาร์กิวเมนต์บรรทัดคำสั่งที่ Bazel ส่งไปยังเป้าหมายเมื่อเรียกใช้ด้วย bazel test

ระบบจะส่งอาร์กิวเมนต์เหล่านี้ก่อนค่า --test_arg ที่ระบุในบรรทัดคำสั่ง bazel test

env

พจนานุกรมของสตริง ค่าอยู่ภายใต้การแทนที่ $(location) และ "สร้างตัวแปร" ค่าเริ่มต้นคือ {}

ระบุตัวแปรสภาพแวดล้อมเพิ่มเติมที่จะตั้งค่าเมื่อ bazel test ดำเนินการทดสอบ

แอตทริบิวต์นี้มีผลกับกฎเนทีฟ เช่น cc_test, py_test และ sh_test เท่านั้น โดยไม่ได้ใช้กับกฎการทดสอบที่ Starlark กำหนด สำหรับกฎ Starlark ของคุณเอง คุณจะเพิ่มแอตทริบิวต์ "env" และใช้แอตทริบิวต์ดังกล่าวเพื่อสร้างผู้ให้บริการ TestEnvironment ได้

env_inherit

รายการสตริง ค่าเริ่มต้นคือ []

ระบุตัวแปรสภาพแวดล้อมเพิ่มเติมที่จะรับค่าจากสภาพแวดล้อมภายนอกเมื่อดำเนินการทดสอบโดย bazel test

แอตทริบิวต์นี้มีผลกับกฎเนทีฟ เช่น cc_test, py_test และ sh_test เท่านั้น โดยไม่ได้ใช้กับกฎการทดสอบที่ Starlark กำหนด

size

สตริง "enormous", "large", "medium" หรือ "small"; nonconfigurable ค่าเริ่มต้นคือ "medium"

ระบุ "ความหนัก" ของเป้าหมายการทดสอบ: ระยะเวลา/ทรัพยากรที่ต้องใช้ในการทำงาน

การทดสอบ 1 หน่วยถือเป็นการทดสอบ "เล็ก" การทดสอบการผสานรวม "ปานกลาง" และการทดสอบแบบ "ใหญ่" หรือ "ใหญ่มาก" Bazel ใช้ขนาดดังกล่าวเพื่อกำหนดระยะหมดเวลาเริ่มต้น ซึ่งลบล้างได้โดยใช้แอตทริบิวต์ timeout ระยะหมดเวลามีไว้สำหรับการทดสอบทั้งหมดในเป้าหมาย BUILD ไม่ใช่สำหรับการทดสอบแต่ละรายการ เมื่อทำการทดสอบในเครื่อง ระบบจะใช้ size เพื่อกำหนดเวลาเพิ่มเติม โดย Bazel พยายามดำเนินการตาม --local_{ram,cpu}_resources และไม่ทำให้เครื่องกลมากเกินไปด้วยการเรียกใช้การทดสอบจำนวนมากพร้อมกัน

ขนาดการทดสอบสอดคล้องกับระยะหมดเวลาเริ่มต้นต่อไปนี้และจะถือว่ามีการใช้ทรัพยากรภายในสูงสุด

ขนาด RAM (เป็น MB) CPU (ในแกน CPU) ระยะหมดเวลาเริ่มต้น
เล็ก 20 1 สั้น (1 นาที)
medium 100 1 ปานกลาง (5 นาที)
ใหญ่ 300 1 ยาว (15 นาที)
ใหญ่มาก 800 1 นิรันดร์ (60 นาที)

ระบบจะตั้งค่าตัวแปรสภาพแวดล้อม TEST_SIZE เป็นค่าของแอตทริบิวต์นี้เมื่อสร้างการทดสอบ

timeout

สตริง "short", "moderate", "long" หรือ "eternal"; nonconfigurable ค่าเริ่มต้นคือแอตทริบิวต์ size ของการทดสอบ

ระยะเวลาที่คาดว่าจะทำการทดสอบก่อนย้อนกลับ

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

ค่าระยะหมดเวลา ระยะเวลา
วิดีโอสั้น 1 นาที
ปานกลาง 5 นาที
long 15 นาที
นิรันดร์ 60 นาที

สำหรับช่วงเวลาอื่นนอกเหนือจากที่กล่าวมาข้างต้น คุณอาจลบล้างระยะหมดเวลาทดสอบด้วยแฟล็กบาเซล --test_timeout เช่น การเรียกใช้ด้วยตนเองภายใต้เงื่อนไขที่ทราบว่าช้า ค่า --test_timeout มีหน่วยเป็นวินาที เช่น --test_timeout=120 จะกำหนดระยะหมดเวลาการทดสอบเป็น 2 นาที

ระบบจะตั้งค่าตัวแปรสภาพแวดล้อม TEST_TIMEOUT เป็นระยะหมดเวลาทดสอบ (เป็นวินาที) เมื่อเริ่มการทดสอบ

flaky

บูลีน ไม่สามารถกำหนดค่าได้ ค่าเริ่มต้นคือ False

ทำเครื่องหมายการทดสอบว่าไม่น่าเชื่อถือ

หากตั้งค่าไว้ จะดำเนินการทดสอบสูงสุด 3 ครั้ง และทำเครื่องหมายว่า "ล้มเหลว" เฉพาะเมื่อล้มเหลวในแต่ละครั้ง โดยค่าเริ่มต้น แอตทริบิวต์นี้จะมีการตั้งค่าเป็น "เท็จ" และการทดสอบจะดำเนินการเพียงครั้งเดียว โปรดทราบว่าโดยทั่วไปเราไม่แนะนำให้ใช้แอตทริบิวต์นี้ เนื่องจากการทดสอบควรผ่านความน่าเชื่อถือเมื่อมีการยืนยันความถูกต้อง

shard_count

จำนวนเต็มที่ไม่เป็นลบน้อยกว่าหรือเท่ากับ 50 ค่าเริ่มต้นคือ -1

ระบุจำนวนชาร์ดคู่ขนานที่จะใช้ทำการทดสอบ

หากมีการตั้งค่า ค่านี้จะลบล้างการเรียนรู้ที่ใช้เพื่อกำหนดจำนวนชาร์ดคู่ขนานที่จะใช้ทดสอบ โปรดทราบว่าสำหรับกฎการทดสอบบางกฎ อาจต้องใช้พารามิเตอร์นี้เพื่อเปิดใช้ชาร์ดดิ้งในครั้งแรก โปรดดู --test_sharding_strategy ด้วย

หากเปิดใช้ชาร์ดดิ้งทดสอบ ระบบจะตั้งค่าตัวแปรสภาพแวดล้อม TEST_TOTAL_SHARDS เป็นค่านี้เมื่อเริ่มต้นการทดสอบ

ชาร์ดดิ้งกำหนดให้ตัวดำเนินการทดสอบรองรับโปรโตคอลชาร์ดดิ้งทดสอบ หากไม่ ก็น่าจะทำการทดสอบทุกครั้งในทุกชาร์ด ซึ่งไม่ใช่สิ่งที่คุณต้องการ

ดูรายละเอียดเกี่ยวกับชาร์ดดิ้งได้ที่ทดสอบชาร์ดดิ้งในสารานุกรมการทดสอบ

local

บูลีน ไม่สามารถกำหนดค่าได้ ค่าเริ่มต้นคือ False

บังคับให้ทำการทดสอบในเครื่องโดยไม่ใช้แซนด์บ็อกซ์

การตั้งค่านี้เป็น "จริง" เทียบเท่ากับการระบุ "local" เป็นแท็ก (tags=["local"])

แอตทริบิวต์ที่ใช้กับกฎไบนารีทั้งหมด (*_binary)

ส่วนนี้จะอธิบายถึงแอตทริบิวต์ที่มีในกฎไบนารีทั้งหมด

แอตทริบิวต์ คำอธิบาย
args

รายการสตริง โดยขึ้นอยู่กับการแทนที่ $(location) และ "สร้างตัวแปร" และ การแปลงข้อมูล Bourne shell nonconfigurable ค่าเริ่มต้นคือ []

อาร์กิวเมนต์บรรทัดคำสั่งที่ Bazel จะส่งผ่านไปยังเป้าหมายเมื่อมีการเรียกใช้ด้วยคำสั่ง run หรือเป็นการทดสอบ ระบบจะส่งอาร์กิวเมนต์เหล่านี้ก่อนอาร์กิวเมนต์ที่ระบุไว้ในบรรทัดคำสั่ง bazel run หรือ bazel test

หมายเหตุ: ระบบจะไม่ส่งอาร์กิวเมนต์เมื่อเรียกใช้เป้าหมายนอก Bazel (เช่น เรียกใช้ไบนารีใน bazel-bin/ ด้วยตนเอง)

env

พจนานุกรมของสตริง โดยค่าจะขึ้นอยู่กับการแทนที่ $(location) และ "สร้างตัวแปร" ค่าเริ่มต้นคือ {}

ระบุตัวแปรสภาพแวดล้อมเพิ่มเติมที่จะตั้งค่าเมื่อเรียกใช้เป้าหมายโดย bazel run

แอตทริบิวต์นี้มีผลกับกฎเนทีฟ เช่น cc_binary, py_binary และ sh_binary เท่านั้น โดยไม่ได้ใช้กับกฎปฏิบัติการที่กำหนดโดย Starlark

หมายเหตุ: ไม่มีการตั้งค่าตัวแปรสภาพแวดล้อมเมื่อเรียกใช้เป้าหมายนอก Bazel (เช่น เรียกใช้ไบนารีใน bazel-bin/ ด้วยตนเอง)

output_licenses

รายการสตริง ค่าเริ่มต้นคือ []

ใบอนุญาตของไฟล์เอาต์พุตที่ไบนารีนี้สร้างขึ้น นี่เป็นส่วนหนึ่งของ API การอนุญาตให้ใช้สิทธิที่เลิกใช้งานแล้วซึ่ง Bazel ไม่ได้ใช้อีกต่อไป อย่าใช้ตัวเลือกนี้

แอตทริบิวต์ที่กำหนดค่าได้

แอตทริบิวต์ส่วนใหญ่เป็นแบบ "configurable" ได้ ซึ่งหมายความว่าค่าของแอตทริบิวต์อาจเปลี่ยนแปลงเมื่อมีการสร้างเป้าหมายในลักษณะที่แตกต่างกัน กล่าวอย่างเจาะจงคือ แอตทริบิวต์ที่กำหนดค่าได้อาจแตกต่างกันไปตามแฟล็กที่ส่งไปยังบรรทัดคำสั่ง Bazel หรือทรัพยากร Dependency ของปลายทางที่ขอเป้าหมาย คำสั่งนี้ใช้เพื่อปรับแต่งเป้าหมายสำหรับหลายแพลตฟอร์มหรือโหมดการคอมไพล์ได้ เป็นต้น

ตัวอย่างต่อไปนี้ประกาศแหล่งที่มาที่แตกต่างกันสำหรับสถาปัตยกรรมเป้าหมายที่แตกต่างกัน การเรียกใช้ bazel build :multiplatform_lib --cpu x86 จะสร้างเป้าหมายโดยใช้ x86_impl.cc ขณะที่การแทนที่ --cpu arm จะทำให้เป้าหมายใช้ arm_impl.cc แทน

cc_library(
    name = "multiplatform_lib",
    srcs = select({
        ":x86_mode": ["x86_impl.cc"],
        ":arm_mode": ["arm_impl.cc"]
    })
)
config_setting(
    name = "x86_mode",
    values = { "cpu": "x86" }
)
config_setting(
    name = "arm_mode",
    values = { "cpu": "arm" }
)

ฟังก์ชัน select() จะเลือกค่าอื่นสำหรับแอตทริบิวต์ที่กำหนดค่าได้โดยอิงตามเกณฑ์ของ config_setting หรือ constraint_value ที่การกำหนดค่าของเป้าหมายเป็นไปตามเกณฑ์

Bazel ประเมินแอตทริบิวต์ที่กำหนดค่าได้หลังมาโครประมวลผลและก่อนกฎการประมวลผล (ในทางเทคนิคแล้ว ระหว่าง ระยะการโหลดและการวิเคราะห์) การประมวลผลใดๆ ก่อนการประเมิน select() จะไม่ทราบว่า select() เลือกสาขาใด ตัวอย่างเช่น มาโครจะเปลี่ยนลักษณะการทำงานตาม Branch ที่เลือกไม่ได้ และ bazel query จะคาดการณ์แบบเชิงรับเกี่ยวกับทรัพยากร Dependency ที่กำหนดค่าได้ของเป้าหมายเท่านั้น ดู คำถามที่พบบ่อยนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ select() กับกฎและมาโคร

แอตทริบิวต์ที่มีเครื่องหมาย nonconfigurable ในเอกสารจะใช้ฟีเจอร์นี้ไม่ได้ ปกติแล้วแอตทริบิวต์จะกำหนดค่าไม่ได้เนื่องจาก Bazel ต้องทราบค่าภายในก่อนจึงจะกำหนดวิธีแก้ไข select() ได้

ดูภาพรวมโดยละเอียดได้ใน แอตทริบิวต์บิลด์ที่กำหนดค่าได้

เป้าหมายเอาต์พุตแบบไม่เจาะจงปลายทาง

เลิกใช้งานเอาต์พุตโดยนัยใน C++ แล้ว โปรดอย่าใช้ภาษาอื่นหากเป็นไปได้ เรายังไม่มีเส้นทางการเลิกใช้งาน แต่ท้ายที่สุดแล้วจะเลิกใช้งานด้วยเช่นกัน

เมื่อกำหนดกฎบิลด์ในไฟล์ BUILD ถือเป็นการประกาศเป้าหมายกฎใหม่ที่มีชื่อในแพ็กเกจอย่างชัดแจ้ง ฟังก์ชันของกฎบิลด์หลายรายการยังรวมถึงเป้าหมายไฟล์เอาต์พุตอย่างน้อย 1 รายการโดยนัย ที่มีเนื้อหาและความหมายของกฎเฉพาะ เช่น เมื่อประกาศกฎ java_binary(name='foo', ...) อย่างชัดแจ้ง คุณจะประกาศไฟล์เอาต์พุตเป้าหมาย foo_deploy.jar อย่างโดยนัยด้วย เป็นสมาชิกของแพ็กเกจเดียวกันด้วย (เป้าหมายเฉพาะนี้เป็นที่เก็บถาวรของ Java ในตัวและเหมาะสำหรับการทำให้ใช้งานได้)

เป้าหมายเอาต์พุตโดยนัยเป็นสมาชิกระดับแรกของกราฟเป้าหมายทั่วโลก เช่นเดียวกับเป้าหมายอื่นๆ เป้าหมายเหล่านี้สร้างขึ้นตามความต้องการ ไม่ว่าจะระบุไว้ในคำสั่งบิลด์ระดับบนสุดหรือเมื่อเป็นข้อกำหนดเบื้องต้นที่จำเป็นสำหรับเป้าหมายบิลด์อื่นๆ โดยอาจอ้างอิงเป็นทรัพยากร Dependency ในไฟล์ BUILD และสังเกตได้ในเอาต์พุตของเครื่องมือวิเคราะห์ เช่น bazel query

สำหรับกฎบิลด์แต่ละประเภท เอกสารประกอบของกฎจะมีส่วนพิเศษที่มีรายละเอียดชื่อและเนื้อหาของเอาต์พุตโดยนัยที่เกิดจากการประกาศกฎประเภทนั้น

ความแตกต่างที่สำคัญเล็กน้อยระหว่างเนมสเปซ 2 รายการที่ระบบบิลด์ใช้คือ ป้ายกำกับจะระบุเป้าหมาย ซึ่งอาจเป็นกฎหรือไฟล์ และเป้าหมายไฟล์อาจแบ่งออกเป็นเป้าหมายไฟล์ต้นทาง (หรืออินพุต) และเป้าหมายไฟล์ที่ได้ (หรือเอาต์พุต) ต่อไปนี้คือสิ่งที่คุณพูดถึงในไฟล์ BUILD, สร้างจากบรรทัดคำสั่ง หรือตรวจสอบโดยใช้ bazel query ได้ นี่คือเนมสเปซเป้าหมาย เป้าหมายของแต่ละไฟล์จะสอดคล้องกับไฟล์จริง 1 ไฟล์บนดิสก์ ("เนมสเปซของระบบไฟล์") เป้าหมายกฎแต่ละข้ออาจสอดคล้องกับไฟล์จริงตั้งแต่ 0 ไฟล์ขึ้นไปบนดิสก์ อาจมีไฟล์บนดิสก์ที่ไม่มีเป้าหมายที่เกี่ยวข้อง เช่น ไฟล์ออบเจ็กต์ .o ที่สร้างขึ้นระหว่างการคอมไพล์ C++ จะอ้างอิงจากภายในไฟล์ BUILD หรือจากบรรทัดคำสั่งไม่ได้ วิธีนี้ทำให้เครื่องมือสร้างอาจซ่อนรายละเอียดการใช้งานบางอย่างซึ่งเกี่ยวข้องกับวิธีการทำงานของเครื่องมือดังกล่าว ซึ่งมีคำอธิบายโดยละเอียดเพิ่มเติมในข้อมูลอ้างอิงแนวคิดของการสร้าง