Episode 15: oleh Joe Mason di Montreal, PQ (November, 2020)
Episode sebelumnya
Chrome adalah proyek besar dengan banyak sub-sistem. Sangat umum untuk menemukan kode yang ditulis untuk satu komponen yang akan berguna di tempat lain, tetapi mungkin memiliki batasan tersembunyi. Demi keamanan, batasi akses eksternal ke fungsi berbahaya. Misalnya, fungsi kustom yang disesuaikan untuk kebutuhan performa tertentu:
// Blazing fast for 2-char strings, O(n^3) otherwise.
std::string ConcatShortStringsFast(const std::string& a, const std::string& b);
Ada beberapa cara untuk membatasi akses. Aturan visibilitas GN menghentikan kode di luar komponen Anda agar tidak bergantung pada target. Secara default, target terlihat oleh semua orang, tetapi Anda dapat mengubahnya:
# 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" ]
}
Deklarasi visibilitas divalidasi dengan gn check
, yang berjalan sebagai bagian
dari setiap build GN.
Mekanisme lainnya adalah DEPS include_rules
, yang membatasi akses ke file header.
Setiap direktori mewarisi include_rules
dari induknya, dan dapat mengubah aturan tersebut dalam file DEPS
-nya sendiri. Semua file header yang disertakan dari luar
direktori harus diizinkan oleh 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",
]
Untuk memastikan dependensi ini sesuai, perubahan yang menambahkan direktori
ke include_rules
harus disetujui oleh OWNERS
direktori tersebut. Tidak diperlukan
persetujuan untuk membatasi direktori menggunakan include_rules
. Anda dapat memastikan bahwa semua orang yang mengubah komponen Anda ingat untuk tidak menggunakan header tertentu dengan menambahkan include_rule
yang melarang mereka.
include_rules
diperiksa oleh pra-pengiriman, sehingga Anda tidak akan melihat error apa pun sampai Anda mencoba mengupload perubahan. Untuk menguji include_rules
tanpa mengupload, jalankan buildtools/checkdeps/checkdeps.py <directory>
.