กฎที่เก็บ

รายงานปัญหา ดูซอร์สโค้ด รุ่น Nightly · 8.0 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

ที่เก็บข้อมูลภายนอกคือกฎที่ใช้ได้เฉพาะในไฟล์ WORKSPACE และเปิดใช้การดำเนินการแบบไม่ปิดผนึกในระยะการโหลดของ Bazel กฎที่เก็บข้อมูลภายนอกแต่ละรายการจะสร้างพื้นที่ทํางานของตัวเอง โดยมีBUILDไฟล์และอาร์ติแฟกต์ของตัวเอง สามารถใช้เพื่อใช้ไลบรารีของบุคคลที่สาม (เช่น ไลบรารีที่แพ็กเกจ Maven) และสร้างไฟล์ BUILD สำหรับโฮสต์ที่ Bazel ทำงานอยู่โดยเฉพาะ

การสร้างกฎของที่เก็บ

ในไฟล์ .bzl ให้ใช้ฟังก์ชัน repository_rule เพื่อสร้างกฎใหม่ของที่เก็บข้อมูลและจัดเก็บไว้ในตัวแปรส่วนกลาง

คุณใช้กฎที่เก็บข้อมูลที่กำหนดเองได้เช่นเดียวกับกฎที่เก็บข้อมูลแบบเนทีฟ ไฟล์ดังกล่าวมีแอตทริบิวต์ name ที่ต้องระบุ และเป้าหมายทั้งหมดที่อยู่ในไฟล์บิลด์จะอ้างอิงเป็น @<name>//package:target โดยที่ <name> คือค่าของแอตทริบิวต์ name

ระบบจะโหลดกฎเมื่อคุณสร้างกฎอย่างชัดเจน หรือหากกฎเป็นข้อกำหนดของบิลด์ ในกรณีนี้ Bazel จะเรียกใช้ฟังก์ชัน implementation ฟังก์ชันนี้จะอธิบายวิธีสร้างที่เก็บข้อมูล เนื้อหา และไฟล์ BUILD

Attributes

แอตทริบิวต์คืออาร์กิวเมนต์ของกฎ เช่น url หรือ sha256 คุณต้องระบุแอตทริบิวต์และประเภทของแอตทริบิวต์เมื่อกำหนดกฎของที่เก็บ

local_repository = repository_rule(
    implementation=_impl,
    local=True,
    attrs={"path": attr.string(mandatory=True)})

หากต้องการเข้าถึงแอตทริบิวต์ ให้ใช้ repository_ctx.attr.<attribute_name>

repository_rule ทั้งหมดมีแอตทริบิวต์ที่กําหนดโดยนัย (เช่นเดียวกับกฎการสร้าง) แอตทริบิวต์ที่นัย 2 รายการ ได้แก่ name (เช่นเดียวกับกฎการสร้าง) และ repo_mapping คุณเข้าถึงชื่อกฎของที่เก็บได้โดยใช้ repository_ctx.name ความหมายของ repo_mapping เหมือนกับความหมายของ กฎที่เก็บข้อมูลเดิม local_repository และ new_local_repository

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

ฟังก์ชันการใช้งาน

กฎของที่เก็บข้อมูลแต่ละข้อต้องมีฟังก์ชัน implementation ซึ่งมีตรรกะจริงของกฎและจะทำงานในขั้นตอนการโหลดอย่างเคร่งครัด

ฟังก์ชันมีพารามิเตอร์อินพุต repository_ctx เพียง 1 รายการ ฟังก์ชันจะแสดงผล None เพื่อระบุว่าสร้างกฎซ้ำได้โดยใช้พารามิเตอร์ที่ระบุ หรือจะแสดงผลเป็น Dict ที่มีชุดพารามิเตอร์สําหรับกฎนั้น ซึ่งจะเปลี่ยนกฎนั้นให้สร้างซ้ำได้และสร้างที่เก็บเดียวกัน เช่น สําหรับกฎที่ติดตามที่เก็บ Git ผลลัพธ์ที่ได้คือตัวระบุการคอมมิตที่เฉพาะเจาะจงแทนสาขาลอยที่ระบุไว้ตั้งแต่แรก

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

