SQLite 的設計宗旨是滿足大多數開發人員的需求,無需任何變更或自訂。當需要變更時,通常可以使用啟動時間 (1) 或執行時間 (2) (3) (4) 設定方法,或透過 編譯時選項 來達成。應用程式開發人員需要編輯 SQLite 原始碼才能將 SQLite 整合到產品中的情況非常罕見。
我們將針對單一應用程式使用的 SQLite 原始碼自訂修改稱為「私人分支」。當需要私人分支時,應用程式開發人員必須負責讓私人分支與公開 SQLite 原始碼保持同步。這很繁瑣。這也可能很棘手,因為雖然 SQLite 檔案格式和已發布的介面非常穩定,但 SQLite 的內部實作變動非常快速。對於任何給定的 SQLite 點版本,可能會變動數百或數千行程式碼。
本文概述一種可能的方法,用於讓 SQLite 的私人分支與公開的 SQLite 原始碼保持同步。當然,維護私人分支的方法有很多。沒有人被迫使用這裡描述的方法。本文並未嘗試對私人分支的維護人員強制執行特定程序。本文的重點是提供一個維護私人分支的程序範例,可用作設計最適合每個個別專案情況的程序範本。
我們建議使用 fossil 軟體組態管理 系統來設定兩個分支。一個分支(「公開分支」或「主幹」)包含已發布的 SQLite 原始碼,另一個分支是私人分支,其中包含專案自訂的程式碼。每當 SQLite 發布新的公開版本時,該版本就會新增到公開分支,然後將變更合併到私人分支。
本文建議使用 fossil,但任何其他分散式軟體組態管理系統,例如 monotone 或 mercurial(又稱「hg」),或 git,都可以發揮同樣的作用。概念將相同,儘管程序的具體細節會有所不同。
右方的圖示說明了這個概念。從標準 SQLite 版本開始。為了範例,假設打算建立一個 SQLite 版本 3.6.15 的私人分支。在圖示中,這是版本 (1)。維護人員將基準 SQLite 的完整副本製作到分支空間中,顯示為版本 (2)。請注意,(1) 和 (2) 完全相同。然後,維護人員將私人變更套用至版本 (2),產生版本 (3)。換句話說,版本 (3) 是 SQLite 版本 3.6.15 加上編輯。
稍後,SQLite 版本 3.6.16 發布,如圖中圓圈 (4) 所示。此時,私人分支維護者執行合併,取得從 (1) 到 (4) 的所有變更,並將這些變更套用到 (3)。結果是版本 (5),也就是 SQLite 3.6.16 加上編輯。
可能會發生合併衝突。換句話說,從 (2) 到 (3) 的變更可能與從 (1) 到 (4) 的變更不相容。在這種情況下,維護者必須手動解決衝突。希望衝突不會太常發生。當私人編輯保持在最低限度時,衝突發生的可能性較低。
上述循環可以重複多次。圖表顯示第三個 SQLite 版本,3.6.17 在圓圈 (6) 中。私人分支維護者可以執行另一次合併,以將從 (4) 到 (6) 的變更納入私人分支,產生版本 (7)。
本文檔的其餘部分將引導讀者完成維護私人分支所需的步驟。一般概念與上述相同。本節僅提供更多詳細資訊。
我們再次強調,這些步驟並非維護私人分支的唯一可接受方法。此方法只是其中一種。將本文檔用作準備專案特定程序的基準。不要害怕嘗試。
Fossil 是一個電腦程式,在使用前必須安裝在您的機器上。幸運的是,安裝 fossil 非常容易。Fossil 是單一的「*.exe」檔案,您只需下載並執行即可。要解除安裝 fossil,只需刪除 exe 檔案即可。有關安裝和開始使用 fossil 的詳細說明可在fossil 網站上取得。
使用以下指令建立 fossil 儲存庫來主機私人分支
fossil new private-project.fossil
您可以隨意命名您的專案。「.fossil」字尾是可選的。在本文中,我們將持續稱呼專案為「private-project.fossil」。請注意,private-project.fossil 是個一般的磁碟檔案(實際上是 SQLite 資料庫),它將包含您完整的專案歷程。您只要複製該檔案,就能備份專案。
如果您想設定新專案,請輸入
fossil ui private-project.fossil
「ui」指令會讓 fossil 執行一個小型內建網路伺服器,並啟動您的網路瀏覽器,指向該網路伺服器。您可以使用網路瀏覽器以各種方式設定您的專案。請參閱 fossil 網站上的說明,取得更多資訊。
一旦專案儲存庫建立後,請建立專案的開放簽出,方法是移動到您想要存放所有專案原始碼的目錄,然後輸入
fossil open private-project.fossil
如果您想要,您可以對同一個專案進行多次簽出。而且您可以將儲存庫「複製」到不同的機器,以便多位開發人員可以使用它。請參閱 fossil 網站,取得更多資訊。
在上一步驟中建立的儲存庫最初是空的。下一步是載入基線 SQLite 版本 - 上述圖表中的圓圈 (1)。
首先取得 SQLite 的副本,以您使用的任何形式取得。您取得的公開 SQLite 應該盡可能接近您私下編輯的副本。如果您的專案使用 SQLite 混合,請取得混合的副本。如果您使用預處理的個別原始檔,請取得那些檔案。將所有原始檔放入上一步驟中建立的簽出目錄。
公開 SQLite 發行版本中的原始碼使用 unix 行尾 (ASCII 碼 10:「換行」僅 NL) 和空格,而不是 tab。如果您要將行尾變更為 windows 風格的行尾 (ASCII 碼 13、10:「回車」和「換行」;CR-NL) 或將空格縮排變更為 tab 縮排,請在提交基準線之前立即進行變更。只有公開分支和私人分支之間的差異最小時,合併程序才能順利運作。如果您在私人分支中變更 NL 至 CR-NL 行尾,導致原始檔案的每一行都變更,則合併步驟將無法正確運作。
假設您使用合併原始碼。請將基準線新增至您的專案,如下所示
fossil add sqlite3.c sqlite3.h
如果您使用個別原始檔案,請將所有原始檔案命名,而不要只命名兩個合併原始檔案。完成後,請提交您的變更,如下所示
fossil commit
系統會提示您輸入提交註解。請隨意輸入。提交完成後,您的基準線將成為儲存庫的一部分。如果您願意,可以使用下列指令在「時間軸」上查看此基準線
fossil ui
最後一個指令與我們之前執行的「ui」指令相同。它會啟動一個迷你網頁伺服器並將您的網頁瀏覽器指向該伺服器。但這次我們不必指定儲存庫檔案,因為我們位於檢出內部,因此 fossil 可以自行找出儲存庫。如果您想在第二個引數中輸入儲存庫檔案名稱,也可以。但這是選用的。
如果您不想使用網頁瀏覽器檢視新的提交,可以使用下列指令從命令列取得一些資訊
fossil timeline fossil info fossil status
前一步驟在上方圖表中建立了圓圈 (1)。此步驟將建立圓圈 (2)。執行下列指令
fossil branch new private trunk -bgcolor "#add8e8"
此指令將建立一個名為「private」的新分支(若喜歡,你可以使用不同的名稱),並將其背景顏色指定為淡藍色(「#add8e8」)。如果你願意,可以省略背景顏色,不過有不同的背景顏色確實可以讓分支在時間軸顯示中更容易與「主幹」(公開分支)區分。如果你願意,可以使用網路介面變更私人分支或公開分支(「主幹」)的背景顏色。
上述指令建立了新分支。但是你的結帳仍然在主幹上 - 執行指令後你可以看到
fossil info
若要將你的結帳變更為私人分支,請輸入
fossil update private
你可以再次執行「info」指令,以驗證你是否在私人分支上。若要返回公開分支,請輸入
fossil update trunk
通常,在私人分支和公開分支之間切換時,fossil 會修改你結帳中的所有檔案。但在這個時間點,兩個分支中的檔案都相同,因此不需要進行任何修改。
現在是時候對 SQLite 進行私人自訂修改了,這是這個練習的重點。使用「fossil update private」指令切換至私人分支(如果你尚未切換),然後在你的文字編輯器中開啟原始檔,並進行任何你想要進行的變更。完成變更後,使用此指令提交這些變更
fossil commit
系統會再次提示您輸入一個描述變更的提交。然後會執行提交。提交會在儲存庫中建立一個新的簽入,對應於上圖中的圓圈 (3)。
現在公用和私人分支不同了,您可以執行 "fossil update trunk" 和 "fossil update private" 指令,並看到在分支之間切換時,fossil 確實會變更簽出中的檔案。
請注意,在上圖中,我們將私人編輯顯示為單一提交。這僅為清楚呈現而做。沒有任何因素會阻止您進行數十或數百個獨立的小變更,並分別提交每個變更。事實上,進行許多小變更才是建議的工作方式。將所有變更放在單一提交中的唯一原因是,這樣可以讓圖表更易於繪製。
假設過了一段時間(通常約一個月),SQLite 的新版本 3.6.16 發布了。您會想要將這個新的公用 SQLite 版本整合到公用分支(主幹)中的儲存庫。為此,請先將您的儲存庫變更為主幹
fossil update trunk
然後下載 SQLite 原始碼的新版本,並覆寫簽出中的檔案。
如果您在原始基準中進行了 NL 至 CR-NL 行尾變更,或空白至 tab 縮排變更,請對新的原始檔進行相同的變更。
準備好一切後,執行 "fossil commit" 指令以簽入變更。這會在上述圖表中建立圓圈 (4)。
下一步是將公用分支中的變更移到私人分支。換句話說,我們要建立上圖中的圓圈 (5)。首先使用 "fossil update private" 變更到私人分支。然後輸入此指令
fossil merge trunk
「合併」指令會嘗試將所有 (1) 和 (4) 圈之間的變更套用至本機簽出的檔案。請注意,(5) 圈尚未建立。您需要執行「提交」指令來建立 (5) 圈。
合併時可能會發生衝突。當程式碼的同一行在 (1) 和 (4) 圈與 (2) 和 (3) 圈之間以不同的方式變更時,就會發生衝突。合併指令會公告任何衝突,並在輸出中包含衝突行的兩個版本。您需要開啟包含衝突的檔案,並手動解決衝突。
在解決衝突後,許多使用者會在將新版本提交至儲存庫前編譯並測試。或者,您也可以先提交,稍後再測試。無論如何,執行「fossil commit」指令以檢查 (5) 圈版本。
當新版本的 SQLite 發布時,請重複步驟 3.6 和 3.7,將新版本中的變更新增至私人分支。如果需要,可以在版本之間對私人分支進行其他私人變更。
自此文件首次撰寫以來,官方 SQLite 原始碼已從老牌的 CVS 系統移至 https://www.sqlite.org/src 上的 Fossil 儲存庫。這表示,如果您使用的是官方 SQLite 原始碼(與 合併 原始碼檔案 sqlite3.c 和 sqlite3.h 相反),則您可以透過複製官方儲存庫來建立私人儲存庫
fossil clone https://www.sqlite.org/src private-project.fossil
此指令會建立新儲存庫,並將其填入所有最新的 SQLite 程式碼。然後,您可以按照第 3.4 節所述建立私人分支。
當私人儲存庫是透過複製建立時,整合新的公開 SQLite 版本也會變得更容易。若要從公開 SQLite 儲存庫中提取所有最新變更,只需移至開放簽出,然後執行
fossil update
然後繼續將「主幹」中的變更與你的「私人」變更合併,如第 3.7 節所述。
此頁面最後修改於 2023-10-10 17:29:48 UTC