iOS應用模塊化的思考及落地方案(二)模塊化自動構建工具的使用

1.0 iOS模塊化中的問題

前文已經介紹了模塊化的流程及一些常見的問題,咱們在這裏再次總結一下。git

在工做中,當咱們開始一個新項目的時候,最早考慮的就是模塊化工做。github

模塊化工做的想法是很美好的,但是執行過程當中會遇到不少的問題,而這些問題可能會讓咱們在工做中舉步維艱。shell

  1. 工具使用問題。iOS的模塊化通常會使用cocoapods工具,這個工具很強大,內容也很豐富,咱們想要完成模塊化工做,須要創建私有庫,編寫podspec文件,處理資源,編寫Podfile文件,創建本地依賴等等。讓團隊成員每一個人都精通這個工具是沒必要要的。所以常常會在使用工具中遇到不易解決的問題,從而浪費大量的時間。swift

  2. xcode設置問題。xcode設置項多如牛毛,不少內容看起來並不直觀,須要咱們去查閱官方文檔來解決。並且這些設置數量多,使用的頻率又少,因此不免會出現這樣的狀況:每一個人都遇到的問題,而後各自去花時間解決,而後過段時間遇到相同的問題經常就忘記了,還要花時間去查閱解決,形成資源的重複浪費。xcode

  3. 模塊間依賴的問題,當你依賴的也是私有庫的其餘模塊(下文中稱爲自有模塊)時,開發中可能要同時修改多個模塊,這樣就會出如今多個工程中切換的問題。bash

  4. 規範問題,每一個人創建模塊的方式可能都不一樣,包括工程結構,工程設置等等。這樣一來,不一樣的模塊可能差別特別大,當跨模塊開發或者代碼交接的時候,可能就會出現難以解決的問題。服務器

  5. 設置的變動修改都是手動修改,有時候不免會由於疏忽,而致使難以發現的錯誤,當須要處理的模塊和依賴較多時,發生錯誤的機率也會增長。app

2.0 編寫自動化工具

爲了解決這些問題,讓團隊可以將精力所有集中到業務開發中,特使用bash shell開發一個構建工具,用於自動化處理模塊化的過程當中遇到的設置及工具使用問題。模塊化

工具的地址以下:github.com/hardman/AWM…工具

使用這個自動化工具你將會得到以下能力:

  1. 一條命令便可建立模塊工程,建立.podspec及Podfile文件,自動安裝依賴,工程默認使用靜態庫,支持Swift和OC
  2. 一條命令便可拉取以前開發的模塊,而且安裝好全部依賴
  3. 一條命令便可自動打tag,自動更新.podspec文件,將工程推送到pod服務器
  4. 自有模塊的列表,將會保存在單獨git庫中,便於有依賴模塊時,可動態加載
  5. 自有模塊的依賴都經過.podspec文件使用local path的方式安裝,這樣當被依賴的模塊也須要修改時,不須要打開多個工程

所以,使用這個自動化工具,你不須要了解cocoapods工具,也不須要處理任何工程和工具設置,能夠將注意力都集中到業務開發中。

【注】工具使用靜態庫做爲模塊的輸出文件。

3.0 工具的使用

3.1 基本使用步驟

  1. 將工程clone到本地目錄
  2. 打開tools/config修改配置文件
    • modulelistgitaddress.txt:新建一個git庫,並將地址保存在這個文件中,地址最好是以git@開頭。這個git庫用於保存全部自有模塊名稱及地址。
    • podspecsaddr.txt:再新建一個git庫,將地址保存在這個文件中,地址最好是git@開頭。這個git庫就是你的私有庫地址。
    • podspecsname.txt:爲你的git庫取一個名字,保存在這個文件中
    • 上述3個文件都只有一行
    • dependencypodrepos.txt:這個文件保存你的app依賴的其餘pod repos,通常狀況下保持默認便可,支持多行,每行保存一個地址
    • 因爲這些配置幾乎不會修改,考慮將這些文件提交到你本身的git庫中
  3. 執行 ./create.sh -n=[模塊名] -b=[bundle id] -t=[s|f|r] 便可建立工程
    • 腳本執行過程當中會要求輸入一些工程基本信息及所依賴的模塊,請認真輸入,不要遺漏
    • 建立的工程會自動打開,而且能夠直接執行
    • 建立好的模塊文件在:工程根目錄/modules
    • 例:./create.sh -n=HelloWorld -b=com.helloworld -t=s
  4. 模塊開發完畢,須要將代碼提交到develop分支,而後執行./push.sh [模塊名] [tag]
    • 執行push.sh時,模塊必須在develop分支上
    • 執行成功後,你的模塊就已經提交成功,能夠經過Podfile文件引用了
    • 例:./push.sh HelloWorld 0.0.1
  5. 使用 ./pull.sh [模塊名] 便可下載其餘未同步到本地的自有模塊
    • 執行成功後,會自動下載全部依賴的模塊,並經過local path添加到模塊依賴中
    • 例:./pull.sh HelloWorld

