在高級編程語言中,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。