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的overlay-ports參數來使用這個版本的代碼庫了。
當然,如果某一天,你又想使用最新版本的庫了,可以使用bootstrap-vcpkg.bat來更新vcpkg。
開發團隊目前在完善這個特性,所以你可能會碰到一些稀奇古怪的問題,這個時候,請到GitHub上的vcpkg的主頁提交問題給開發團隊。
Triplets
vcpkg默認提供多種目標平臺,例如Windows, Linux和WSL(Windows Subsystem for Linux)。目前開發團隊已經添加了Linux上可用的庫多達755個。我們看看下面的統計表格:
可以看到Windows平臺的ports最多,用於64位Windows的庫有1000多個。其他幾個平臺也有幾百個。如果你期望的目標平臺不在這個列表中,你還可以創建目標平臺,方法還挺簡單,具體得看看文檔了。微軟的文檔,我的感覺是又多又齊全,我這輩子應該是沒有機會全部看完了。
Overlay Triplets
和上面提到的Overlay Ports類似的,本次更新還包含Overlay Triplets特性。我們可以使用這個特性來Override默認的目標平臺,或者創建新的目標平臺。
舉個慄子
有些Linux用戶,可能需要動態連結庫,但是目前的x64-linux平臺中提供的是靜態的庫。那麼我們可以基於x64-linux平臺來新建一個新的Triplet,這個新Triplet將創建動態庫。
第一步,創建一個目錄用於保存新的Triplet。
然後,拷貝一份x64-linux的triplet文件,並重命名一個新的triplet名字。
修改新配置文件中的相關參數
具體到這個例子來說,我們將VCPKG_LIBRARY_LINKAGE的值由static修改為:dynamic。
最後,我們可以使用–overlay-triplets來安裝第三方庫了,安裝成功之後,就可以得到動態編譯出來的庫,而不是默認的靜態庫。
對代碼庫作者的支持
除了方便代碼庫的使用者,開發團隊還考慮到了代碼庫的作者。新增的幾個特性,可以幫助代碼庫作者提升開發效率和增強代碼的品質。
CI持續集成
開發團隊在Azure DevOps pipelines上添加了公共的測試代碼,這些測試代碼將測試搭建在GitHub上的vcpkg倉庫。開發者可以直接獲取編譯失敗日誌及靜態檢查失敗結果。例如:
可以通過圖標來指示Check是否成功。如果Check失敗,則還可以看到有關此次失敗的詳細信息:
在Azure DevOps的Summary頁面,可以下載所有失敗的日誌及相關的變更描述。
Check Features
通過vcpkg_check_features這個新特性,我們可以在檢查代碼庫的一個或者多個feature是否包含在庫中。例如,如果想啟用OpenCV的CUDA特性支持,可以使用如下指令:
vcpkg_check_features簡化了代碼庫的可選特性的創建過程,在之前的實踐中,可能需要編寫如下的腳本:
現在,只需要編寫如下腳本:
總結
vcpkg從一個VS中自帶的C++代碼管理組件,逐漸演化成今天的跨平臺的代碼管理組件,離不開開發團隊的辛勤工作,我們也可以從這個變化中看出:微軟的重心已經從Windows這條大船轉移到企業應用,雲服務及開源社區。這個變革在Ballmer時期是不可想像的,相信在Satya的領導下,微軟能在新的領域再創一個輝煌。