กฎ
ชื่อแทน
ดูแหล่งที่มาของกฎalias(name, actual, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)
กฎ alias
จะสร้างชื่ออื่นที่สามารถใช้เรียกกฎได้
การใช้ชื่อแทนใช้ได้กับเป้าหมาย "ปกติ" เท่านั้น โดยเฉพาะอย่างยิ่ง package_group
และ test_suite
จะใช้แทนกันไม่ได้
การใช้อีเมลแทนอาจมีประโยชน์ในรีโพซิทอรีขนาดใหญ่ที่การเปลี่ยนชื่อเป้าหมายจะต้องทำการเปลี่ยนแปลงไฟล์จำนวนมาก นอกจากนี้ คุณยังใช้กฎแทนที่เพื่อจัดเก็บการเรียกใช้ฟังก์ชัน select ได้หากต้องการนําตรรกะนั้นไปใช้กับเป้าหมายหลายรายการ
กฎแทนที่จะมีการประกาศการแสดงผลของตนเอง ส่วนในด้านอื่นๆ ทั้งหมด กฎนี้จะทํางานเหมือนกับกฎที่อ้างอิง (เช่น ระบบจะไม่สนใจ testonly ในชื่อแทน แต่จะนํา testonly ของกฎที่อ้างอิงมาใช้แทน) โดยมีข้อยกเว้นเล็กน้อยดังนี้
-
ระบบจะไม่เรียกใช้การทดสอบหากมีการกล่าวถึงอีเมลแทนในบรรทัดคำสั่ง หากต้องการกําหนดแทนที่ที่จะเรียกใช้การทดสอบที่อ้างอิง ให้ใช้กฎ
test_suite
ที่มีเป้าหมายเดียวในแอตทริบิวต์tests
-
เมื่อกําหนดกลุ่มสภาพแวดล้อม ระบบจะไม่รองรับชื่อแทนของกฎ
environment
นอกจากนี้ ระบบยังไม่รองรับตัวเลือกบรรทัดคำสั่ง--target_environment
ด้วย
ตัวอย่าง
filegroup( name = "data", srcs = ["data.txt"], ) alias( name = "other", actual = ":data", )
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
actual
|
ป้ายกำกับ (ต้องระบุ) เป้าหมายที่อีเมลแทนนี้อ้างอิงถึง โดยไม่จำเป็นต้องเป็นกฎ อาจเป็นไฟล์อินพุตก็ได้ |
config_setting
ดูแหล่งที่มาของกฎconfig_setting(name, constraint_values, define_values, deprecation, distribs, features, flag_values, licenses, tags, testonly, values, visibility)
จับคู่สถานะการกําหนดค่าที่คาดไว้ (แสดงเป็น Flag การสร้างหรือข้อจํากัดของแพลตฟอร์ม) เพื่อจุดประสงค์ในการทริกเกอร์แอตทริบิวต์ที่กําหนดค่าได้ ดูselect เพื่อดูวิธีใช้กฎนี้และ แอตทริบิวต์ที่กำหนดค่าได้เพื่อดูภาพรวมของฟีเจอร์ทั่วไป
ตัวอย่าง
รายการต่อไปนี้จะจับคู่กับบิลด์ที่ตั้งค่า --compilation_mode=opt
หรือ
-c opt
(ที่บรรทัดคำสั่งโดยชัดแจ้งหรือโดยนัยจากไฟล์ .bazelrc)
config_setting( name = "simple", values = {"compilation_mode": "opt"} )
รายการต่อไปนี้จะจับคู่กับบิลด์ที่กำหนดเป้าหมายเป็น ARM และใช้การกําหนดค่าที่กำหนดเอง
FOO=bar
(เช่น bazel build --cpu=arm --define FOO=bar ...
)
config_setting( name = "two_conditions", values = { "cpu": "arm", "define": "FOO=bar" } )
รายการต่อไปนี้จะจับคู่กับบิลด์ที่ตั้งFlag ที่ผู้ใช้กำหนด
--//custom_flags:foo=1
(ไม่ว่าจะระบุไว้ในบรรทัดคำสั่งอย่างชัดเจนหรือโดยนัยจากไฟล์ .bazelrc)
config_setting( name = "my_custom_flag_is_set", flag_values = { "//custom_flags:foo": "1" }, )
รายการต่อไปนี้จะจับคู่กับบิลด์ที่กำหนดเป้าหมายเป็นแพลตฟอร์มที่มีสถาปัตยกรรม x86_64 และ glibc เวอร์ชัน 2.25 โดยสมมติว่ามี constraint_value
ที่มีป้ายกำกับ //example:glibc_2_25
โปรดทราบว่าแพลตฟอร์มจะยังคงจับคู่ได้หากมีการกําหนดค่าข้อจํากัดเพิ่มเติมนอกเหนือจาก 2 รายการนี้
config_setting( name = "64bit_glibc_2_25", constraint_values = [ "@platforms//cpu:x86_64", "//example:glibc_2_25", ] )
config_setting
จะไม่ตรงกับ Flag บรรทัดคำสั่งระดับบนสุด แต่ก็อาจยังคงตรงกับเป้าหมายการสร้างบางรายการ
หมายเหตุ
- ดูสิ่งที่จะเกิดขึ้นเมื่อ
config_setting
หลายรายการตรงกับสถานะการกําหนดค่าปัจจุบันได้ที่เลือก - สำหรับคำที่รองรับรูปแบบตัวย่อ (เช่น
--compilation_mode
เทียบกับ-c
) คำจำกัดความของvalues
ต้องใช้รูปแบบแบบเต็ม ซึ่งจะจับคู่การเรียกใช้โดยใช้รูปแบบใดรูปแบบหนึ่งโดยอัตโนมัติ -
หาก Flag ใช้ค่าหลายค่า (เช่น
--copt=-Da --copt=-Db
หรือ Flag ประเภทลิสต์)values = { "flag": "a" }
จะตรงกันหาก"a"
ปรากฏที่ใดก็ได้ในลิสต์จริงvalues = { "myflag": "a,b" }
ทํางานในลักษณะเดียวกัน นั่นคือจะจับคู่กับ--myflag=a --myflag=b
,--myflag=a --myflag=b --myflag=c
,--myflag=a,b
และ--myflag=c,b,a
ความหมายที่แน่นอนจะแตกต่างกันไปในแต่ละ Flag เช่น--copt
ไม่รองรับหลายค่าในอินสแตนซ์เดียวกัน:--copt=a,b
แสดงผลเป็น["a,b"]
ส่วน--copt=a --copt=b
แสดงผลเป็น["a", "b"]
(ดังนั้นvalues = { "copt": "a,b" }
จะตรงกับค่าแรก แต่ไม่ตรงกับค่าหลัง) แต่--ios_multi_cpus
(สำหรับกฎของ Apple) มี: ทั้ง-ios_multi_cpus=a,b
และios_multi_cpus=a --ios_multi_cpus=b
ผลิต["a", "b"]
ตรวจสอบคําจํากัดความของ Flag และทดสอบเงื่อนไขอย่างละเอียดเพื่อยืนยันสิ่งที่คาดหวัง - หากต้องการกำหนดเงื่อนไขที่ไม่ได้อิงตาม Flag การสร้างในตัว ให้ใช้
Flag ที่ Starlark กำหนด คุณใช้
--define
ได้ด้วย แต่วิธีนี้ให้การสนับสนุนที่ต่ำกว่าและไม่แนะนำ ดูการพูดคุยเพิ่มเติมได้ที่นี่ - หลีกเลี่ยงการระบุคำจำกัดความ
config_setting
ซ้ำกันในแพ็กเกจต่างๆ แต่ให้อ้างอิงconfig_setting
ทั่วไปที่กําหนดไว้ในแพ็กเกจแคนนอนิกแทน values
,define_values
และconstraint_values
ใช้ร่วมกันในconfig_setting
เดียวกันได้ แต่ต้องตั้งค่าอย่างน้อย 1 รายการสำหรับconfig_setting
หนึ่งๆ
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
constraint_values
|
รายการป้ายกํากับ ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ constraint_values ขั้นต่ำที่แพลตฟอร์มเป้าหมายต้องระบุเพื่อจับคู่กับ config_setting นี้ (ระบบจะไม่พิจารณาแพลตฟอร์มการเรียกใช้) ระบบจะไม่สนใจค่าข้อจำกัดเพิ่มเติมที่แพลตฟอร์มมี ดูรายละเอียดได้ที่หัวข้อ
แอตทริบิวต์การสร้างที่กำหนดค่าได้
หาก หาก |
define_values
|
พจนานุกรม: สตริง -> สตริง nonconfigurable ค่าเริ่มต้นคือ values แต่ใช้สำหรับ Flag --define โดยเฉพาะ
ซึ่งหมายความว่า config_setting( name = "a_and_b", values = { "define": "a=1", "define": "b=2", }) ไม่ทํางานเนื่องจากคีย์เดียวกัน ( config_setting( name = "a_and_b", define_values = { "a": "1", "b": "2", }) ตรงกับ
|
flag_values
|
พจนานุกรม: label -> String; nonconfigurable; ค่าเริ่มต้นคือ values แต่ใช้สำหรับ
Flag การสร้างที่ผู้ใช้กำหนด
แอตทริบิวต์นี้เป็นแอตทริบิวต์ที่แยกต่างหากเนื่องจากระบบจะอ้างอิง Flag ที่กําหนดโดยผู้ใช้เป็นป้ายกํากับ ขณะที่จะอ้างอิง Flag ในตัวเป็นสตริงที่กำหนดเอง |
values
|
พจนานุกรม: สตริง -> สตริง nonconfigurable ค่าเริ่มต้นคือ กฎนี้จะรับค่ากําหนดของเป้าหมายที่กําหนดค่าไว้ซึ่งอ้างอิงกฎนี้ในคำสั่ง เพื่อความสะดวก ระบบจะระบุค่าการกําหนดค่าเป็น Flag การสร้าง (โดยไม่มี หากไม่ได้ตั้งค่า Flag อย่างชัดเจนในบรรทัดคำสั่ง ระบบจะใช้ค่าเริ่มต้นของ Flag นั้น
หากคีย์ปรากฏหลายครั้งในพจนานุกรม ระบบจะใช้เฉพาะอินสแตนซ์ล่าสุด
หากคีย์อ้างอิงถึง Flag ที่ตั้งค่าได้หลายครั้งในบรรทัดคำสั่ง (เช่น
|
filegroup
ดูแหล่งที่มาของกฎfilegroup(name, srcs, data, compatible_with, deprecation, distribs, features, licenses, output_group, restricted_to, tags, target_compatible_with, testonly, visibility)
ใช้ filegroup
เพื่อรวบรวมเอาต์พุตของชุดเป้าหมายภายใต้ป้ายกำกับเดียว
filegroup
ไม่ได้ใช้แทนการระบุเป้าหมายในบรรทัดคำสั่งหรือในแอตทริบิวต์ของกฎอื่น เนื่องจากเป้าหมายมีพร็อพเพอร์ตี้หลายรายการนอกเหนือจากเอาต์พุต ซึ่งไม่ได้รวบรวมในลักษณะเดียวกัน อย่างไรก็ตาม ก็ยังมีประโยชน์ในบางกรณี เช่น ในแอตทริบิวต์ srcs
ของ genrule หรือแอตทริบิวต์ data
ของกฎ *_binary
เราขอแนะนำให้ใช้ filegroup
แทนการอ้างอิงไดเรกทอรีโดยตรง
ไม่แนะนําให้อ้างอิงไดเรกทอรีโดยตรง เนื่องจากระบบบิลด์ไม่มีความรู้อย่างเต็มรูปแบบเกี่ยวกับไฟล์ทั้งหมดที่อยู่ภายใต้ไดเรกทอรี จึงอาจไม่สร้างใหม่เมื่อไฟล์เหล่านี้มีการเปลี่ยนแปลง
เมื่อใช้ร่วมกับ glob filegroup
จะช่วยให้ระบบบิลด์ทราบไฟล์ทั้งหมดอย่างชัดเจน
ตัวอย่าง
หากต้องการสร้าง filegroup
ที่ประกอบด้วยไฟล์ต้นฉบับ 2 ไฟล์ ให้ทำดังนี้
filegroup( name = "mygroup", srcs = [ "a_file.txt", "//a/library:target", "//a/binary:target", ], )
หรือใช้ glob
เพื่อทำการ Crawl ไดเรกทอรี testdata โดยสมบูรณ์
filegroup( name = "exported_testdata", srcs = glob([ "testdata/*.dat", "testdata/logs/**/*.log", ]), )
หากต้องการใช้คําจํากัดความเหล่านี้ ให้อ้างอิง filegroup
ที่มีป้ายกํากับจากกฎใดก็ได้ ดังนี้
cc_library( name = "my_library", srcs = ["foo.cc"], data = [ "//my_package:exported_testdata", "//my_package:mygroup", ], )
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
srcs
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ
การใช้ผลลัพธ์ของนิพจน์ glob สำหรับค่าของแอตทริบิวต์ |
data
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ
ระบบจะเพิ่มเป้าหมายที่มีชื่อในแอตทริบิวต์ |
output_group
|
สตริง ค่าเริ่มต้นคือ "กลุ่มเอาต์พุต" คือหมวดหมู่ของรายการต่างๆ ที่เป็นเอาต์พุตของเป้าหมาย ซึ่งระบุไว้ในการใช้งานของกฎนั้น |
genquery
ดูแหล่งที่มาของกฎgenquery(name, deps, data, compatible_with, compressed_output, deprecation, distribs, exec_compatible_with, exec_properties, expression, features, licenses, opts, restricted_to, scope, strict, tags, target_compatible_with, testonly, visibility)
genquery()
เรียกใช้การค้นหาที่ระบุในภาษาการค้นหาของ Bazel และแสดงผลลัพธ์เป็นไฟล์
ระบบจะอนุญาตให้การค้นหาเข้าชมเฉพาะการปิดเชิงสื่อกลางของเป้าหมายที่ระบุในแอตทริบิวต์ scope
เท่านั้น เพื่อให้บิลด์มีความสอดคล้องกัน การค้นหาที่ละเมิดกฎนี้จะดำเนินการไม่สำเร็จระหว่างการดำเนินการหากไม่ได้ระบุ strict
หรือ strict
เป็น "จริง" (หาก strict
เป็น "เท็จ" ระบบจะข้ามเป้าหมายที่อยู่นอกขอบเขตพร้อมแสดงคำเตือน) วิธีที่ง่ายที่สุดในการหลีกเลี่ยงปัญหานี้คือระบุป้ายกำกับเดียวกันในขอบเขตเดียวกับในนิพจน์การค้นหา
ความแตกต่างเพียงอย่างเดียวระหว่างข้อความค้นหาที่อนุญาตที่นี่และในบรรทัดคำสั่งคือระบบไม่อนุญาตให้ใช้ข้อความค้นหาที่มีข้อกำหนดเป้าหมายแบบไวลด์การ์ด (เช่น //pkg:*
หรือ //pkg:all
) ที่นี่
สาเหตุมี 2 ข้อ ประการแรก เนื่องจาก genquery
ต้องระบุขอบเขตเพื่อป้องกันไม่ให้เป้าหมายที่อยู่นอกการปิดเชิงสื่อกลางของข้อความค้นหาส่งผลต่อเอาต์พุต และประการที่ 2 เนื่องจากไฟล์ BUILD
ไม่รองรับการอ้างอิงไวลด์การ์ด (เช่น ไม่อนุญาตให้ใช้ deps=["//a/..."]
)
ระบบจะจัดเรียงเอาต์พุตของ genquery ตามลําดับตัวอักษรเพื่อบังคับใช้เอาต์พุตแบบกำหนดได้ ยกเว้น --output=graph|minrank|maxrank
หรือเมื่อใช้ somepath
เป็นฟังก์ชันระดับบนสุด
ชื่อไฟล์เอาต์พุตคือชื่อของกฎ
ตัวอย่าง
ตัวอย่างนี้จะเขียนรายการป้ายกำกับใน Closure แบบทรานซิทีฟของเป้าหมายที่ระบุลงในไฟล์
genquery( name = "kiwi-deps", expression = "deps(//kiwi:kiwi_lib)", scope = ["//kiwi:kiwi_lib"], )
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
compressed_output
|
บูลีน ค่าเริ่มต้นคือ True ระบบจะเขียนเอาต์พุตการค้นหาในรูปแบบไฟล์ GZIP คุณสามารถใช้การตั้งค่านี้เพื่อหลีกเลี่ยงการใช้หน่วยความจำของ Bazel ที่เพิ่มขึ้นอย่างรวดเร็วเมื่อคาดว่าเอาต์พุตการค้นหาจะมีขนาดใหญ่ Bazel จะบีบอัดเอาต์พุตการค้นหาที่มีขนาดใหญ่กว่า 220 ไบต์ภายในอยู่แล้ว ไม่ว่าค่าการตั้งค่านี้จะเป็นอย่างไร ดังนั้นการตั้งค่านี้เป็น True อาจไม่ลดกองข้อมูลที่เก็บไว้ อย่างไรก็ตาม การดำเนินการนี้จะช่วยให้ Bazel ข้ามการขยายไฟล์เมื่อเขียนไฟล์เอาต์พุต ซึ่งอาจใช้หน่วยความจำมาก
|
expression
|
สตริง ต้องระบุ คําค้นหาที่จะดําเนินการ ซึ่งแตกต่างจากบรรทัดคำสั่งและตำแหน่งอื่นๆ ในไฟล์ BUILD เนื่องจากระบบจะแก้ไขป้ายกำกับที่นี่โดยสัมพันธ์กับไดเรกทอรีรูทของพื้นที่ทำงาน เช่น ป้ายกำกับ:b ในแอตทริบิวต์นี้ในไฟล์ a/BUILD จะอ้างอิงถึงเป้าหมาย //:b
|
opts
|
รายการสตริง ค่าเริ่มต้นคือ bazel query ได้ ระบบไม่อนุญาตให้ใช้ตัวเลือกการค้นหาบางอย่างใน--keep_going , --query_file , --universe_scope , --order_results และ --order_output ตัวเลือกที่ไม่ได้ระบุไว้ที่นี่จะมีค่าเริ่มต้นเหมือนกับในบรรทัดคำสั่งของ bazel query
|
scope
|
รายการป้ายกำกับ (ต้องระบุ) ขอบเขตของการค้นหา ไม่อนุญาตให้การค้นหาแตะเป้าหมายที่อยู่นอกการปิดเชิงสื่อนำของเป้าหมายเหล่านี้ |
strict
|
บูลีน ค่าเริ่มต้นคือ |
genrule
ดูแหล่งที่มาของกฎgenrule(name, srcs, outs, cmd, cmd_bash, cmd_bat, cmd_ps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, executable, features, licenses, local, message, output_licenses, output_to_bindir, restricted_to, tags, target_compatible_with, testonly, toolchains, tools, visibility)
genrule
จะสร้างไฟล์อย่างน้อย 1 ไฟล์โดยใช้คำสั่ง Bash ที่ผู้ใช้กำหนด
Genrules คือกฎการสร้างทั่วไปที่คุณใช้ได้หากไม่มีกฎเฉพาะสำหรับงาน
เช่น คุณอาจเรียกใช้ Bash แบบบรรทัดเดียว อย่างไรก็ตาม หากต้องการคอมไพล์ไฟล์ C++ ให้ใช้กฎ cc_*
ที่มีอยู่ เนื่องจากมีการดำเนินการที่ยากลำบากทั้งหมดให้คุณแล้ว
โปรดทราบว่า genrule ต้องใช้เชลล์เพื่อตีความอาร์กิวเมนต์คำสั่ง นอกจากนี้ คุณยังอ้างอิงโปรแกรมใดก็ได้ที่มีอยู่ใน PATH ได้โดยง่าย แต่วิธีนี้จะทำให้คำสั่งไม่สมบูรณ์และอาจทำซ้ำไม่ได้ หากต้องการเรียกใช้เครื่องมือเพียงรายการเดียว ให้พิจารณาใช้ run_binary แทน
การดำเนินการที่สร้างโดย genrules ไม่ควรคาดเดาอะไรเกี่ยวกับไดเรกทอรีทํางาน เช่นเดียวกับการดำเนินการอื่นๆ ทั้งหมดที่ Bazel รับประกันคืออินพุตที่ประกาศไว้จะพร้อมใช้งานที่เส้นทางที่ $(location)
แสดงผลสําหรับป้ายกำกับ ตัวอย่างเช่น หากการดําเนินการทํางานในแซนด์บ็อกซ์หรือจากระยะไกล การใช้งานแซนด์บ็อกซ์หรือการดําเนินการจากระยะไกลจะเป็นตัวกําหนดไดเรกทอรีทํางาน หากเรียกใช้โดยตรง (โดยใช้กลยุทธ์ standalone
) ไดเรกทอรีที่ทำงานจะเป็นรูทการเรียกใช้ กล่าวคือ ผลลัพธ์ของ bazel info execution_root
อย่าใช้ genrule เพื่อเรียกใช้การทดสอบ มีการผ่อนปรนพิเศษสำหรับการทดสอบและผลการทดสอบ รวมถึงนโยบายการแคชและตัวแปรสภาพแวดล้อม โดยทั่วไปแล้ว การทดสอบต้องทำงานหลังจากการบิลด์เสร็จสมบูรณ์และบนสถาปัตยกรรมเป้าหมาย ส่วน genrules จะทำงานในระหว่างการบิลด์และบนสถาปัตยกรรม exec (ทั้ง 2 อย่างอาจแตกต่างกัน) หากต้องการกฎการทดสอบวัตถุประสงค์ทั่วไป ให้ใช้ sh_test
ข้อควรพิจารณาเกี่ยวกับการคอมไพล์แบบข้ามระบบ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการคอมไพล์ข้ามภาษาได้จากคู่มือผู้ใช้
ขณะที่ genrules ทำงานระหว่างการบิลด์ ผลลัพธ์มักจะใช้หลังจากการบิลด์เพื่อนำไปใช้งานหรือทดสอบ พิจารณาตัวอย่างการคอมไพล์โค้ด C สําหรับไมโครคอนโทรลเลอร์: คอมไพเลอร์จะยอมรับไฟล์ซอร์ส C และสร้างโค้ดที่ทํางานบนไมโครคอนโทรลเลอร์ โค้ดที่สร้างขึ้นจะไม่สามารถทำงานบน CPU ที่ใช้สร้างได้ แต่คอมไพเลอร์ C (หากคอมไพล์จากซอร์สโค้ด) จะต้องทำงานได้
ระบบบิลด์ใช้การกําหนดค่า exec เพื่ออธิบายเครื่องที่บิลด์ทํางานอยู่ และการกําหนดค่าเป้าหมายเพื่ออธิบายเครื่องที่เอาต์พุตของบิลด์ควรทํางาน โดยจะมีตัวเลือกในการกําหนดค่าแต่ละรายการและแยกไฟล์ที่เกี่ยวข้องออกเป็นไดเรกทอรีแยกต่างหากเพื่อหลีกเลี่ยงข้อขัดแย้ง
สำหรับ genrules ระบบการบิลด์จะตรวจสอบว่ามีการคอมไพล์ทรัพยากร Dependency อย่างเหมาะสม โดยระบบจะคอมไพล์ srcs
(หากจำเป็น) สำหรับการกำหนดค่า target, คอมไพล์ tools
สำหรับการกำหนดค่า exec และถือว่าเอาต์พุตมีไว้สำหรับการกำหนดค่า target นอกจากนี้ยังมี
ตัวแปร "make" ที่คำสั่ง genrule สามารถส่งไปยังเครื่องมือที่เกี่ยวข้องได้
เราไม่ต้องการให้ genrule กำหนดแอตทริบิวต์ deps
เนื่องจากกฎอื่นๆ ในตัวใช้ข้อมูลเมตาที่ขึ้นอยู่กับภาษาซึ่งส่งผ่านระหว่างกฎต่างๆ เพื่อกำหนดวิธีจัดการกฎแบบใช้ร่วมกันโดยอัตโนมัติ แต่ genrule ไม่สามารถทำงานอัตโนมัติในระดับนี้ได้ Genrules จะทํางานในระดับไฟล์และ runfiles เท่านั้น
กรณีพิเศษ
การคอมไพล์ Exec-exec: ในบางกรณี ระบบบิลด์ต้องเรียกใช้ genrules เพื่อให้สามารถเรียกใช้เอาต์พุตระหว่างการบิลด์ได้ด้วย ตัวอย่างเช่น หาก genrule หนึ่งสร้างคอมไพเลอร์ที่กำหนดเองซึ่ง genrule อื่นนำมาใช้ภายหลัง Genrule แรกจะต้องสร้างเอาต์พุตสำหรับการกำหนดค่า exec เนื่องจากคอมไพเลอร์จะทำงานใน genrule อื่น ในกรณีนี้ ระบบบิลด์จะทําในสิ่งที่ถูกต้องโดยอัตโนมัติ โดยจะสร้าง srcs
และ outs
ของ genrule แรกสําหรับการกําหนดค่า exec แทนการกําหนดค่าเป้าหมาย ดูข้อมูลเพิ่มเติมได้ที่คู่มือผู้ใช้
เครื่องมือ JDK และ C++: หากต้องการใช้เครื่องมือจาก JDK หรือชุดคอมไพเลอร์ C++ ระบบบิลด์จะมีชุดตัวแปรให้ใช้งาน ดูรายละเอียดได้ที่ตัวแปร"Make"
สภาพแวดล้อม Genrule
คำสั่ง genrule จะดำเนินการโดยเชลล์ Bash ที่กำหนดค่าให้ดำเนินการไม่สำเร็จเมื่อคำสั่งหรือไปป์ไลน์ไม่สำเร็จโดยใช้ set -e -o pipefail
เครื่องมือสร้างจะเรียกใช้คําสั่ง Bash ในสภาพแวดล้อมกระบวนการที่ผ่านการกรองแล้วซึ่งกําหนดเฉพาะตัวแปรหลัก เช่น PATH
, PWD
, TMPDIR
และอื่นๆ อีก 2-3 รายการ
ระบบจะไม่ส่งตัวแปรส่วนใหญ่ที่กําหนดไว้ในสภาพแวดล้อมเชลล์ของผู้ใช้ไปยังคําสั่งของ genrule เพื่อให้มั่นใจว่าบิลด์จะทําซ้ำได้ อย่างไรก็ตาม Bazel (แต่ไม่ใช่ Blaze) จะส่งค่าของตัวแปรสภาพแวดล้อม PATH
ของผู้ใช้
การเปลี่ยนแปลงค่า PATH
จะทำให้ Bazel เรียกใช้คำสั่งอีกครั้งในบิลด์ถัดไป
คำสั่ง genrule ไม่ควรเข้าถึงเครือข่าย ยกเว้นเพื่อเชื่อมต่อกระบวนการที่เป็นกระบวนการย่อยของคำสั่งนั้นเอง แต่ปัจจุบันยังไม่มีการบังคับใช้
ระบบบิลด์จะลบไฟล์เอาต์พุตที่มีอยู่โดยอัตโนมัติ แต่สร้างไดเรกทอรีหลักที่จำเป็นก่อนที่จะเรียกใช้ genrule รวมถึงนำไฟล์เอาต์พุตออกในกรณีที่ดำเนินการไม่สำเร็จด้วย
คำแนะนำทั่วไป
- ตรวจสอบว่าเครื่องมือที่ GenRule เรียกใช้เป็นแบบกำหนดได้และปิดผนึก โดยไม่ควรเขียนการประทับเวลาไปยังเอาต์พุต รวมถึงควรใช้การจัดเรียงแบบคงที่สำหรับชุดและแผนที่ รวมถึงเขียนเฉพาะเส้นทางไฟล์แบบสัมพัทธ์ไปยังเอาต์พุตเท่านั้น โดยไม่มีเส้นทางแบบสัมบูรณ์ การไม่ปฏิบัติตามกฎนี้จะทําให้ลักษณะการบิลด์ที่ไม่คาดคิด (Bazel ไม่สร้าง genrule ขึ้นมาใหม่ตามที่คุณคิดไว้) และทําให้ประสิทธิภาพแคชลดลง
- ใช้
$(location)
กับเอาต์พุต เครื่องมือ และแหล่งที่มาอย่างแพร่หลาย เนื่องจากมีการแยกไฟล์เอาต์พุตสำหรับการกำหนดค่าต่างๆ Genrules จึงใช้เส้นทางแบบฮาร์ดโค้ดและ/หรือเส้นทางแบบสัมบูรณ์ไม่ได้ - เขียนมาโคร Starlark ทั่วไปในกรณีที่มีการใช้ GenRule เดียวกันหรือคล้ายกันมากในหลายตำแหน่ง หาก genrule มีความซับซ้อน ให้พิจารณานำไปใช้ในสคริปต์หรือเป็นกฎ Starlark ซึ่งจะช่วยปรับปรุงความสามารถในการอ่านและความสามารถในการทดสอบ
- ตรวจสอบว่ารหัสออกแสดงสถานะความสําเร็จหรือความล้มเหลวของ genrule อย่างถูกต้อง
- อย่าเขียนข้อความที่ให้ข้อมูลไปยัง stdout หรือ stderr แม้ว่าจะมีประโยชน์สำหรับการแก้ไขข้อบกพร่อง แต่การดำเนินการนี้อาจกลายเป็นการรบกวนได้ง่ายๆ การดำเนินการ genrule ที่ประสบความสำเร็จควรจะไม่มีเสียง ในทางกลับกัน genrule ที่ทำงานไม่สำเร็จควรแสดงข้อความแสดงข้อผิดพลาดที่ชัดเจน
$$
evaluates to a$
, a literal dollar-sign, so in order to invoke a shell command containing dollar-signs such asls $(dirname $x)
, one must escape it thus:ls $$(dirname $$x)
- หลีกเลี่ยงการสร้างลิงก์สัญลักษณ์และไดเรกทอรี Bazel จะไม่คัดลอกโครงสร้างไดเรกทอรี/ลิงก์สัญลักษณ์ที่สร้างโดย genrules และการตรวจสอบรายการอ้างอิงของไดเรกทอรีนั้นไม่ถูกต้อง
- เมื่ออ้างอิง genrule ในกฎอื่นๆ คุณจะใช้ป้ายกํากับของ genrule หรือป้ายกํากับของไฟล์เอาต์พุตแต่ละไฟล์ก็ได้ บางครั้งแนวทางหนึ่งอ่านง่ายกว่า บางครั้งอีกแนวทางหนึ่งอ่านง่ายกว่า การอ้างอิงเอาต์พุตด้วยชื่อใน
srcs
ของกฎที่ใช้จะหลีกเลี่ยงการดึงเอาต์พุตอื่นๆ ของ genrule โดยไม่ได้ตั้งใจ แต่อาจทําให้ยุ่งยากหาก genrule ผลิตเอาต์พุตจํานวนมาก
ตัวอย่าง
ตัวอย่างนี้จะสร้าง foo.h
ไม่มีแหล่งที่มา เนื่องจากคําสั่งไม่รับอินพุตใดๆ "ไบนารี" ที่เรียกใช้โดยคําสั่งคือสคริปต์ Perl ในแพ็กเกจเดียวกับ genrule
genrule( name = "foo", srcs = [], outs = ["foo.h"], cmd = "./$(location create_foo.pl) > \"$@\"", tools = ["create_foo.pl"], )
ตัวอย่างต่อไปนี้แสดงวิธีใช้ filegroup
และเอาต์พุตของ genrule
อื่น โปรดทราบว่าการใช้ $(SRCS)
แทนคำสั่ง $(location)
ที่ชัดเจนก็ใช้ได้เช่นกัน ตัวอย่างนี้ใช้คำสั่งหลังเพื่อสาธิต
genrule( name = "concat_all_files", srcs = [ "//some:files", # a filegroup with multiple files in it ==> $(locations) "//other:gen", # a genrule with a single output ==> $(location) ], outs = ["concatenated.txt"], cmd = "cat $(locations //some:files) $(location //other:gen) > $@", )
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ คุณอ้างอิงกฎนี้ตามชื่อได้ในส่วน srcs หรือ deps ของกฎ BUILD อื่นๆ หากกฎสร้างไฟล์ต้นทาง คุณควรใช้แอตทริบิวต์ srcs
|
srcs
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ
แอตทริบิวต์นี้ไม่เหมาะสำหรับแสดงเครื่องมือที่
ระบบบิลด์จะสร้างข้อกําหนดเบื้องต้นเหล่านี้ก่อนที่จะเรียกใช้คําสั่ง genrule โดยระบบจะสร้างโดยใช้การกําหนดค่าเดียวกับคําขอบิลด์เดิม ชื่อไฟล์ของข้อกําหนดเบื้องต้นเหล่านี้จะพร้อมใช้งานสําหรับคําสั่งเป็นรายการที่คั่นด้วยเว้นวรรคใน |
outs
|
รายการชื่อไฟล์ กำหนดค่าไม่ได้ ต้องระบุ รายการไฟล์ที่สร้างขึ้นโดยกฎนี้ไฟล์เอาต์พุตต้องไม่ข้ามขอบเขตของแพ็กเกจ ระบบจะตีความชื่อไฟล์เอาต์พุตโดยสัมพันธ์กับแพ็กเกจ
หากตั้งค่า Flag
ระบบคาดว่าคําสั่ง genrule จะสร้างไฟล์เอาต์พุตแต่ละไฟล์ในตำแหน่งที่กำหนดไว้ล่วงหน้า
ตำแหน่งจะอยู่ใน |
cmd
|
สตริง ค่าเริ่มต้นคือ $(location)
และตัวแปร "Make"
cmd_bash , cmd_ps และ cmd_bat หากไม่มีค่าใดที่ใช้ได้
หากความยาวบรรทัดคำสั่งเกินขีดจำกัดของแพลตฟอร์ม (64K ใน Linux/macOS, 8K ใน Windows) genrule จะเขียนคำสั่งลงในสคริปต์และเรียกใช้สคริปต์นั้นเพื่อแก้ปัญหา ซึ่งมีผลกับแอตทริบิวต์ cmd ทั้งหมด ( |
cmd_bash
|
สตริง ค่าเริ่มต้นคือ แอตทริบิวต์นี้มีความสำคัญสูงกว่า |
cmd_bat
|
สตริง ค่าเริ่มต้นคือ แอตทริบิวต์นี้มีความสำคัญสูงกว่า
|
cmd_ps
|
สตริง ค่าเริ่มต้นคือ แอตทริบิวต์นี้มีลําดับความสําคัญสูงกว่า
เราเรียกใช้คำสั่งต่อไปนี้เพื่อตั้งค่าสภาพแวดล้อมก่อนที่จะเรียกใช้คำสั่ง PowerShell ใน genrule เพื่อให้ Powershell ใช้งานได้ง่ายขึ้นและเกิดข้อผิดพลาดน้อยลง
|
executable
|
บูลีน ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ
การตั้งค่า Flag นี้เป็น "จริง" หมายความว่าเอาต์พุตเป็นไฟล์ที่เรียกใช้ได้และสามารถเรียกใช้โดยใช้คำสั่ง ระบบไม่รองรับการประกาศข้อมูลที่ต้องพึ่งพาสําหรับไฟล์ปฏิบัติการที่สร้างขึ้น |
local
|
บูลีน ค่าเริ่มต้นคือ
หากตั้งค่าเป็น "จริง" ตัวเลือกนี้จะบังคับให้
ซึ่งเทียบเท่ากับการให้แท็ก "local" ( |
message
|
สตริง ค่าเริ่มต้นคือ
ข้อความความคืบหน้าที่จะพิมพ์เมื่อดำเนินการขั้นตอนการสร้างนี้ โดยค่าเริ่มต้น ข้อความจะเป็น "กำลังสร้างเอาต์พุต" (หรือข้อความที่กระชับและเข้าใจง่ายพอๆ กัน) แต่คุณระบุข้อความที่เจาะจงมากขึ้นได้ ใช้แอตทริบิวต์นี้แทน |
output_licenses
|
ประเภทใบอนุญาต ค่าเริ่มต้นคือ common attributes
|
output_to_bindir
|
บูลีน ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ
หากตั้งค่าเป็น "จริง" ตัวเลือกนี้จะทําให้ระบบเขียนไฟล์เอาต์พุตลงในไดเรกทอรี |
tools
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ
ระบบบิลด์จะสร้างข้อกําหนดเบื้องต้นเหล่านี้ก่อนเรียกใช้คําสั่ง genrule โดยสร้างโดยใช้การกําหนดค่า exec เนื่องจากเครื่องมือเหล่านี้จะทํางานเป็นส่วนหนึ่งของบิลด์ คุณดูเส้นทางของ
|
starlark_doc_extract
ดูแหล่งที่มาของกฎstarlark_doc_extract(name, deps, src, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, render_main_repo_name, restricted_to, symbol_names, tags, target_compatible_with, testonly, visibility)
starlark_doc_extract()
จะดึงข้อมูลเอกสารประกอบสำหรับกฎ ฟังก์ชัน (รวมถึงมาโคร) แง่มุม และผู้ให้บริการที่กําหนดหรือส่งออกอีกครั้งในไฟล์ .bzl
หรือ .scl
ที่ระบุ เอาต์พุตของกฎนี้คือ ModuleInfo
โปรโตคอลแบบไบนารีตามที่ระบุไว้
ใน
stardoc_output.proto
ในซอร์สทรี Bazel
เป้าหมายเอาต์พุตโดยนัย
name.binaryproto
(เอาต์พุตเริ่มต้น):ModuleInfo
โปรโตคอลไบนารีname.textproto
(จะสร้างขึ้นก็ต่อเมื่อมีการขออย่างชัดเจนเท่านั้น):name.binaryproto
เวอร์ชันข้อความ proto
คำเตือน: เราไม่รับประกันว่ารูปแบบเอาต์พุตของกฎนี้จะเสถียร โดยมีวัตถุประสงค์หลักเพื่อใช้ภายในโดย Stardoc
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
deps
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ load() โดย
src เป้าหมายเหล่านี้ควรเป็นเป้าหมาย bzl_library ภายใต้การใช้งานปกติ แต่กฎ starlark_doc_extract ไม่ได้บังคับใช้เช่นนั้น และยอมรับเป้าหมายใดก็ตามที่ให้ไฟล์ Starlark ใน DefaultInfo
โปรดทราบว่าไฟล์ Starlark ที่รวมไว้ต้องเป็นไฟล์ในต้นไม้ซอร์สโค้ด Bazel ไม่สามารถ |
src
|
ป้ายกำกับ (ต้องระบุ) ไฟล์ Starlark ที่จะดึงข้อมูลเอกสารประกอบโปรดทราบว่าไฟล์นี้ต้องเป็นไฟล์ในซอร์สทรี เนื่องจาก Bazel ไม่สามารถ |
render_main_repo_name
|
บูลีน ค่าเริ่มต้นคือ //foo:bar.bzl จะแสดงผลเป็น @main_repo_name//foo:bar.bzl )
ชื่อที่จะใช้สำหรับที่เก็บข้อมูลหลักจะมาจาก คุณควรตั้งค่าแอตทริบิวต์นี้เป็น |
symbol_names
|
รายการสตริง ค่าเริ่มต้นคือ
|
test_suite
ดูแหล่งที่มาของกฎtest_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, tests, visibility)
test_suite
กำหนดชุดการทดสอบที่ถือว่า "มีประโยชน์" ต่อมนุษย์ ซึ่งช่วยให้โปรเจ็กต์กำหนดชุดการทดสอบได้ เช่น "การทดสอบที่คุณต้องเรียกใช้ก่อนเช็คอิน" "การทดสอบความเครียดของโปรเจ็กต์" หรือ "การทดสอบย่อยทั้งหมด" คำสั่ง bazel test
จะจัดระเบียบตามลักษณะนี้: สําหรับการเรียกใช้ เช่น bazel test //some/test:suite
ก่อนอื่น Bazel จะระบุเป้าหมายการทดสอบทั้งหมดที่รวมอยู่ในเป้าหมาย //some/test:suite
โดยอ้อม (เราเรียกสิ่งนี้ว่า "การขยาย test_suite") จากนั้น Bazel จะสร้างและทดสอบเป้าหมายเหล่านั้น
ตัวอย่าง
ชุดทดสอบเพื่อเรียกใช้การทดสอบขนาดเล็กทั้งหมดในแพ็กเกจปัจจุบัน
test_suite( name = "small_tests", tags = ["small"], )
ชุดทดสอบที่เรียกใช้ชุดการทดสอบที่ระบุ
test_suite( name = "smoke_tests", tests = [ "system_unittest", "public_api_unittest", ], )
ชุดทดสอบเพื่อเรียกใช้การทดสอบทั้งหมดในแพ็กเกจปัจจุบันซึ่งไม่มีปัญหา
test_suite( name = "non_flaky_test", tags = ["-flaky"], )
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
tags
|
รายการสตริง ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ แท็กที่ขึ้นต้นด้วยอักขระ "-" จะถือว่าเป็นแท็กเชิงลบ ระบบจะไม่ถือว่าอักขระ "-" ที่อยู่ก่อนหน้าเป็นส่วนหนึ่งของแท็ก ดังนั้นแท็กชุด "-small" จึงตรงกับขนาด "small" ของชุดทดสอบ แท็กอื่นๆ ทั้งหมดจะถือว่าเป็นแท็กเชิงบวก หากต้องการทำให้แท็กเชิงบวกชัดเจนยิ่งขึ้น คุณอาจทำให้แท็กขึ้นต้นด้วยอักขระ "+" ได้ด้วย ซึ่งระบบจะไม่ประเมินอักขระนี้เป็นส่วนหนึ่งของข้อความในแท็ก เพียงแต่ทำให้อ่านความแตกต่างระหว่างเชิงบวกและเชิงลบได้ง่ายขึ้น เฉพาะกฎทดสอบที่ตรงกับแท็กเชิงบวกทั้งหมดและแท็กเชิงลบไม่มีเท่านั้นที่จะรวมอยู่ในชุดทดสอบ โปรดทราบว่าการดำเนินการนี้ไม่ได้หมายความว่าระบบจะข้ามการตรวจสอบข้อผิดพลาดสำหรับทรัพยากรที่ใช้ร่วมกันในข้อสอบที่กรองออก ทรัพยากรที่ใช้ร่วมกันในข้อสอบที่ข้ามยังต้องถูกต้องตามกฎหมาย (เช่น ไม่ถูกบล็อกโดยข้อจำกัดด้านการแสดงผล)
คีย์เวิร์ดแท็ก
โปรดทราบว่า
หากต้องการ |
tests
|
รายการป้ายกํากับ ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ
ระบบยอมรับ
หากไม่ได้ระบุแอตทริบิวต์ |