def _impl(repository_ctx):
  repository_ctx.symlink(repository_ctx.attr.path, "")

local_repository = repository_rule(
    implementation=_impl,
    ...)

ฟังก์ชันการติดตั้งใช้งานจะทํางานเมื่อใด

หากประกาศที่เก็บเป็น local การเปลี่ยนแปลงทรัพยากร Dependency ในกราฟทรัพยากร Dependency (รวมถึงไฟล์ WORKSPACE เอง) จะทําให้ฟังก์ชันการติดตั้งใช้งานทํางาน

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

สุดท้าย สำหรับที่เก็บข้อมูลที่ไม่ใช่local เฉพาะการเปลี่ยนแปลงในข้อกำหนดต่อไปนี้เท่านั้นที่อาจทําให้ระบบรีสตาร์ท

  • ไฟล์ .bzl ที่จําเป็นในการกําหนดกฎของที่เก็บ
  • การประกาศกฎของที่เก็บในไฟล์ WORKSPACE
  • ค่าของตัวแปรสภาพแวดล้อมที่ประกาศด้วยแอตทริบิวต์ environ ของฟังก์ชัน repository_rule คุณบังคับใช้ค่าของตัวแปรสภาพแวดล้อมเหล่านั้นได้จากบรรทัดคำสั่งโดยใช้แฟล็ก --action_env (แต่แฟล็กนี้จะทําให้การดำเนินการทั้งหมดของบิลด์เป็นโมฆะ)
  • เนื้อหาของไฟล์ที่ใช้และอ้างอิงโดยป้ายกำกับ (เช่น //mypkg:label.txt ไม่ใช่ mypkg/label.txt)

การบังคับให้ดึงข้อมูลที่เก็บข้อมูลภายนอกอีกครั้ง

บางครั้งที่เก็บข้อมูลภายนอกอาจล้าสมัยโดยที่ไม่มีการแก้ไขคำจำกัดความหรือข้อกำหนดที่เกี่ยวข้อง ตัวอย่างเช่น ที่เก็บข้อมูลที่ดึงข้อมูลแหล่งที่มาอาจติดตามสาขาที่เฉพาะเจาะจงของที่เก็บข้อมูลของบุคคลที่สาม และคอมมิตใหม่จะพร้อมใช้งานในสาขานั้น ในกรณีนี้ คุณสามารถขอให้ Bazel ดึงข้อมูลรีโพซิทอรีภายนอกทั้งหมดอีกครั้งโดยไม่มีเงื่อนไขได้โดยเรียกใช้ bazel sync

นอกจากนี้ กฎบางข้อจะตรวจสอบเครื่องในเครื่องและอาจล้าสมัยหากมีการอัปเกรดเครื่องในเครื่อง ในส่วนนี้ คุณสามารถขอให้ Bazel ดึงข้อมูลรีโพซิทอรี่ภายนอกเหล่านั้นอีกครั้งเฉพาะในกรณีที่คำจำกัดความ repository_rule มีการตั้งค่าแอตทริบิวต์ configure ให้ใช้ bazel sync --configure

ตัวอย่าง

  • เครื่องมือทางเทคนิคที่กําหนดค่า C++ โดยอัตโนมัติ: ใช้กฎที่เก็บเพื่อสร้างไฟล์การกําหนดค่า C++ สําหรับ Bazel โดยอัตโนมัติโดยมองหาคอมไพเลอร์ C++ ในพื้นที่ สภาพแวดล้อม และ Flag ที่คอมไพเลอร์ C++ รองรับ

  • ที่เก็บ Go ใช้ repository_rule หลายรายการเพื่อกำหนดรายการของ Dependency ที่จําเป็นต่อการใช้กฎ Go

  • rules_jvm_external จะสร้างที่เก็บข้อมูลภายนอกชื่อ @maven โดยค่าเริ่มต้น ซึ่งจะสร้างเป้าหมายการสร้างสำหรับอาร์ติแฟกต์ Maven ทั้งหมดในต้นไม้การพึ่งพาแบบทรานซิทีฟ