天天看點

vcpkg下載下傳mysql庫_新玩意:使用vcpkg來管理你的C++代碼庫

vcpkg的2019.06更新

vcpkg是一個內建在宇宙級開發IDE(Visual Studio)中的一個元件,其主要用于代碼庫的管理及索引。在2019.06這次更新中,vcpkg現在可以用來在多個不同的平台上來管理C/C++代碼庫。開發團隊為此還專門在github上專門建立了一個倉庫:microsoft/vcpkg.

代碼庫别名:Ports

開發團隊使用Ports這個名詞來表示各種可用的第三方代碼庫。在今年6月的更新中又新增44個新的代碼庫,這些加入進來的新夥計們包括:bdwgc, cJSON, greatest, immer, json-c以及zydis. 值得注意的是,開發團隊選擇代碼庫的其中一個原則是:這個代碼庫的star數是否足夠?上面列出來的幾個,star數基本都在1K以上。

截至目前,vcpkg的github倉中已經內建291個代碼庫。

代碼庫首頁

為了能讓開發者快速了解一個代碼庫,開發團隊将各個代碼庫的首頁也加入進來。例如,有一個代碼庫Abseil,隻需要導航至:/ports/abseil/CONTROL,我們就可以看到一行首頁的連結資訊,這樣就能友善的前往代碼庫首頁了解這個庫。

Overlay Ports

在vcpkg工具中,我們可以使用search/install等指令來管理代碼庫。另外,開發團隊還添加了一個所謂的:Overlay ports的特性。我們可以使用這個特性來制定不同版本的代碼庫,甚至用來建立私有的Port。

舉個栗子

在一個項目中,我想使用OpenCV視覺庫,并且由于項目的一些依賴原因,我需要使用的是3.0的版本。但是不巧的是,這個版本稍稍有點舊了,vcpkg中包含的版本是3.4.3, 是以,這就比較尴尬了。

解決此問題的方法時,我們在GitHub上建立一個私有的倉庫,然後将OpenCV3.0的代碼Checkin到這個倉,然後将這個私有倉送出到vcpkg的ports目錄,這樣項目成員就可以使用3.0版本的OpenCV了。

我們來看看具體的流程:

初始化git倉庫,并導入3.0版本OpenCV庫

vcpkg下載下傳mysql庫_新玩意:使用vcpkg來管理你的C++代碼庫

接下來,項目團隊就可以使用vcpkg的overlay-ports參數來使用這個版本的代碼庫了。

vcpkg下載下傳mysql庫_新玩意:使用vcpkg來管理你的C++代碼庫

當然,如果某一天,你又想使用最新版本的庫了,可以使用bootstrap-vcpkg.bat來更新vcpkg。

開發團隊目前在完善這個特性,是以你可能會碰到一些稀奇古怪的問題,這個時候,請到GitHub上的vcpkg的首頁送出問題給開發團隊。

Triplets

vcpkg預設提供多種目标平台,例如Windows, Linux和WSL(Windows Subsystem for Linux)。目前開發團隊已經添加了Linux上可用的庫多達755個。我們看看下面的統計表格:

vcpkg下載下傳mysql庫_新玩意:使用vcpkg來管理你的C++代碼庫

可以看到Windows平台的ports最多,用于64位Windows的庫有1000多個。其他幾個平台也有幾百個。如果你期望的目标平台不在這個清單中,你還可以建立目标平台,方法還挺簡單,具體得看看文檔了。微軟的文檔,我的感覺是又多又齊全,我這輩子應該是沒有機會全部看完了。

Overlay Triplets

和上面提到的Overlay Ports類似的,本次更新還包含Overlay Triplets特性。我們可以使用這個特性來Override預設的目标平台,或者建立新的目标平台。

舉個栗子

有些Linux使用者,可能需要動态連結庫,但是目前的x64-linux平台中提供的是靜态的庫。那麼我們可以基于x64-linux平台來建立一個新的Triplet,這個新Triplet将建立動态庫。

第一步,建立一個目錄用于儲存新的Triplet。

vcpkg下載下傳mysql庫_新玩意:使用vcpkg來管理你的C++代碼庫

然後,拷貝一份x64-linux的triplet檔案,并重命名一個新的triplet名字。

vcpkg下載下傳mysql庫_新玩意:使用vcpkg來管理你的C++代碼庫

修改新配置檔案中的相關參數

vcpkg下載下傳mysql庫_新玩意:使用vcpkg來管理你的C++代碼庫

具體到這個例子來說,我們将VCPKG_LIBRARY_LINKAGE的值由static修改為:dynamic。

最後,我們可以使用–overlay-triplets來安裝第三方庫了,安裝成功之後,就可以得到動态編譯出來的庫,而不是預設的靜态庫。

vcpkg下載下傳mysql庫_新玩意:使用vcpkg來管理你的C++代碼庫

對代碼庫作者的支援

除了友善代碼庫的使用者,開發團隊還考慮到了代碼庫的作者。新增的幾個特性,可以幫助代碼庫作者提升開發效率和增強代碼的品質。

CI持續內建

開發團隊在Azure DevOps pipelines上添加了公共的測試代碼,這些測試代碼将測試搭建在GitHub上的vcpkg倉庫。開發者可以直接擷取編譯失敗日志及靜态檢查失敗結果。例如:

vcpkg下載下傳mysql庫_新玩意:使用vcpkg來管理你的C++代碼庫

可以通過圖示來訓示Check是否成功。如果Check失敗,則還可以看到有關此次失敗的詳細資訊:

vcpkg下載下傳mysql庫_新玩意:使用vcpkg來管理你的C++代碼庫

在Azure DevOps的Summary頁面,可以下載下傳所有失敗的日志及相關的變更描述。

vcpkg下載下傳mysql庫_新玩意:使用vcpkg來管理你的C++代碼庫

Check Features

通過vcpkg_check_features這個新特性,我們可以在檢查代碼庫的一個或者多個feature是否包含在庫中。例如,如果想啟用OpenCV的CUDA特性支援,可以使用如下指令:

vcpkg下載下傳mysql庫_新玩意:使用vcpkg來管理你的C++代碼庫

vcpkg_check_features簡化了代碼庫的可選特性的建立過程,在之前的實踐中,可能需要編寫如下的腳本:

vcpkg下載下傳mysql庫_新玩意:使用vcpkg來管理你的C++代碼庫

現在,隻需要編寫如下腳本:

vcpkg下載下傳mysql庫_新玩意:使用vcpkg來管理你的C++代碼庫

總結

vcpkg從一個VS中自帶的C++代碼管理元件,逐漸演化成今天的跨平台的代碼管理元件,離不開開發團隊的辛勤工作,我們也可以從這個變化中看出:微軟的重心已經從Windows這條大船轉移到企業應用,雲服務及開源社群。這個變革在Ballmer時期是不可想象的,相信在Satya的上司下,微軟能在新的領域再創一個輝煌。