Conan C++內(nèi)網(wǎng)包管理構(gòu)建方案

需求

在公司的研發(fā)過程中,源碼以及文檔是公司重要的資產(chǎn)。目前,很多公司都將研發(fā)進(jìn)行了內(nèi)網(wǎng)化,禁止直接與互聯(lián)網(wǎng)進(jìn)行連接。內(nèi)網(wǎng)開發(fā)中,C++項(xiàng)目如何進(jìn)行包管理,是一個重要問題。而在內(nèi)網(wǎng)的包管理中,最大的問題是經(jīng)常需要對其他開源項(xiàng)目包進(jìn)行依賴,而重新構(gòu)建這些包管理,對我們是不小的挑戰(zhàn)。

實(shí)施方案

總體策略

基于現(xiàn)有開放的包管理中心,對包進(jìn)行本地化移植。
最終的方案是這樣的。首先,通過包管理器的索引文件找出所有的包、版本信息、源碼信息;然后,根據(jù)解析的包信息,對包中的源碼文件進(jìn)行本地化下載映射;最后,將遠(yuǎn)程倉庫中的包轉(zhuǎn)移到本地倉庫。另外一個額外的步驟,將本地外網(wǎng)倉庫導(dǎo)出,修改源碼下載配置,然后導(dǎo)入到內(nèi)網(wǎng)中的倉庫,完成公網(wǎng)C++包的公網(wǎng)轉(zhuǎn)內(nèi)網(wǎng)。

架構(gòu)部署

物理機(jī)器架構(gòu)部署圖

公網(wǎng)倉庫中心:就是常規(guī)意義的Conan-Center倉庫,是Conan C++包的官方倉庫中心,包含了常見的C++包。
外網(wǎng)中轉(zhuǎn)倉庫中心:主要目的是將公網(wǎng)倉庫中心的包轉(zhuǎn)移到本地,在本地完成包關(guān)系驗(yàn)證,確保包轉(zhuǎn)移后的正確性。
內(nèi)網(wǎng)倉庫中心:部署在不能連接互聯(lián)網(wǎng)內(nèi)網(wǎng)中的倉庫中心。

流程及問題梳理

  1. 需要一個方式,能夠?qū)⒐W(wǎng)倉庫中心的包轉(zhuǎn)移到外網(wǎng)中轉(zhuǎn)倉庫中心;
  2. 需要能夠獲取到所有的包列表;
  3. 需要一個方式,能夠?qū)⑼饩W(wǎng)中轉(zhuǎn)倉庫中心的包,轉(zhuǎn)移到內(nèi)網(wǎng)倉庫中心;
  4. 需要對包源碼文件進(jìn)行管理,確保內(nèi)網(wǎng)能夠下載到包源碼文件;

為了解決以上問題,將任務(wù)進(jìn)行如下分解:

  1. 獲取包列表,以及包對應(yīng)源碼信息;
  2. 獲取包依賴關(guān)系;
  3. 實(shí)現(xiàn)遠(yuǎn)程包源碼與本地包源碼的一一映射;
  4. 公網(wǎng)倉庫包本地轉(zhuǎn)移;
  5. 包源碼信息修改;
  6. 包的內(nèi)網(wǎng)導(dǎo)入;

為了實(shí)現(xiàn)以上任務(wù),需要對部署圖進(jìn)行一定升級,需要內(nèi)網(wǎng)提供一個源碼訪問的存儲。升級后的部署圖如下:


添加源碼存儲后的架構(gòu)部署圖

實(shí)現(xiàn)

包列表獲取