3.2 如何提高模塊所依賴其餘模塊的版本號

有的時候,當前模塊所依賴的模塊版本升級了,須要修改當前模塊的依賴文件。 有2種方法:

  1. 直接修改文件
    • 須要修改的文件有2個,一個是文件根目錄的dependency.txt文件,文件內記錄了當前模塊依賴的自有模塊
    • dependency.txt文件記錄模塊版本的格式是:每行一個模塊;格式爲:模塊名@@版本號,版本號支持~>前綴,不可帶空格
    • 另外一個文件是模塊名.podspec文件
    • 按照podspec文件要求的格式去修改版本號
  2. 使用腳本修改
    • 執行命令:./utils.sh [模塊名] upgradedependency [依賴的模塊名] [版本號]
    • 其中版本號能夠爲空
    • 例子:./utils.sh LoginModule upgradedependency AFNetworking 3.5.0
    • 例子:./utils.sh LoginModule upgradedependency AFNetworking
  3. 版本號可支持英文字符:a.b.c

3.3 如何在模塊工程內使用Swift&OC混編

  1. 在module工程內建立OC的類文件及swift文件,假設OC類名爲 TestOC,swift類名爲TestSwift
  2. 讓OC可以訪問Swift類
    • 只須要在TestOC.m中添加import。例:#import "模塊名/模塊名-Swift.h"
    • 另外需注意的是,TestSwift類必須是public並繼承自NSObject。
  3. 讓Swift可以訪問OC類
    • 在 [模塊名].h 這個文件中引入你的頭文件。例:#import "TestOC.h"
    • xcode - build phases - [模塊名].h 文件必須在public區域

3.4 關於模塊資源文件的獲取

  1. 因爲模塊都是靜態庫,因此最終運行到app中後,每一個模塊的資源文件(.xcassets, .xib, .png, .jpg, .jpeg, .gif, .txt, .plist, .bundle, .zip, .car)都是放到: "模塊名.bundle"文件中的,而這個bundle在main bundle的根目錄(這也是要求模塊名防止重名的緣由之一)
  2. 因此獲取圖片可使用 UIImage.init(named: name, in: bundle, compatibleWith: nil) 方法
  3. 獲取其餘文件也須要指定bundle才能夠
  4. 開發過程當中,獲取任何資源都須要帶bundle,不能直接使用相似 UIImage.init(named:String)這種方法,即便是在模塊工程內部的代碼也不行
  5. 須要注意的是,靜態庫的單元測試target是沒法獲取資源的

3.5 注意事項

  1. 模塊名要防止重複,不但要防止同一個私有庫重複,也要防止與其餘pod repo內的模塊重複
  2. 依賴庫不可產生循環依賴,好比 A依賴B,B依賴C,C依賴A
  3. 每一個模塊都有一個develop分支,develop分支的代碼老是與最新的tag保持一致。執行push命令時,代碼老是在develop分支上
  4. 開發期間(集成測試前)老是依賴本地模塊,每次老是在集成測試前,纔會執行push.sh腳本
  5. 若是當前的開發模塊有修改,同時依賴的模塊也有修改,則須要先push當前模塊所依賴的模塊,最後push當前模塊。這時候可能須要使用 ./utils.sh [模塊名] upgradedependency [依賴的模塊名] [版本號] 命令修改模塊所依賴的模塊的版本號

--完--

  1. iOS應用模塊化的思考及落地方案(一)模塊的劃分及模塊化工做流程
  2. iOS應用模塊化的思考及落地方案(二)模塊化自動構建工具的使用
相關文章
相關標籤/搜索