Bölüm 15: - Montreal'den Joe Mason, PQ (Kasım 2020)
Önceki bölümler
Chrome, birçok alt sistemi olan büyük bir projedir. Başka bir yerde işe yarayabilecek, ancak gizli kısıtlamaları olan bir bileşen için yazılmış kod bulmak yaygın bir durumdur. Güvenlik için tehlikeli işlevlere dışarıdan erişimi sınırlandırın. Örneğin, belirli performans ihtiyaçları için ayarlanmış özel bir işlev:
// Blazing fast for 2-char strings, O(n^3) otherwise.
std::string ConcatShortStringsFast(const std::string& a, const std::string& b);
Erişimi kısıtlamanın birkaç yolu vardır. GN görünürlük kuralları, bir hedefe bağlı olarak bileşeninizin dışındaki kodun durmasını sağlar. Varsayılan olarak hedefler herkes tarafından görülebilir, ancak bunları değiştirebilirsiniz:
# 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" ]
}
Görünürlük beyanları, her GN derlemesinin bir parçası olarak çalışan gn check
ile doğrulanır.
Bir başka mekanizma da üstbilgi dosyalarına erişimi sınırlayan DEPS include_rules
'dir.
Her dizin include_rules
öğesini üst öğesinden devralır ve bu kuralları kendi DEPS
dosyasında değiştirebilir. Dış dizinlerden dahil edilen tüm üstbilgi dosyalarına include_rules
tarafından izin verilmelidir.
# 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",
]
Bu bağımlılıkların uygun olduğundan emin olmak için include_rules
öğesine bir dizin ekleyen değişiklikler ilgili dizinin OWNERS
tarafından onaylanmalıdır. include_rules
kullanılarak bir dizini kısıtlamak için onay gerekmez. Belirli başlıklara teklif vermek için include_rule
ekleyerek bileşeninizi değiştiren herkesin belirli başlıkları kullanmamalarını hatırlamasını sağlayabilirsiniz.
include_rules
, ön gönderme tarafından kontrol edilir. Dolayısıyla, bir değişiklik yüklemeyi deneyene kadar herhangi bir hata görmezsiniz. include_rules
uygulamasını yüklemeden test etmek için buildtools/checkdeps/checkdeps.py <directory>
komutunu çalıştırın.