กฎ
ชื่อแทน
ดูแหล่งที่มาของกฎalias(name, actual, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)
  alias กฎจะสร้างชื่ออื่นที่ใช้เรียกกฎได้
  การแทนชื่อใช้ได้กับเป้าหมาย "ปกติ" เท่านั้น โดยเฉพาะอย่างยิ่ง package_group
  และ test_suite จะตั้งชื่อแทนไม่ได้
การใช้นามแฝงอาจมีประโยชน์ในที่เก็บขนาดใหญ่ซึ่งการเปลี่ยนชื่อเป้าหมายจะต้องมีการเปลี่ยนแปลงในไฟล์จำนวนมาก นอกจากนี้ คุณยังใช้กฎนามแฝงเพื่อจัดเก็บการเรียกฟังก์ชัน select ได้หากต้องการนำตรรกะนั้นกลับมาใช้ซ้ำสำหรับเป้าหมายหลายรายการ
กฎนามแฝงมีการประกาศการมองเห็นของตัวเอง ในด้านอื่นๆ ทั้งหมด จะทำงาน เหมือนกับกฎที่อ้างอิง (เช่น ระบบจะไม่สนใจ testonly ในนามแฝง แต่จะใช้ testonly-ness ของกฎที่อ้างอิงแทน) โดยมีข้อยกเว้นเล็กๆ น้อยๆ ดังนี้
- 
      ระบบจะไม่เรียกใช้การทดสอบหากมีการกล่าวถึงนามแฝงในการทดสอบในบรรทัดคำสั่ง หากต้องการกำหนดนามแฝง
      ที่เรียกใช้การทดสอบที่อ้างอิง ให้ใช้กฎ 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)
ตรงกับสถานะการกำหนดค่าที่คาดไว้ (แสดงเป็นแฟล็กบิลด์หรือข้อจำกัดของแพลตฟอร์ม) เพื่อ วัตถุประสงค์ในการเรียกใช้แอตทริบิวต์ที่กำหนดค่าได้ ดูเลือกเพื่อดู วิธีใช้กฎนี้และ แอตทริบิวต์ที่กำหนดค่าได้เพื่อดูภาพรวมของฟีเจอร์ทั่วไป
ตัวอย่าง
การจับคู่ต่อไปนี้จะใช้กับบิลด์ที่ตั้งค่า --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 จะไม่ตรงกับแฟล็กบรรทัดคำสั่งระดับบนสุด แต่ก็อาจตรงกับเป้าหมายการสร้างบางรายการ
  หมายเหตุ
- ดูเลือกเพื่อดูสิ่งที่เกิดขึ้นเมื่อ
       config_settingหลายรายการตรงกับสถานะการกำหนดค่าปัจจุบัน
- สำหรับ Flag ที่รองรับรูปแบบย่อ (เช่น --compilation_modeกับ-c)valuesคำจำกัดความต้องใช้รูปแบบเต็ม ซึ่งจะจับคู่การเรียกใช้โดยอัตโนมัติ โดยใช้รูปแบบใดรูปแบบหนึ่ง
- 
      หากแฟล็กมีหลายค่า (เช่น --copt=-Da --copt=-Dbหรือแฟล็ก Starlark ประเภทรายการ)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ความหมายที่แน่นอนจะแตกต่างกันไปในแต่ละ แฟล็ก เช่น--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"]ตรวจสอบคำจำกัดความของฟีเจอร์และทดสอบ เงื่อนไขอย่างละเอียดเพื่อยืนยันความคาดหวังที่แน่นอน
- หากต้องการกำหนดเงื่อนไขที่ไม่ได้สร้างแบบจำลองโดยแฟล็กบิลด์ในตัว ให้ใช้
      
      แฟล็กที่กำหนดโดย Starlark คุณใช้ --defineได้ด้วย แต่การรองรับจะอ่อนแอกว่า และเราไม่แนะนำให้ใช้ ดูการสนทนาเพิ่มเติมได้ที่นี่
