Cas9 的 domain 架構Domain architecture
把 1368 個殘基拆成幾塊會各自移動的積木。
01一句話只有一句
SpCas9 是兩瓣七塊、靠兩條短 linker 當鉸鏈的分子鉗。
02Why should I care?我為什麼要讀這頁
因為 domain 邊界不是背景知識,它是你每一行 selection string 的內容。
你在 RMSF 頁上看到的「apo 蛋白裡 HNH 的 RMSF 是 1.86 Å,全域最高」,那個 1.86 不是一個殘基的數字,是對某一組殘基編號取平均得到的。編號取法一改,數字就改。同理,起始結構那頁的「逐殘基 top-8 接觸殘基」是哪八個、算不算共享,全部建立在你怎麼把 1368 個殘基分組上。domain 定義是分母,不是註腳。
用你熟的語言講:這就像在 slab 計算裡決定哪幾層固定、哪幾層放鬆。那不是後處理的細節,那是把物理問題寫成數字的那一步。你不會在方法段寫「我大概固定了幾層」,那你也不該寫「我大概取了 HNH」。差別只在於,slab 選錯層數 VASP 至少會給你一個明顯不對的表面能;domain 選錯範圍,MDAnalysis 不會報錯,它會安靜地回你一個看起來很合理的數字。
這一頁要你花二十分鐘記住的,只有兩件事:哪些殘基屬於哪一塊,以及哪一塊會相對哪一塊移動。
03What這是什麼
SpCas9 全長 1368 個殘基,分成兩瓣(lobe),中間夾著 sgRNA 與 DNA 形成的核酸通道。
| 瓣 | Domain | 殘基編號 | 一句話 |
|---|---|---|---|
| — | bridge helix | 60–93 | 富含精胺酸的長螺旋,橫跨兩瓣,抓住 sgRNA 骨架 |
| REC | REC1 | 94–179、308–496 | 認 repeat:anti-repeat duplex;序列上被 REC2 切成兩段,空間上是一塊 |
| REC | REC2 | 180–307 | 平常擋在 HNH 的必經路徑上,活化時要讓開 |
| REC | REC3 | 497–713 | 感測 PAM 遠端的 RNA:DNA 配對品質,是專一性的感應器 |
| NUC | RuvC-I | 1–59 | 序列最前端就是核酸酶的一部分;催化的 Asp10 在這裡 |
| NUC | RuvC-II | 718–769 | 含 Glu762;尾端 765–769 已經被算進 L1 鉸鏈(見下方警示) |
| NUC | RuvC-III | 909–1098 | 含 His983 與 Asp986;三段合起來才組成一個 RNase H 摺疊的核酸酶,切 non-target 股 |
| NUC | HNH | 775–908 | 切 target 股;整塊插在 RuvC-II 與 RuvC-III 中間 |
| NUC | PI | 1099–1368 | PAM-interacting,內含 topoisomerase-homology 與 C-terminal 兩個 subdomain |
兩條鉸鏈才是重點:
- L1 linker,765 到 780(Palermo 2017 的定義):把 RuvC-II 的尾巴接到 HNH 的頭。
- L2 linker,906 到 918(同一篇):把 HNH 的尾巴接回 RuvC-III 的頭。
拿 Nishimasu 的 domain 邊界去對 Palermo 的鉸鏈邊界,你會發現它們互相咬進去:L1 的 765 到 769 落在 RuvC-II 裡、775 到 780 落在 HNH 裡;L2 的 906 到 908 落在 HNH 裡、909 到 918 落在 RuvC-III 裡。這不是誰寫錯,是兩篇論文為了回答不同問題各自畫的線。實務後果只有一個:同一個分析裡不能同時用兩套定義,否則有些殘基會被算兩次、有些會被漏掉,而程式不會抱怨。決定一套、寫進設定檔、在方法段講明白。
把這幾個數字擺在一起,架構就一目了然了:HNH 是一塊被插進 RuvC 序列中間的獨立摺疊,兩端只靠兩條十幾個殘基的短繩繫著。 它不是黏在 RuvC 上的一個突起,它是一顆掛在兩條繩子上的鎚頭。這句話就是整台機器的力學核心。
催化位點(記住這幾個號碼,之後檢查編號有沒有錯位時要用):
- RuvC 活性中心:Asp10、Glu762、His983、Asp986,two-metal 機制。
- HNH 活性中心:Asp839、His840、Asn863,一般認為是 one-metal 機制。
- 所以 dCas9 = D10A(廢掉 RuvC)+ H840A(廢掉 HNH),兩個突變分別落在兩瓣的不同 domain 上。
- bridge helix 上的保守精胺酸:Arg63、Arg66、Arg70、Arg71、Arg74、Arg78。
Nishimasu 2014 原始論文把 REC lobe 只切成兩塊:REC1 = 94–179 加 308–713,REC2 = 180–307。後來研究專一性的文獻(Jiang 2016、Chen 2017 那一系)把 497–713 這段獨立出來叫 REC3,因為它才是感測 heteroduplex 的那一塊。兩種切法都在用,引用時要說清楚你用的是哪一種,否則你的「REC1 平均 RMSF」跟別人的不是同一個東西(兩者差的正好是 497 到 713 那 217 個殘基)。
同樣地,Nishimasu 2014 只給出 RuvC 是 1–59、718–769、909–1098 三段,並沒有逐段標上 I/II/III;上表的 RuvC-I/II/III 是按序列順序對應這三段的通行讀法。
第三個坑在 HNH 與 RuvC-III 的接縫上,而且它會直接影響你怎麼讀變體:SpCas9-HF1 的 Q926A,用 Nishimasu 的邊界落在 RuvC-III(909 起算),Chen 2017 卻把它歸給 HNH 與 RuvC-III 之間的 L2 linker。要說一個突變「在哪個 domain」,先說你用誰的邊界。
04Why為什麼重要
因為 Cas9 的專一性是一連串構形檢查點,而檢查點的每一步都對應到某一塊相對另一塊的移動。
目前領域內的共識大致是這樣一條鏈:sgRNA 一綁上來,REC lobe 相對 apo 態發生大規模重排;DNA 進來、R-loop 從 PAM 端往遠端延伸;REC3 感測遠端的配對品質;配得夠好,REC2 才向外轉開讓出通道;HNH 這才能繞著 L1 與 L2 兩條鉸鏈大幅轉動(Palermo 等人的增強取樣估計接近 180 度),把 Asp839/His840/Asn863 送到 target 股的切位旁;HNH 到位之後,才透過 allostery 放行 RuvC 去切 non-target 股。兩刀是協同的,不是各切各的。
Palermo 等人的 GaMD 把催化殘基 His840 到 target 股切位磷酸的距離量成一條階梯:未活化態約 30 Å、中間態約 15 Å、催化態才 4 到 6 Å,而 HNH 本身在這個過程中繞著自己轉了約 180 度。這組數字的用處很實際 —— 你在設計 HNH 距離 那類 collective variable 時,它給了你一個別人已經報過的量級可以對照:你自己軌跡裡的值落在 30 Å 附近,代表你在檢查點上游;落在個位數,代表你已經在下游了。注意這是模擬給的數字,不是實驗量測。
這條鏈解釋了一件否則會很莫名其妙的事:為什麼工程出來的高保真變體,突變位置全部擠在特定幾塊上。
| 變體 | 突變 | 落在哪個 domain(按上表編號) |
|---|---|---|
| SpCas9-HF1 | N497A、R661A、Q695A、Q926A | 前三個在 REC3(497–713);Q926 落在 HNH/RuvC-III 的接縫,用 Nishimasu 邊界屬 RuvC-III,Chen 2017 歸給 L2 |
| HypaCas9 | N692A、M694A、Q695A、H698A | 四個全在 REC3,而且擠在 692–698 這七個殘基裡 |
| eSpCas9(1.1) | K848A、K1003A、R1060A | K848 在 HNH(775–908),K1003 與 R1060 在 RuvC-III |
| dCas9 | D10A、H840A | 兩個活性中心各廢一個 |
讀法是這樣的:HF1 與 HypaCas9 動的是「感應器」,把 REC3 對 heteroduplex 的抓握削弱,等於把構形活化的門檻調高,配得不夠好就不放行。eSpCas9(1.1) 動的是「握把」,削弱蛋白對位移的 non-target 股的靜電抓握,讓錯配的 R-loop 撐不住。兩條路線的淨效果都不是改變結合親和力,而是改變構形轉換的難易。這件事最乾淨的證據來自 Chen 2017 的對照實驗:把整個 REC3 刪掉(ΔREC3)會讓切割速率掉大約一千倍,但它對 on-target 的結合親和力仍然接近 WT。速率掉三個數量級、結合幾乎不動 —— 這就是 Off-target 與專一性 那頁結論的結構學根源,也是為什麼高保真變體(HF1/eSpCas9(1.1)/HypaCas9)對 on/off-target 的結合親和力與 WT 差不多。你如果只有一個平衡 ΔG 的打分軸,這張表上所有的東西你都看不見。
HypaCas9 的四個突變全在 REC3,SpCas9-HF1 有三個在 REC3,兩者的專一性行為卻不一樣。「這個突變落在 REC3」不能拿來排序變體。 如果你的打分函數只吃 domain 歸屬,那把兩個同 domain 的變體對調,分數不會變 —— 這代表那個分數沒有解析度。
05How怎麼做
第一件事:確認你手上的檔案編號跟文獻對得起來。
PDB 檔裡的殘基編號不保證等於 UniProt 編號。加了 His-tag、用了不同的表達構築、或用了預測結構,都可能整體位移。免費的檢查法是查地標殘基的身分:
import MDAnalysis as mda
u = mda.Universe("5f9r.pdb")
for r, expect in [(10,"ASP"), (840,"HIS"), (863,"ASN"), (983,"HIS"), (1335,"ARG")]:
got = u.select_atoms(f"protein and resid {r}").residues.resnames
print(r, got, "OK" if expect in got else "MISMATCH")
五個都對,你的編號沒有位移。有一個不對,先別跑任何分析。這一步花你三十秒,能省掉整批要重跑的軌跡。
第二件事:把 domain 定義寫成一份設定檔,全專案共用。
DOMAINS = {
"bridge_helix": "resid 60:93",
"REC1": "resid 94:179 308:496",
"REC2": "resid 180:307",
"REC3": "resid 497:713",
"RuvC_I": "resid 1:59",
"RuvC_II": "resid 718:769",
"RuvC_III": "resid 909:1098",
"HNH": "resid 775:908",
"PI": "resid 1099:1368",
# 鉸鏈(Palermo 2017)—— 注意它們跟上面的 domain 邊界「重疊」,
# 不是互斥分割。把 domain 與鉸鏈相加不會等於 1368,
# 也不能在同一張圖裡當成不重複的分區來用。
"L1": "resid 765:780", # 765–769 也在 RuvC_II,775–780 也在 HNH
"L2": "resid 906:918", # 906–908 也在 HNH,909–918 也在 RuvC_III
}
GROMACS 那邊對應的是 gmx make_ndx 裡的 ri 775-908,存成 index group 之後所有分析共用同一個 .ndx。重點不是用哪個工具,是同一個定義只能有一份,而且要進版本控制。變體之間、replica 之間、WT 與突變之間如果用了不同的定義,你比的就不是同一個東西了。
第三件事:每次算 domain 級的量,順手印出實際選到幾個殘基。
print(len(u.select_atoms(DOMAINS["HNH"] + " and name CA").residues)) # 期望 134
HNH 是 775 到 908,共 134 個殘基。印出來不是 134,代表這個結構有缺失殘基。這個數字要寫進補充材料,因為它決定了你的 domain 平均是在哪一組殘基上算的。
成本: 零。這整頁的東西不需要任何 GPU 時數,卻決定了 87 ns × 4 replica 的 H100 時數產出的數字有沒有意義。
06When什麼時候用
- 每次要報 domain 級的聚合量時。 RMSF、接觸數、SASA、鹽橋計數,只要是「某個 domain 的平均」,就得先有一份說得出處的 domain 定義。
- 選 fit selection 的時候。 用整個蛋白疊合、用 NUC lobe 疊合、用 RuvC 疊合,HNH 的 RMSF 會給你三個不同的故事。要講哪一個,先決定用哪一個疊合。
- 設計 collective variable 的時候。 HNH 距離 這類 CV 的定義從哪些殘基算質心,直接由這頁決定。
- 解讀變體的時候。 拿到一個突變位置,第一件事是查它落在哪一塊、那一塊在活化鏈條的哪一環。這是把「一串胺基酸代號」變成「一個機制假說」的最短路徑。
- 讀 paper 的時候。 別人說「REC3 的動態改變了」,你要能立刻知道那是 497 到 713、是感應器、是 HF1 與 HypaCas9 動手的地方。
07When NOT什麼時候別用
-
不要把「domain」當成剛體來解釋所有運動。 REC1 在序列上是 94–179 加 308–496 兩段不連續的區間。如果你只拿其中一段當「REC1」做疊合,你疊的是半塊 domain,另外半塊的運動會整包被算進殘差。為什麼會壞: 疊合定義了參考座標系,用半塊當座標系,剩下那半塊的剛體運動會偽裝成內部柔軟度。怎麼看出它壞了: 換另一半當 fit selection 重算一次,如果 RMSD 曲線的形狀變了(不只是平移),你原本那條就是座標系的產物。
-
不要在 domain 邊界上定義 collective variable。 L1 是 765 到 780、L2 是 906 到 918,它們正好咬在 RuvC-II/HNH 與 HNH/RuvC-III 的接縫上,而且是整個結構預測信心最低的區域(Chai-1 給 765 到 809 這一段的 pLDDT 只有 46,全域最低)。注意這句話說的是「模型不確定座標」,不是「量到很軟」,兩者不能互換(見結構預測能不能用)—— 但對 CV 設計來說結論一樣糟:座標不確定的地方,用它算出來的質心也不確定。為什麼會壞: 你的 CV 若以「HNH 質心」為基礎,從 775 起算還是從 765 起算,差的那十個殘基全是鉸鏈區、也正是預測信心最低的那一段,質心軌跡會完全不同。怎麼看出它壞了: 把邊界前後各移五個殘基,重算同一條軌跡的 CV。曲線只是平移沒關係;形狀變了,代表你的結論是邊界取法的函數,不是分子的性質。這不是假想的風險:逐位點距離的跨 replica CV 落在 38% 到 46%,屬於明確的 noise tier。
-
不要用 domain 平均值去比較不同來源的結構。 不同 PDB 的缺失殘基不一樣,auth numbering 與 label numbering 也可能不同。為什麼會壞: 同一句「HNH 的平均 RMSF」,在兩個系統裡其實是在兩組不同的殘基集合上取平均,差異可能全部來自集合差異。怎麼看出它壞了: 印出每個 domain 實際選到的殘基數(HNH 應該是 134)。兩個系統對不上,就先把交集取出來再比。
-
不要把 domain 邊界當成物理實在。 這些數字是從一張晶體結構的二級結構走向切出來的人為刻度,而且不同論文切法不同(REC1 到底含不含 497 到 713 就是活生生的例子)。為什麼會壞: 你可能在報告一個「REC1 變柔軟了」的結論,而別人用另一套定義重算會得到相反的敘述。怎麼看出它壞了: 拿另一篇 paper 的定義重算一次,看結論會不會翻。會翻,就代表這個結論的資訊量小於你以為的。
-
不要把「突變落在哪個 domain」當成機制解釋或打分依據。 為什麼會壞: HypaCas9 四個突變全在 REC3、SpCas9-HF1 三個在 REC3,行為卻不同;domain 歸屬的解析度是「幾百個殘基」,你要排序的差異是「一個殘基」。怎麼看出它壞了: 把兩個同 domain 的變體在你的打分函數裡對調,分數不變 —— 那個分數對你要回答的問題是盲的。
-
不要在報 HNH 的量時偷偷把 L1 與 L2 一起算進去。 為什麼會壞: 那兩段是鉸鏈、又是全結構預測信心最低的區域,把它們併進 HNH 很可能系統性地把 HNH 的柔軟度往上拉,而且拉多少取決於你併了幾個殘基。怎麼看出它壞了: 分別算 775–908 與 765–918 兩個版本,把兩個數字都寫進補充材料。L1/L2 的 RMSF 很少被單獨報過,所以差多少必須自己量,不要引用別人的數字。
08Project Lens跟我的 project 多相關
為什麼是五星: 因為它是專案裡每一個數字的分母,而且它的錯誤是靜默的。
Metric 可靠性 那頁的可靠性表整張都建立在「聚合尺度」上:BSA 的跨 replica CV 是 2.1%、總 protein–DNA 接觸 4.1%、target-DNA 接觸 9.4%、鹽橋 9.5%,這些是綠燈;而逐位點距離 38% 到 46%、groove 接觸計數 145.5%,這些是紅燈。整個結論是**「打分要用聚合量,不要用逐殘基/逐位點」** —— 但「聚合」總得有一個聚合單位,那個單位就是 domain。你要選對聚合尺度,前提是你知道有哪些尺度可選、每一個尺度包含哪些殘基。這一頁就是那份清單。
為什麼不是更低: 三個理由。
- 成本是零,一次投資終身受用。 在「便宜」是硬約束、可同時執行的 job 數與磁碟配額都有硬性上限的現實下,一個不吃 GPU 時數卻決定所有 GPU 產出意義的東西,優先序不可能低。
- 錯了不會報錯。 selection string 寫錯範圍,MDAnalysis 照樣回你一個浮點數。這種靜默失效比會 crash 的錯誤危險得多,只能靠事前把定義釘死來防。
- 它是變體篩選的語言。 funnel 要處理的是一串串突變代號。沒有 domain 地圖,K848A 跟 K1003A 對你就只是兩個字串;有了地圖,你才看得出前者在 HNH、後者在 RuvC-III,而這兩塊在活化鏈條上的角色完全不同。
具體怎麼用: 把上面那份 DOMAINS 字典放進 repo 根目錄,所有分析腳本一律 import 它,禁止在腳本裡手寫 resid。方法段直接引 Nishimasu 2014 的邊界並註明 REC3 用的是 497–713 的切法。每一張 domain 級的圖,圖說都要寫出該 domain 實際納入的殘基數。
09Reviewer Thinkingreviewer 會問什麼
你的 domain 定義出自哪一篇?REC1 含不含 497 到 713?點開看參考答案
必須答得出來,而且要答得具體。標準答案是引 Nishimasu 2014(bridge helix 60–93、REC1 94–179 與 308–713、REC2 180–307、RuvC 1–59 與 718–769 與 909–1098、HNH 775–908、PI 1099–1368),然後說明你另外把 497–713 獨立成 REC3,理由是專一性文獻普遍這樣切、而你的研究問題正是專一性。含糊帶過等於承認你沒核對過。
你報的 HNH 是 775 到 908,還是含了 L1 與 L2?兩者差多少?點開看參考答案
兩個版本都算、都報,而且要先講清楚一件容易被打的事:L1(765–780)與 L2(906–918)在編號上本來就跟 HNH(775–908)重疊,所以「含不含鉸鏈」不是加法問題而是定義問題。這兩段是全結構預測信心最低的區域(Chai-1 在 765 到 809 只有 46),把 HNH 擴張到 765–918 很可能把平均值往上拉。誠實的做法是主文用 775–908,補充材料附上 765–918 的版本與差值,並說明結論不隨這個選擇改變 —— 如果會改變,那就是另一個問題了。L1/L2 的 RMSF 很少被單獨報過,所以那個差值要現場量,不能引用。
你的殘基編號跟 UniProt 對得起來嗎?有沒有缺失殘基?點開看參考答案
用地標殘基自證:resid 10 應該是 Asp、840 是 His、863 是 Asn、983 是 His、1335 是 Arg。再附上每個 domain 實際選到的殘基數(HNH 期望 134)。5F9R 的沉積條目裡有 1546 個聚合物殘基(蛋白 1368 + sgRNA 118 nt + target 股 30 nt + non-target 股 30 nt),其中只有 1527 個被建模。19 個缺口不是平均分布的:其中 11 個全部集中在 non-target 股的 PAM 遠端(那條鏈只有 residues 12–30 有座標),剩下的散在蛋白的 loop 上。你必須說得出缺在哪,因為起始結構那頁的教訓正是這 11 個補出來的核苷酸後來在 RMSF 上飆到 6 到 8 Å。
eSpCas9(1.1) 的 K848 按你的表是在 HNH 裡,可是 non-target 股照理走 RuvC 溝,你量到的距離怎麼解釋?點開看參考答案
先誠實陳述觀察,而且要把逐 replica 的散布一起講出來,不能只報平均。三個 grip 位點到 non-target 股的最小距離(seed 1/2/3/4)分別是:K848 0.6/0.7/0.3/1.0 nm(平均 0.7 nm,CV 44.6%)、K1003 2.3/1.1/2.0/1.1 nm(平均 1.6 nm,CV 37.7%)、R1060 1.8/0.5/2.0/1.7 nm(平均 1.5 nm,CV 46.4%)。能講的只有定性那一句:K848 貼著 non-target 股,另外兩個平均在一到兩奈米外。 K848 在 HNH(775–908)而 K1003、R1060 在 RuvC-III(909–1098),合理的說法是:在完整 R-loop 構形裡 HNH 已被 L1/L2 拉到切位附近,它表面的鹼性殘基有機會接觸位移股。
接下來這句不能說:「K1003 與 R1060 隔著兩奈米,所以不可能有靜電接觸、不可能形成鹽橋。」R1060 在 replica 2 就貼到 0.5 nm。三個量的 CV 落在 37.7% 到 46.4%,全部是 noise tier,拿它們下二分結論正好是本站方法學主張的自我示範 —— 反例就出在自己的資料裡。除此之外還有兩層限制:它綁在特定起始構形上,換一個構形(例如未活化的 checkpoint 態)距離會變;5F9R 的 non-target 股只有 residues 12–30 有實驗座標,1 到 11 是補出來的 —— 任何牽涉到位移股 PAM 遠端的距離,量的都是建模結果不是實驗事實。所以正確的報法是「在 5F9R 起始的三元系統中,逐 replica 如上」,不是「eSpCas9 的三點抓握」,更不是任何單一數字。
為什麼高保真變體幾乎都落在 REC3?這是機制還是篩選偏誤?點開看參考答案
兩者都有,要說清楚。機制面:REC3 是感測 PAM 遠端配對品質的那一塊,調它就是調構形活化門檻。偏誤面:這些變體多半是結構導向設計出來的,設計者本來就從「與 heteroduplex 接觸的殘基」開始挑,所以命中 REC3 有一部分是搜尋空間的選擇造成的。承認這一點反而有利,因為它直接指向一個 open question:非 REC3 的路徑有沒有被系統性地漏掉。
10Common Mistakes最常犯的錯
- 在每個分析腳本裡各自手寫
resid範圍。 後果:不同腳本的 domain 定義慢慢漂開,跨 replica、跨變體的比較全部失效,而且不會有任何錯誤訊息。正解:一份DOMAINS字典進版本控制,腳本一律 import。 - 假設 PDB 的殘基編號等於 UniProt 編號。 後果:整條分析錯位,圖看起來仍然正常。正解:跑地標殘基檢查(10-Asp、840-His、863-Asn、983-His、1335-Arg)。
- 只用 REC1 的其中一段當 fit selection。 後果:另一半的剛體運動被算成內部柔軟度。正解:兩段一起選(
resid 94:179 308:496),或明說你只用了哪一段以及為什麼。 - 報 domain 平均卻不報納入的殘基數。 後果:reviewer 無法判斷兩個系統比的是不是同一組殘基。正解:每張圖的圖說附上 n。
- 把 REC1 的兩種切法混用而不聲明。 後果:你的「REC1」跟文獻的「REC1」差了 217 個殘基,數字不可比。正解:明說採用 REC3 = 497–713 的切法,並引出處。
- 由「這個突變在 REC3」推論「所以它會提高專一性」。 後果:邏輯跳躍,同 domain 的變體行為並不一致。正解:domain 歸屬只能拿來生成假說,不能拿來排序;排序要靠實際量到的構形動力學。
11Further Reading讀哪幾篇
12Summary三句話
SpCas9 的 1368 個殘基分成 REC 與 NUC 兩瓣,加上橫跨兩瓣的 bridge helix 共七塊,其中 HNH(775 到 908)是一塊被插進 RuvC 序列中間、只靠 L1(765 到 780)與 L2(906 到 918)兩條短鉸鏈繫住的獨立摺疊,而這兩條鉸鏈的編號跟 HNH 是重疊的、不是相接的。整台機器的運作就是一條相對運動的鏈條:REC3 感測配對品質、REC2 讓開通道、HNH 繞著兩條鉸鏈大幅轉動就位、再放行 RuvC,而高保真變體的突變位置正好分別落在感應器(REC3)與握把(HNH 與 RuvC-III)上。這些編號本身不吃任何算力,卻是所有 domain 級聚合量的分母,選錯不會報錯只會安靜地給你錯的數字,所以它必須被寫成一份共用的設定檔並釘進版本控制。