ตอนที่ 15: โดย Joe Mason ในมอนทรีออล PQ (พฤศจิกายน 2020)
ตอนก่อนหน้า
Chrome เป็นโครงการใหญ่ที่มีระบบย่อยจำนวนมาก ปกติแล้วหาโค้ดที่เขียนไว้ สำหรับคอมโพเนนต์หนึ่งซึ่งจะเป็นประโยชน์ในที่อื่นๆ แต่อาจมี ข้อจำกัดซ่อนอยู่ โปรดจำกัดการเข้าถึงฟังก์ชันการทำงานที่เป็นอันตรายจากภายนอกเพื่อความปลอดภัย ตัวอย่างเช่น ฟังก์ชันที่กำหนดเองที่ปรับแต่งตามความต้องการด้านประสิทธิภาพที่เฉพาะเจาะจง:
// Blazing fast for 2-char strings, O(n^3) otherwise.
std::string ConcatShortStringsFast(const std::string& a, const std::string& b);
การจำกัดการเข้าถึงทำได้หลายวิธี กฎการเปิดเผย GN จะหยุดโค้ดภายนอกคอมโพเนนต์โดยขึ้นอยู่กับเป้าหมาย ทุกคนจะเห็นเป้าหมายเริ่มต้นโดยค่าเริ่มต้น แต่คุณสามารถแก้ไขได้ดังนี้
# In components/restricted_component/BUILD.gn
visibility = [
# Applies to all targets in this file.
# Only the given targets can depend on them.
"//components/restricted_component:*",
"//components/authorized_other_component:a_single_target",
]
source_set("internal") {
# This dangerous target should be locked down even more.
visibility = [ "//components/restricted_component:privileged_target" ]
}
การประกาศระดับการเข้าถึงได้รับการตรวจสอบกับ gn check
ซึ่งทำงานเป็นส่วนหนึ่งของบิลด์ GN ทุกบิลด์
กลไกอีกอย่างคือ DEPS include_rules
ซึ่งจำกัดการเข้าถึงไฟล์ส่วนหัว
ทุกไดเรกทอรีรับค่า include_rules
มาจากระดับบนสุด และแก้ไขกฎเหล่านั้นในไฟล์ DEPS
ของตัวเองได้ ไฟล์ส่วนหัวทั้งหมดที่มาจากไดเรกทอรีภายนอกต้องได้รับอนุญาตจาก include_rules
# In //components/authorized_other_component/DEPS
include_rules = [
# Common directories like //base are inherited from
# //components/DEPS or //DEPS. Also allow includes from
# restricted_component, but not restricted_component/internal.
"+components/restricted_component",
"-components/restricted_component/internal",
# But do allow a single header from internal, for testing.
"+components/restricted_component/internal/test_support.h",
]
เพื่อให้ทรัพยากร Dependency เหล่านี้มีความเหมาะสม การเปลี่ยนแปลงที่เพิ่มไดเรกทอรีไปยัง include_rules
จะต้องได้รับการอนุมัติจาก OWNERS
ของไดเรกทอรีดังกล่าว ไม่จำเป็นต้องมีการอนุมัติเพื่อจำกัดไดเรกทอรีโดยใช้ include_rules
! คุณมั่นใจได้ว่าทุกคนที่เปลี่ยนคอมโพเนนต์จำได้ว่าจะไม่ใช้ส่วนหัวบางรายการโดยเพิ่ม include_rule
สำหรับการเสนอราคาส่วนหัวดังกล่าว
include_rules
จะได้รับการตรวจสอบโดยการส่งล่วงหน้า คุณจึงจะไม่เห็นข้อผิดพลาดจนกว่าจะอัปโหลดการเปลี่ยนแปลง หากต้องการทดสอบ include_rules
โดยไม่ต้องอัปโหลด ให้เรียกใช้ buildtools/checkdeps/checkdeps.py <directory>