- หลีกเลี่ยงการทำซ้ำconfig_settingคำจำกัดความที่เหมือนกันในแพ็กเกจต่างๆ แต่ให้อ้างอิงconfig_settingทั่วไปที่กำหนดไว้ในแพ็กเกจ Canonical แทน
- values- define_valuesและ- constraint_valuesสามารถใช้ร่วมกันได้ใน- config_settingเดียวกัน แต่อย่างน้อยต้องตั้งค่า 1 รายการ สำหรับ- config_settingที่กำหนด
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| constraint_values | รายการป้ายกำกับ ที่กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  constraint_valuesขั้นต่ำที่แพลตฟอร์มเป้าหมายต้องระบุ
          เพื่อให้ตรงกับconfig_settingนี้ (ระบบจะไม่พิจารณาแพลตฟอร์มการดำเนินการที่นี่) ระบบจะไม่สนใจค่าข้อจำกัดเพิ่มเติมที่แพลตฟอร์มมี ดูรายละเอียดได้ที่
          
          แอตทริบิวต์การสร้างที่กำหนดค่าได้ในกรณีที่  | 
| define_values | พจนานุกรม: สตริง -> สตริง กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  valuesแต่
          สำหรับแฟล็ก--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 บิลด์ที่ผู้ใช้กำหนดนี่เป็นแอตทริบิวต์ที่แตกต่างกันเนื่องจากมีการอ้างอิงแฟล็กที่กำหนดโดยผู้ใช้เป็นป้ายกำกับ ขณะที่ มีการอ้างอิงแฟล็กในตัวเป็นสตริงที่กำหนดเอง | 
