天天看點

如何将個人代碼庫導入到vcpkg?

非常感謝Nicole Mazzuca貢獻了本文的内容。

你是否正在開發一個依賴于其他庫代碼的C++工程呢?長年累月地使用各種”膠水腳本”和git submodules來維護庫代碼的各種”花樣”建構是否讓你心生疲倦?

是時候試試包管理器了!

也許你之前聽人說到過”vcpkg”,看起來這個工具非常适合你的開發團隊,但是有一個問題:并不是所有的依賴代碼都是開源的,另外,公司也有一些供内部使用的庫代碼。

vcpkg可以支援非開源的代碼庫嗎?

是的。在此之前,處理非開源代碼庫的方式是在代碼上做一些”Hacking”,或者克隆整個vcpkg裡的代碼庫。很顯然,這裡還有很大的提升空間。現在,我們高興地宣布一項實驗性的新特性,它可以用來管理你想要使用的任何代碼庫,不管它們是内部使用的私有代碼庫,還是開源代碼,或者是你克隆出來的其他開源代碼。在今天的文章中,我們将重點介紹這項全新特性,名為”registries”。

祝閱讀愉快!

registries入門

上面我們已經講解了為什麼需要registries,現在我們來探讨一下如何使用registries。

假設,我們是North Wind Traders的開發工程師,我們的公司購買了一份GitHub的企業版本。當然,基于公司或者個人的實際情況,你可以繼續使用目前的工作流程。

這篇文章的主要目的是配置一個最為常見的git registry。

1. 建立一個新的registry

我們先在GitHub上建立一個名為vcpkg-registry的registry,然後我們向裡面添加我們需要的代碼庫,在這個例子中,我們以JSON庫和Unicode庫為例。

> 首先,我們将要設定一個空的基線版本,這是對于一個registry的最小要求。

> 然後,我們向代碼庫中添加代碼,并確定它們可以編譯通過。

> 最後,通過配置版本資料庫和代碼庫在git倉庫中的路徑,我們将代碼庫添加到registry中。

2. 建立一個空的registry基線版本

那讓我們開始吧。克隆一個空的倉庫,然後在根目錄添加一個baseline.json檔案,檔案的内容如下圖所示:

如何将個人代碼庫導入到vcpkg?

3. 在代碼庫中建立一個vcpkg port

現在,讓我們為兩個庫中的第一個代碼庫(beicode的Unicode版本)設定一個port條目。如果你曾經編寫過port,那麼你将知道如何執行此操作,但是對于那些還沒有寫過port的人,讓我們還是進行一下操作用于參考。

首先,我們為要使用的port建立一個目錄。 按照vcpkg central registry的标準,我們将其稱為folder ports。由于我們使用穩定的git辨別符來指定目錄,是以無需将其放在特定位置,但是遵循習慣用法是很好的。在這個ports目錄中,建立beicode的port目錄,在其中放置兩個空檔案:portfile.cmake和vcpkg.json。

此時,系統資料庫目錄應如下所示:

如何将個人代碼庫導入到vcpkg?

現在,讓我們來填入我們的port。首先,因為beicode代碼庫已經有了一個vcpkg.json的manifest,我們需要拷貝這份資訊到你剛才建立的vcpkg.json檔案中,如下圖所示:

如何将個人代碼庫導入到vcpkg?

4. 使用overlays測試新的vcpkg port

讓我們通過嘗試安裝port來確定此方法有效,我們還沒有使用系統資料庫,僅使用預先已經存在的overlay-ports功能來測試内容:

> vcpkg install beicode –overlay-ports=

vcpkg-registry/ports/beicode

我們應該會得到一個錯誤: “檔案夾 /include為空或不存在”。既然我們還沒有做任何事情,是以這個錯誤提示是正常的。是以,讓我們填寫我們的port吧!由于我們的端口是一個簡單的CMake庫,是以我們可以建立一個非常簡單的portfile.cmake,如下圖所示:

如何将個人代碼庫導入到vcpkg?

如果我們執行下面的指令:

> vcpkg install beicode –overlay-ports=

vcpkg-registry/ports/beicode

再一次地,我們将看到它已成功安裝! 我們已經為系統資料庫編寫了第一個port,現在要做的就是将這個port添加到系統資料庫中設定的版本中。

5. 指定你的代碼庫在系統資料庫中的每一個版本

每個port的版本資料都儲存在自己的檔案中:versions / [第一個字元]-/ [portname] .json。 例如,fmt的版本資料将存在于versions / f- / fmt.json中; zlib的版本資料将存在于versions / z- / zlib.json中。 是以,對于beicode,請建立版本/b-/beicode.json:

如何将個人代碼庫導入到vcpkg?

然後添加如下的資訊到versions/baseline.json中:

如何将個人代碼庫導入到vcpkg?

最後,讓我們弄清楚要在”git-tree”字段中添加什麼:對beicode port tree進行git commit(但不要執行git push), 以確定git知道這一點,如下圖所示:

如何将個人代碼庫導入到vcpkg?

然後,我們就可以通過如下指令擷取這個目錄的辨別符:

> git rev-parse HEAD:ports/beicode

你會得到類似”

7fb5482270b093d40ab8ac31db89da4f880f01ba”的字元串,将這個字元串添加到beicode.json中,然後送出這個新的檔案:

> git add versions

> git commit –amend –no-edit

應該查不到快完成我們的工作了!

我們必須進行這種稍微複雜的工序的原因是,我們可以準确地擷取所需版本的檔案。其他版本将存在于存儲庫的曆史記錄中,是以總是可以在那裡檢出。

6. 在C++工程中使用vcpkg系統資料庫中的代碼庫

完成上面的操作後,讓我們嘗試在示例代碼庫中使用新系統資料庫中的代碼庫。在系統資料庫之外建立一個目錄,然後切換到該目錄。建立一個依賴于beicode的vcpkg.json,如下圖所示:

如何将個人代碼庫導入到vcpkg?

然後,添加一個vcpkg-configuration.json來作為一個系統資料庫:

如何将個人代碼庫導入到vcpkg?

執行以下指令進行安裝:

> vcpkg install –feature-flags=registries,manifests

如果可行,那麼你就可以向上遊推送系統資料庫資訊了!你還可以通過将vcpkg-configuration.json檔案中的”repository”字段替換為實際的上遊存儲庫URL,來嘗試使用實際的遠端系統資料庫。

vcpkg如何從系統資料庫解析代碼庫?

你可能會注意到,beicode和beison來自我們建立的系統資料庫,這是因為我們在vcpkg-configuration.json中明确指出了它們的來源。由于我們尚未說明fmt的來源,是以它僅來自預設系統資料庫,在這種情況下,該系統資料庫是vcpkg本身附帶的系統資料庫。系統資料庫永遠不會傳遞,如果你從vcpkg-configuration.json中的系統資料庫中删除了beicode,則該操作将無法正常工作,因為預設系統資料庫中不存在beicode,而vcpkg将在其中尋找它。如果要使用自己的副本覆寫fmt,可以将其添加到系統資料庫中,然後将其添加到”軟體包”字段中。

代碼包beison将是相同的,隻是名稱不同而已。Ni可以自己嘗試一下,然後檢視你的代碼是否與上遊代碼不同。

總結

最後