ตอนที่ 15: โดย Joe Mason in Montreal, 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",
]
เพื่อให้มั่นใจว่าการอ้างอิงเหล่านี้มีความเหมาะสม การเปลี่ยนแปลงที่เพิ่มไดเรกทอรี
ไปยัง include_rules
ต้องได้รับการอนุมัติจาก OWNERS
ของไดเรกทอรีนั้น ยังไม่ได้ติดต่อ
ต้องได้รับการอนุมัติเพื่อจำกัดไดเรกทอรีโดยใช้ include_rules
คุณสามารถ
ตรวจสอบให้แน่ใจว่าทุกคนที่เปลี่ยนคอมโพเนนต์ของคุณต้องไม่ใช้
ด้วยการเพิ่ม include_rule
เพื่อเสนอราคา
include_rules
ได้รับการตรวจสอบจากการส่งล่วงหน้าแล้ว ดังนั้นคุณจะไม่เห็น
จนกว่าคุณจะพยายามอัปโหลดการเปลี่ยนแปลง เพื่อทดสอบ include_rules
โดยไม่มี
กำลังอัปโหลด ให้เรียกใช้ buildtools/checkdeps/checkdeps.py <directory>