| values | พจนานุกรม: สตริง -> สตริง กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  กฎนี้จะรับค่ากำหนดของเป้าหมายที่กำหนดค่าไว้ซึ่ง
            อ้างอิงในคำสั่ง  เพื่อความสะดวก ค่าการกำหนดค่าจะระบุเป็นแฟล็กบิลด์ (ไม่มี  หากไม่ได้ตั้งค่าสถานะอย่างชัดเจนในบรรทัดคำสั่ง ระบบจะใช้ค่าเริ่มต้นของสถานะ
             หากคีย์ปรากฏหลายครั้งในพจนานุกรม ระบบจะใช้เฉพาะอินสแตนซ์สุดท้าย
             หากคีย์อ้างอิงแฟล็กที่ตั้งค่าได้หลายครั้งในบรรทัดคำสั่ง (เช่น
              
 | 
กลุ่มไฟล์
ดูแหล่งที่มาของกฎfilegroup(name, srcs, data, compatible_with, deprecation, distribs, features, licenses, output_group, restricted_to, tags, target_compatible_with, testonly, visibility)
  ใช้ filegroup เพื่อตั้งชื่อที่สะดวกให้กับกลุ่มเป้าหมาย
  จากนั้นจะอ้างอิงจากกฎอื่นๆ ได้
  เราขอแนะนำให้ใช้ filegroup แทนการอ้างอิงไดเรกทอรีโดยตรง
  วิธีหลังไม่ถูกต้องเนื่องจากระบบบิลด์ไม่มีความรู้เกี่ยวกับไฟล์ทั้งหมดที่อยู่ใต้ไดเรกทอรีอย่างครบถ้วน จึงอาจไม่สร้างใหม่เมื่อไฟล์เหล่านี้เปลี่ยนแปลง เมื่อรวมกับ glob แล้ว filegroup จะช่วยให้มั่นใจได้ว่าระบบบิลด์จะรู้จักไฟล์ทั้งหมดอย่างชัดเจน
ตัวอย่าง
  หากต้องการสร้าง filegroup ที่ประกอบด้วยไฟล์ต้นฉบับ 2 ไฟล์ ให้ทำดังนี้
filegroup(
    name = "mygroup",
    srcs = [
        "a_file.txt",
        "some/subdirectory/another_file.txt",
    ],
)
  หรือใช้ glob เพื่อค้นหาไดเรกทอรี 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() เรียกใช้การค้นหาที่ระบุใน
    ภาษาการค้นหาของ Blaze และส่งออกผลลัพธ์
    ลงในไฟล์
  
    เพื่อให้การสร้างมีความสอดคล้องกัน ระบบจะอนุญาตให้คําค้นหาเข้าชมได้เฉพาะ
    การปิดทรานซิทีฟของเป้าหมายที่ระบุในแอตทริบิวต์ scope
    เท่านั้น คําค้นหาที่ละเมิดกฎนี้จะทํางานไม่สําเร็จในระหว่างการดําเนินการหาก
    ไม่ได้ระบุ strict หรือระบุเป็น "จริง" (หาก strict เป็น "เท็จ"
    ระบบจะข้ามเป้าหมายที่อยู่นอกขอบเขตพร้อมคําเตือน) วิธีที่ง่ายที่สุดในการป้องกันไม่ให้เกิดเหตุการณ์นี้คือการระบุป้ายกำกับเดียวกันในขอบเขตกับในนิพจน์การค้นหา
  
    ความแตกต่างเพียงอย่างเดียวระหว่างคำค้นหาที่อนุญาตที่นี่กับในบรรทัดคำสั่งคือไม่อนุญาตให้ใช้คำค้นหาที่มีข้อกำหนดเป้าหมายแบบไวลด์การ์ด (เช่น //pkg:* หรือ //pkg:all) ที่นี่
    เหตุผลมี 2 ประการ ประการแรกคือ genquery ต้อง
    ระบุขอบเขตเพื่อป้องกันไม่ให้เป้าหมายภายนอกการปิดทรานซิทีฟของ
    การค้นหามีผลต่อเอาต์พุต และประการที่สองคือไฟล์ 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 แทน
  อย่าใช้ genrule ในการเรียกใช้การทดสอบ มีการยกเว้นพิเศษสำหรับการทดสอบและผลการทดสอบ รวมถึงนโยบายการแคชและตัวแปรสภาพแวดล้อม โดยทั่วไปแล้ว การทดสอบจะต้องดำเนินการ
  หลังจากสร้างเสร็จและในสถาปัตยกรรมเป้าหมาย ในขณะที่ genrule จะดำเนินการระหว่าง
  การสร้างและในสถาปัตยกรรม exec (ทั้ง 2 อย่างอาจแตกต่างกัน) หากต้องการกฎการทดสอบ
  ทั่วไป ให้ใช้ sh_test
ข้อควรพิจารณาในการคอมไพล์แบบข้ามระบบ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการ คอมไพล์ข้ามได้ในคู่มือผู้ใช้
แม้ว่า genrules จะทำงานระหว่างการสร้าง แต่เอาต์พุตมักจะใช้หลังจากการสร้างสำหรับการติดตั้งใช้งานหรือ การทดสอบ ลองพิจารณาตัวอย่างการคอมไพล์โค้ด C สำหรับไมโครคอนโทรลเลอร์ โดยคอมไพเลอร์จะยอมรับไฟล์ต้นฉบับ C และสร้างโค้ดที่ทำงานในไมโครคอนโทรลเลอร์ แน่นอนว่าโค้ดที่สร้างขึ้น จะทำงานบน CPU ที่ใช้สร้างไม่ได้ แต่คอมไพเลอร์ C (หากคอมไพล์จากแหล่งที่มา) จะต้องทำงานได้
ระบบบิลด์ใช้การกำหนดค่า exec เพื่ออธิบายเครื่องที่บิลด์ทำงาน และการกำหนดค่าเป้าหมายเพื่ออธิบายเครื่องที่เอาต์พุตของบิลด์ ควรทำงาน โดยจะมีตัวเลือกในการกำหนดค่าแต่ละรายการ และจะแยกไฟล์ที่เกี่ยวข้อง ไว้ในไดเรกทอรีแยกต่างหากเพื่อหลีกเลี่ยงความขัดแย้ง
  สำหรับ genrules ระบบบิลด์จะตรวจสอบว่ามีการสร้างการขึ้นต่อกันอย่างเหมาะสม ดังนี้
  มีการสร้าง srcs (หากจำเป็น) สำหรับการกำหนดค่า target
  มีการสร้าง tools สำหรับการกำหนดค่า exec และถือว่าเอาต์พุต
  เป็นการกำหนดค่า target นอกจากนี้ ยังมีตัวแปร 
  "Make" ที่คำสั่ง genrule สามารถส่งไปยังเครื่องมือที่เกี่ยวข้องได้ด้วย
  เราตั้งใจที่จะไม่กำหนดแอตทริบิวต์ deps ใน genrule เนื่องจากกฎในตัวอื่นๆ ใช้ข้อมูลเมตาที่ขึ้นอยู่กับภาษาซึ่งส่งผ่านระหว่างกฎเพื่อกำหนดวิธีจัดการกฎที่ขึ้นต่อกันโดยอัตโนมัติ แต่การทำงานอัตโนมัติระดับนี้ไม่สามารถใช้กับ genrule ได้ Genrules work
  purely at the file and runfiles level.
กรณีพิเศษ
  การคอมไพล์แบบ 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)อย่างกว้างขวางสำหรับเอาต์พุต เครื่องมือ และแหล่งที่มา เนื่องจากมีการแยกไฟล์เอาต์พุตสำหรับการกำหนดค่าต่างๆ genrule จึงไม่สามารถใช้เส้นทางที่ฮาร์ดโค้ดและ/หรือเส้นทางแบบสัมบูรณ์ได้
- เขียนมาโคร 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 as- ls $(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 | รายการชื่อไฟล์ กำหนดค่าไม่ได้ ต้องระบุรายการไฟล์ที่สร้างขึ้นโดยกฎนี้ ไฟล์เอาต์พุตต้องไม่อยู่นอกขอบเขตของแพ็กเกจ ระบบจะตีความชื่อไฟล์เอาต์พุตเป็นแบบสัมพัทธ์กับแพ็กเกจ 
          หากตั้งค่าแฟล็ก  
          คำสั่ง genrule คาดว่าจะสร้างไฟล์เอาต์พุตแต่ละไฟล์ในตำแหน่งที่กำหนดไว้ล่วงหน้า
          ตำแหน่งจะพร้อมใช้งานใน  | 
| cmd | สตริง ค่าเริ่มต้นคือ  $(location)
        และการแทนที่ตัวแปร "Make"
 cmd_bash,cmd_psและcmd_batหากไม่มีตัวเลือกใดที่เกี่ยวข้อง
        หากความยาวของบรรทัดคำสั่งเกินขีดจำกัดของแพลตฟอร์ม (64K ใน Linux/macOS, 8K ใน Windows)
        genrule จะเขียนคำสั่งลงในสคริปต์และเรียกใช้สคริปต์นั้นเพื่อหลีกเลี่ยง ซึ่ง
        ใช้กับแอตทริบิวต์ cmd ทั้งหมด ( | 
| cmd_bash | สตริง ค่าเริ่มต้นคือ   แอตทริบิวต์นี้มีลำดับความสำคัญสูงกว่า  | 
| cmd_bat | สตริง ค่าเริ่มต้นคือ   แอตทริบิวต์นี้มีลำดับความสำคัญสูงกว่า  
 | 
| cmd_ps | สตริง ค่าเริ่มต้นคือ   แอตทริบิวต์นี้มีลำดับความสำคัญสูงกว่า  
 เพื่อให้ใช้ Powershell ได้ง่ายขึ้นและมีข้อผิดพลาดน้อยลง เราจึงเรียกใช้คำสั่งต่อไปนี้ เพื่อตั้งค่าสภาพแวดล้อมก่อนที่จะเรียกใช้คำสั่ง Powershell ใน genrule 
 | 
| executable | บูลีน กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  
          การตั้งค่าสถานะนี้เป็น "จริง" หมายความว่าเอาต์พุตเป็นไฟล์ที่สั่งการได้และเรียกใช้ได้โดยใช้คำสั่ง
           ระบบไม่รองรับการประกาศการขึ้นต่อกันของข้อมูลสำหรับไฟล์ที่เรียกใช้งานที่สร้างขึ้น | 
| 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(เอาต์พุตเริ่มต้น): A- ModuleInfoไบนารีโปรโต
- name.textproto(สร้างขึ้นเฉพาะในกรณีที่มีการขออย่างชัดเจน): ข้อความ โปรโตเวอร์ชันของ- name.binaryproto
คำเตือน: เราไม่รับประกันว่ารูปแบบเอาต์พุตของกฎนี้จะเสถียร โดยมีไว้สำหรับการใช้งานภายในของ Stardoc เป็นหลัก
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  load()-ed โดย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กำหนดชุดการทดสอบที่ถือว่า "มีประโยชน์" ต่อมนุษย์ ซึ่งจะช่วยให้โปรเจ็กต์กำหนดชุดการทดสอบได้ เช่น "การทดสอบที่คุณต้องเรียกใช้ก่อนเช็คอิน" "การทดสอบความเครียดของโปรเจ็กต์" หรือ "การทดสอบขนาดเล็กทั้งหมด" คำสั่ง blaze test จะพิจารณาการจัดระเบียบประเภทนี้
สำหรับการเรียกใช้ เช่น blaze test //some/test:suite, Blaze จะ
แจงเป้าหมายการทดสอบทั้งหมดที่รวมอยู่โดยอ้อมในเป้าหมาย //some/test:suite ก่อน (เราเรียกขั้นตอนนี้ว่า "การขยายชุดทดสอบ") จากนั้น Blaze จะสร้างและทดสอบเป้าหมายเหล่านั้น
ตัวอย่าง
ชุดทดสอบเพื่อเรียกใช้การทดสอบขนาดเล็กทั้งหมดในแพ็กเกจปัจจุบัน
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 | รายการป้ายกำกับ ที่กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  
          เรายอมรับ 
          หากไม่ได้ระบุหรือปล่อยให้แอตทริบิวต์  |