github上有一個項(xiàng)目叫做conan-center-index,是conan-center的索引同步信息文件。理論上來說,從這個項(xiàng)目文件可以直接構(gòu)建出本低倉庫,但由于本任務(wù)設(shè)定時間緊迫(從學(xué)習(xí)conan包管理器,到完成內(nèi)網(wǎng)轉(zhuǎn)移方案實(shí)現(xiàn),預(yù)期時間2天),此想法還沒有完全驗(yàn)證。僅僅將這個索引文件導(dǎo)入到倉庫中,并不能直接識別包信息,應(yīng)該需要其他特殊處理過程。
在conan-center-index項(xiàng)目中,基本使用了python腳本與yml文件進(jìn)行包信息描述。在實(shí)現(xiàn)本任務(wù)過程中,本想著基于此項(xiàng)目信息同步分析包依賴關(guān)系,執(zhí)行py文件,獲取相關(guān)信息。但存在一個問題,py文件依賴了大量conan的內(nèi)部模塊,不能直接運(yùn)行,為解決此問題,有兩個方法,1,構(gòu)建這些模塊的mock,使得可以啟動執(zhí)行;2,直接引入conan的內(nèi)部模塊。后期對兩個方法都進(jìn)行了簡單的驗(yàn)證,第一個方法基本也是可行的,但由于是mock,不確定是否對結(jié)果有什么影響。第二個方法很難實(shí)現(xiàn),主要是需要完成按conan的流程來調(diào)用執(zhí)行,這個過程需要時間來分析具體代碼,目前沒有太多時間計(jì)劃。
由于各種因素,最終只是解析conan-center-index項(xiàng)目中的yml文件,獲取到包名稱、版本、以及對應(yīng)的源碼文件信息。

包依賴關(guān)系獲取

conan提供了一個info命令,可以提供依賴信息。命令大致如下:

conan info poco/1.9.4@ -r=conan-center -j=o.json

輸出結(jié)果為o.json文件,后續(xù)對該文件進(jìn)行解析。

遠(yuǎn)程包源碼與本地包源碼的一一映射

一個較好的做法是將文件的校驗(yàn)碼作為本地文件存儲目錄名稱,確保一一映射的準(zhǔn)確。但由于時間關(guān)系,選擇了另外一個相對存在一點(diǎn)不足的方法,將鏈接直接MD5作為本低存儲目錄名稱,一般來說,這個方案風(fēng)險也不大,因?yàn)樵创a打包路徑中都帶有版本信息,很少會保持目錄不變,而源碼內(nèi)容進(jìn)行變化,但也是存在這個可能的。

倉庫包本地轉(zhuǎn)移

通過Conan的兩個命令實(shí)現(xiàn),一個是從遠(yuǎn)程倉庫安裝包,另一個是將安裝的包上傳到本地倉庫。由于從遠(yuǎn)程倉庫安裝包,對機(jī)器存儲空間有要求,而測試電腦中硬盤空間也是很緊缺,另外安裝也是存在一定的失敗可能,所以選擇不是安裝包,而是查看包依賴。查看包依賴時,會將包的描述信息下載到本地,但不會嘗試構(gòu)建二進(jìn)制信息,所以只要網(wǎng)絡(luò)不出問題,這個操作就基本都是成功的,可行性更高。

conan info poco/1.9.4@ -r=conan-center -j=o.json
conan upload poco/1.9.4 -r=local-center

包源碼信息修改

包源碼信息修改,有兩個方式。
第一個方式,在外網(wǎng)中轉(zhuǎn)倉庫中心,導(dǎo)出倉庫。在導(dǎo)出的倉庫目錄中,有包的描述文件,對包描述文件進(jìn)行修改,將源碼獲取從公網(wǎng)設(shè)置到內(nèi)網(wǎng),例如http://github.com/xxx/xxx.zip修改為ftp://172.1.2.5/packages/md5xxx/xxx.zip
第二個方式,不對包描述信息進(jìn)行修改,而是在Conan源碼上進(jìn)行修改。當(dāng)檢查獲取源碼信息時,將當(dāng)前路徑自動轉(zhuǎn)換為內(nèi)網(wǎng)路徑。
兩個方式都能滿足目前需求,但考慮到可維護(hù)性,第二個方式會更優(yōu)一些。當(dāng)公網(wǎng)包升級時,采用方案1,需要每次都進(jìn)行源碼路徑修改,這個操作可能被忘記。另外,內(nèi)網(wǎng)存儲包源碼的路徑可能也會發(fā)生變化,相對來說第二個方式會更具有可維護(hù)性。

包的內(nèi)網(wǎng)導(dǎo)入

這個功能是JFrog Artifactory自帶的功能。在其web管理頁面中進(jìn)行操作即可。

源碼

https://gitee.com/imlaji/conan-info-parse
源碼包含了包列表解析、包一一映射本地下載、包依賴關(guān)系解析、包公網(wǎng)轉(zhuǎn)本地執(zhí)行。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容