פרק 15: מאת ג'ו מייסון במונטריאול, 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
, שפועל כחלק מכל build של 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>
.