1. 程式人生 > >CocoaPods 私有庫 實現元件化

CocoaPods 私有庫 實現元件化

先說下CocoaPods拉取開源庫的原理:

我們知道 CocoaPods 有一個開源的索引倉庫[Specs](https://github.com/CocoaPods/Specs),倉庫存放著所有開源庫的各個版本的`.podspec`檔案,`.podspec`檔案包含中記錄著原始碼的地址。我們首次使用CocoaPods時,會將這個檔案庫克隆到本地`~/.cocoapods/repos/master`。

  1. 在Podfile目錄下執行 `pod install` 命令,會從本地的索引庫查詢該庫的`.podsepc`,如果本地不存在會從遠端拉取最新的索引庫。
  2. 根據索引庫中查到的`.podspec`檔案內容,獲取原始碼地址。
  3. 從原始碼地址拉取對應版本的程式碼。

Specs

使用是可以發現,首次匯入一個開源庫時速度較慢,之後再匯入時會很快。是因為CocoaPods在本地會有一個快取目錄,存放開源庫的原始碼,首次下載後,再次匯入該庫時,會直接從本地複製過去。   
檢視快取列表使用`pod cache list`,快取路徑為`~/Library/Caches/CocoaPods/Pods/`。

 私有倉庫

私有庫的建立

由於CocoaPods的索引倉庫是開源的,所有人都可以訪問。公司的專案如果也想使用CocoaPods管理原始碼,而不開放原始碼的話,我們可以通過建立私有倉庫來模擬官方的Specs倉庫。

步驟:

  1. 在私有git上建立一個索引倉庫,例:YSMSpecs,用於存放索引檔案。
  2. 將遠端索引庫新增到本地,`pod repo add YSMSpecs YSMSpecs_source_url`。使用`pod repo`可以檢視本地的索引倉庫列表。
  3. 本地建立我們的原始碼工程,可以使用`pod lib create YSMKit`,建立一個模板工程。
  4. 在模板工程裡進行開發並替換 ReplaceMe 檔案,修改`.podspec`檔案,推送到遠端原始碼倉庫,打tag,提交。原始碼倉庫部署完成。
  5. CocoaPods不允許有Podspecs lints錯誤,所以需要進行Podspecs lints(翻譯不好,會檢查語法錯誤)驗證。這裡可以使用`pod lib lint`或者`pod spec lint`,區別在於前者不會聯網,而後者還會檢查外部的倉庫和相關的標籤。
  6. 檢查沒有錯誤之後,推送`.podspec`檔案到本地的索引倉庫,本地索引倉庫會自動push到遠端索引倉庫。`pod repo push YSMSpecs YSMKit.podspec`,這一步會自動進行`pod spec lint`聯網檢查。索引庫部分完成。

第6步如果使用`pod trunk push`,會將索引庫推送到官方的Specs倉庫中。

到這裡私有倉庫是搞完了。

私有庫的使用

  1. 在宿主工程的Podifle檔案中引入私有庫:`pod 'YSMKit'`

  2. 在檔案的最上方新增索引庫地址

    source 'https://.../YSMSpecs/git'
    source 'https://github.com/CocoaPods/Specs.git'

    然後執行 pod install,就可以使用了。

注意: 如果用到了其他開源庫的話,一定要加上官方Specs地址,否則只會去查詢私有索引庫。

私有庫的維護

後續需要更新維護倉庫程式碼的流程: 

  1. 在原始碼工程修改程式碼之後,修改`.podspec`檔案版本號,把原始碼提交,打上tag,推送到遠端倉庫。
  2. 把`.podspec`檔案提交到本地的私有索引庫中(會自動幫我們提交到遠端索引庫)。
  3. 回到宿主工程,修改Podfile中的版本,執行`pod install`(不行就`pod update`)。

其他注意事項

  • 在podfile檔案中 增加`inhibit_all_warnings!`,這樣pod的工程不會顯示任何警告。
  • 切記:swift中需要設定好訪問許可權!!!
  • 新引入一些庫之後執行`pod install`,會報錯**Build Settings**,例如:引入Swift庫之後經常會報的“swift version”的錯誤,需要去修改Build Setting,其實可以在Podfile中的`post_install`中修改。
    post_install do |installer|
        installer.pods_project.targets.each do |target|
            target.build_configurations.each do |config|
                config.build_settings['SWIFT_VERSION'] = '3.2'
            end
        end
    end