小巧。快速。可靠。
任選三項。
維護 SQLite 的私人分支

1. 簡介

SQLite 的設計宗旨是滿足大多數開發人員的需求,無需任何變更或自訂。當需要變更時,通常可以使用啟動時間 (1) 或執行時間 (2) (3) (4) 設定方法,或透過 編譯時選項 來達成。應用程式開發人員需要編輯 SQLite 原始碼才能將 SQLite 整合到產品中的情況非常罕見。

我們將針對單一應用程式使用的 SQLite 原始碼自訂修改稱為「私人分支」。當需要私人分支時,應用程式開發人員必須負責讓私人分支與公開 SQLite 原始碼保持同步。這很繁瑣。這也可能很棘手,因為雖然 SQLite 檔案格式和已發布的介面非常穩定,但 SQLite 的內部實作變動非常快速。對於任何給定的 SQLite 點版本,可能會變動數百或數千行程式碼。

本文概述一種可能的方法,用於讓 SQLite 的私人分支與公開的 SQLite 原始碼保持同步。當然,維護私人分支的方法有很多。沒有人被迫使用這裡描述的方法。本文並未嘗試對私人分支的維護人員強制執行特定程序。本文的重點是提供一個維護私人分支的程序範例,可用作設計最適合每個個別專案情況的程序範本。

2. 基本概念

我們建議使用 fossil 軟體組態管理 系統來設定兩個分支。一個分支(「公開分支」或「主幹」)包含已發布的 SQLite 原始碼,另一個分支是私人分支,其中包含專案自訂的程式碼。每當 SQLite 發布新的公開版本時,該版本就會新增到公開分支,然後將變更合併到私人分支。

本文建議使用 fossil,但任何其他分散式軟體組態管理系統,例如 monotonemercurial(又稱「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)。

3. 程序

本文檔的其餘部分將引導讀者完成維護私人分支所需的步驟。一般概念與上述相同。本節僅提供更多詳細資訊。

我們再次強調,這些步驟並非維護私人分支的唯一可接受方法。此方法只是其中一種。將本文檔用作準備專案特定程序的基準。不要害怕嘗試。

3.1. 取得軟體

Fossil 是一個電腦程式,在使用前必須安裝在您的機器上。幸運的是,安裝 fossil 非常容易。Fossil 是單一的「*.exe」檔案,您只需下載並執行即可。要解除安裝 fossil,只需刪除 exe 檔案即可。有關安裝和開始使用 fossil 的詳細說明可在fossil 網站上取得。

3.2. 建立專案儲存庫

使用以下指令建立 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 網站,取得更多資訊。

3.3. 在 Fossil 中安裝 SQLite 基準

在上一步驟中建立的儲存庫最初是空的。下一步是載入基線 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

3.4. 建立私人分支

前一步驟在上方圖表中建立了圓圈 (1)。此步驟將建立圓圈 (2)。執行下列指令

 
fossil branch new private trunk -bgcolor "#add8e8"

此指令將建立一個名為「private」的新分支(若喜歡,你可以使用不同的名稱),並將其背景顏色指定為淡藍色(「#add8e8」)。如果你願意,可以省略背景顏色,不過有不同的背景顏色確實可以讓分支在時間軸顯示中更容易與「主幹」(公開分支)區分。如果你願意,可以使用網路介面變更私人分支或公開分支(「主幹」)的背景顏色。

上述指令建立了新分支。但是你的結帳仍然在主幹上 - 執行指令後你可以看到

fossil info

若要將你的結帳變更為私人分支,請輸入

fossil update private

你可以再次執行「info」指令,以驗證你是否在私人分支上。若要返回公開分支,請輸入

fossil update trunk

通常,在私人分支和公開分支之間切換時,fossil 會修改你結帳中的所有檔案。但在這個時間點,兩個分支中的檔案都相同,因此不需要進行任何修改。

3.5. 將自訂內容新增至私人分支中的程式碼

現在是時候對 SQLite 進行私人自訂修改了,這是這個練習的重點。使用「fossil update private」指令切換至私人分支(如果你尚未切換),然後在你的文字編輯器中開啟原始檔,並進行任何你想要進行的變更。完成變更後,使用此指令提交這些變更

fossil commit

系統會再次提示您輸入一個描述變更的提交。然後會執行提交。提交會在儲存庫中建立一個新的簽入,對應於上圖中的圓圈 (3)。

現在公用和私人分支不同了,您可以執行 "fossil update trunk" 和 "fossil update private" 指令,並看到在分支之間切換時,fossil 確實會變更簽出中的檔案。

請注意,在上圖中,我們將私人編輯顯示為單一提交。這僅為清楚呈現而做。沒有任何因素會阻止您進行數十或數百個獨立的小變更,並分別提交每個變更。事實上,進行許多小變更才是建議的工作方式。將所有變更放在單一提交中的唯一原因是,這樣可以讓圖表更易於繪製。

3.6. 整合新的公用 SQLite 版本

假設過了一段時間(通常約一個月),SQLite 的新版本 3.6.16 發布了。您會想要將這個新的公用 SQLite 版本整合到公用分支(主幹)中的儲存庫。為此,請先將您的儲存庫變更為主幹

fossil update trunk

然後下載 SQLite 原始碼的新版本,並覆寫簽出中的檔案。

如果您在原始基準中進行了 NL 至 CR-NL 行尾變更,或空白至 tab 縮排變更,請對新的原始檔進行相同的變更。

準備好一切後,執行 "fossil commit" 指令以簽入變更。這會在上述圖表中建立圓圈 (4)。

3.7. 將公用 SQLite 更新合併到私人分支

下一步是將公用分支中的變更移到私人分支。換句話說,我們要建立上圖中的圓圈 (5)。首先使用 "fossil update private" 變更到私人分支。然後輸入此指令

fossil merge trunk

「合併」指令會嘗試將所有 (1) 和 (4) 圈之間的變更套用至本機簽出的檔案。請注意,(5) 圈尚未建立。您需要執行「提交」指令來建立 (5) 圈。

合併時可能會發生衝突。當程式碼的同一行在 (1) 和 (4) 圈與 (2) 和 (3) 圈之間以不同的方式變更時,就會發生衝突。合併指令會公告任何衝突,並在輸出中包含衝突行的兩個版本。您需要開啟包含衝突的檔案,並手動解決衝突。

在解決衝突後,許多使用者會在將新版本提交至儲存庫前編譯並測試。或者,您也可以先提交,稍後再測試。無論如何,執行「fossil commit」指令以檢查 (5) 圈版本。

3.8. 進一步更新

當新版本的 SQLite 發布時,請重複步驟 3.6 和 3.7,將新版本中的變更新增至私人分支。如果需要,可以在版本之間對私人分支進行其他私人變更。

4. 變異

自此文件首次撰寫以來,官方 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