實戰C/C++的依賴管理工具--Conan

在高級編程語言中,C/C++ 廣受開發人員的親睞,在語言排名上也名列前茅,生命力旺盛,而作爲一個C/C++ 程序猿,隨着開源模塊(車輪)的不斷創造,你在使用什麼工具或方法管理你的依賴和模塊化你的開發成果,創造屬於你的世界車輪,你還在用 GIT/SVN 管理 C/C++ 的依賴嗎?目前已經有愛立信等國際大公司大規模使用 Conan 做C++的包依賴的管理。今天跟大家一起實戰 Conan 進行 C/C++ 依賴管理。

 

背景

 

具體背景和介紹可以穿越到我們上一篇 C/C++ 依賴原理工具,這裏作簡單回顧,本篇文章主要進行實戰和落地。

 

大部分語言都已經有了專門的依賴解析工具,例如 Maven,Pypi,NPM。我們可以使用 Maven Package 來下載第三方依賴並進行編譯構建。

 

 

但是 C/C++呢?缺少一個統一的依賴管理的工具,這是 C/C++開發者的一大痛點。

 

這個問題是由於一些歷史原因導致的:

 

1.     不同的操作系統,不同的編譯器和芯片架構

2.     不同的構建系統

3.     不同的獲取依賴方法

 

Conan依賴管理工具優點

 

通過使用 Conan,我們可以得到以下收益

 

•       統一本地中心倉庫(私服),去中心化。

•       統一集成風格與規範,依賴管理變的更簡單(跨平臺多環境)

•       方便團隊共享模塊,減少重複車輪,降低工程大小

•       降低不同編譯環境依賴的複雜度

•       版本化管理,保證一致性

•       減少人工拷貝等操作帶來的風險

•       依賴編譯後的文件,加快構建速度

 

實戰 Conan ,進行依賴管理

 

下面,我們分幾個步驟進行 Conan 的實戰與落地:

 

1.  安裝 Conan 客戶端

2.  Conan 全局配置介紹

3.  創建 Demo 項目使用 Conan 依賴進行編譯構建

4.  安裝 Conan 私服 Artifactory

5.  創建一個新的模塊並上傳到私服,供其他人員依賴使用

6.  模塊開發測試生命週期管理實踐

7.  一鍵進行不同環境編譯構建

8.  遷移現有項目到 Conan 項目

 

Setup 安裝

 

支持以下方式安裝:

 Binaries, pip, brew, from source code…

 

我的環境(Mac):

– $ brew install conan

– $ brew install cmake

 

Conan 全局配置文件

 

 

  • conan.conf

包含本地包存儲路徑、日誌級別,默認構建參數等全局變量。

  • settings.yml

預定義了 Conan 執行命令時的參數範圍,如操作系統,編譯器及芯片架構等。

 

 

  • registry.txt

中心倉庫或公司內部私服的服務器地址及用戶認證信息。

 

創建 Demo 項目並使用 Conan 

依賴進行編譯構建

 

項目結構如下:

 

 

其中 main.cpp 是新開發的項目代碼,conanfile.txt 定義依賴哪些第三方模塊。

 

main.cpp

 

 

其中 include 一個已存在模塊,其中包含 hello.h 文件。

 

conanfile.txt

 

 

  • Requires 標籤描述依賴模塊座標

 

Hello/0.1@demo/testing 對應 模塊名稱/版本@user/channel(Channel 用於區分環境或用途)

 

  • Generators 標籤描述對應開發編譯工具,會對應生成用於編譯構建的文件

 

指定 CMake 會生成對應 CMake 規範工程文件,包含編譯需要的依賴配置,同理 visual_studio。

 

編譯構建

 

創建並進入 Build 目錄,執行 Conan Install 命令,進行依賴下載, -s  可以指定編譯的芯片架構,同時生成相應 CMake 標準工程文件,之後可以通過 CMake 進行編譯產生二進制可執行文件 Greet。

 

 

安裝 Conan 私服 Artifactory

 

本次 Demo 使用 Artifactory 作爲 Conan 私服。

JFrog Artifactory 已經支持 Conan 倉庫,全力加速 C/C++開發。

 

 

安裝引導參考官方文檔:https://www.jfrog.com/confluence/

 

另附30天免費試用版申請鏈接: 

 

https://www.jfrog.com/artifactory/free-trial/?lang=zh-hans#High-Availability

 

創建一個新模塊並上傳到私服

 

使用 Conan New 命令創建一個模塊包。

 

 

該命令會生成 conanfile.py 文件,該文件定義了功能模塊的基本描述(座標),以及模塊構建的生命週期,包括:源碼、配置、構建、打包等階段,並由 Python文件定義,可以自行靈活修改。

 

 

之後可以通過 Conan Install 命令按照生命週期進行編譯構建。

 

構建之後通過 Conan Export  命令導出模塊到本地倉庫,可以在本地爲其他項目提供依賴,類似 Mvn Install。

 

 

同時我們可以上傳到公司私服,對外提供依賴服務,使用 Conan Upload 命令將模塊上傳到私服,-r 參數可以指定具體私服。

 

 

上傳到私服效果展示:

 

 

模塊開發測試生命週期管理實踐

 

軟件開發都會有其對應的生命週期,開發,測試,生產,Conan 同時對此做了相應支持,不難發現,上文中在模塊的座標定義中已有相應說明,Hello/0.1@user/testing. 其中 Testing 描述了軟件生命週期中對應的階段。

 

當我們測試通過之後,我們可以通過命令或 API 將包快速升級到生產階段,避免多次構建。

 

 

一鍵進行不同環境編譯構建

 

C/C++ 日常開發中會遇到需要在不同架構 ,不同編譯器版本上進行測試,工作量不小,在 Conan 官網和社區,也提供了很多提高效率的工具:

•    Pip install conan-package-tools

•    Travis-ci (Linux, OSX), with docker

•    Appveyor (Win)

通過藉助 Docker 構建不同架構或不同編譯器版本(gcc 4.6,4.8,5.2,5.3 etc)的二進制包,進行測試或發佈, 可以幫助我們實現一鍵編譯,大大提高工作效率。

 

遷移現有項目到 Conan 項目

 

有了強大的依賴管理工具,就需要考慮遷移我們現有項目到 Conan 上來,原則上遷移可以選擇一個項目團隊先進行試點。上文中創建一個新的模塊中提到構建生命週期,我們可以爲遷移項目創建相應的 conanfile.py,  並根據公司情況自定義各個階段的執行過程,成熟形成一定規範之後進行大規模遷移。

 

總結

 

Conan 爲我們提供了統一的依賴管理和構建規範,通過統一 Conanfile 來描述依賴模塊的座標,並支持主流構建編譯工具,CMake,Visual Studio xcode等。同時 Conan 也支持其他類型語言的依賴管理,例如現在很火的 Golang。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章