使用Cocoapods管理私有庫組件

CocoaPods是OS X和iOS下的一個第三方開源類庫管理工具,通過CocoaPods工具我們可以爲項目添加依賴庫(這些類庫必須是CocoaPods本身所支持的),並且可以輕鬆管理其版本。它是目前iOS開發中使用最廣泛的開源庫管理工具,如果我們內部協作的組件化能夠使用這種方式管理的話,那將是很便利的。 在通過Cocoapods建立內部私有庫之前,我們需要再熟悉下Cocoapods的工作流程,我們創建內部私有庫時也會依照這個流程來。

本文目錄

一、Cocoapods的工作流程

二、建立Cocoapods私有庫

三、使用私有庫

四、問題總結

Cocoapods工作流程

工作流程如圖所示:

遠程索引庫:

這裏存放了各個框架的描述文件,託管在github上: CocoaPods/Specs

本地索引庫:

在安裝cocoapods時,執行的pod setup就是講遠程索引克隆到本地,本地索引的目錄爲:

~/.cocoapods/repos/master
複製代碼

本地索引和遠程索引的目錄一致,結構如下:

每個庫的每個版本都對應一個json格式的描述文件:

{
  "name": "YYImage",
  "summary": "Image framework for iOS to display/encode/decode animated WebP, APNG, GIF, and more.",
  "version": "1.0",
  "license": {
    "type": "MIT",
    "file": "LICENSE"
  },
  "authors": {
    "ibireme": "[email protected]"
  },
  "social_media_url": "http://blog.ibireme.com",
  "homepage": "https://github.com/ibireme/YYImage",
  "platforms": {
    "ios": "6.0"
  },
  "source": {
    "git": "https://github.com/ibireme/YYImage.git",
    "tag": "1.0"
  },
  "requires_arc": true,
  "default_subspecs": "Core",
  "subspecs": [
    {
      "name": "Core",
      "source_files": "YYImage/*.{h,m}",
      "public_header_files": "YYImage/*.{h}",
      "libraries": "z",
      "frameworks": [
        "UIKit",
        "CoreFoundation",
        "QuartzCore",
        "AssetsLibrary",
        "ImageIO",
        "Accelerate",
        "MobileCoreServices"
      ]
    },
    {
      "name": "WebP",
      "dependencies": {
        "YYImage/Core": []
      },
      "ios": {
        "vendored_frameworks": "Vendor/WebP.framework"
      }
    }
  ]
}
複製代碼

本地索引文件

當執行pod search命令時,如果本地索引不存在,就會創建出來:

$ pod search afn
Creating search index for spec repo 'master'..
複製代碼

本地索引文件路徑爲:

~/Library/Cache/Cocoapods/Pods
複製代碼

遠程框架庫

YYImage爲例,它的遠程框架庫就是json文件中的source: github.com/ibireme/YYI…

所以再用文字總結下Cocoapods工作流程大概就是:

1、本地安裝cocoapods,建立本地索引庫和遠程索引庫的映射

2、本地項目pod install

3、查找本地索引文件,然後找到各個庫對應版本的json文件

4、通過json文件source字段找到引用庫的git地址

5、把庫文件拉到本地項目

建立Cocoapods私有庫(framework)

建議採用framework的形式創建私有庫,這可以很好的在開發階段檢查出庫的不兼容或者文件權限出現的問題,Swift編寫的代碼通過Cocoapods生成的都是framework

0、準備工作:

如何建立遠程索引庫 首先我們需要建立一個內部的遠程索引庫,類似Cocoapods/Spec的功能,之後添加的庫文件索引文件都會存放到這裏:[email protected]/sealcn/seal… 建立本地和遠程索引倉庫的關聯:

pod repo add SealRepo https://[email protected]/sealcn/sealrepo.git
複製代碼

執行pod repo

可以看到我們有了兩個索引倉庫,可以去在這個目錄~/.cocoapods/repos看到我們剛建立的SealRepo

如何組織文件結構 我們可以看下Alamofire的文件組織結構:

我們看到這幾個文件:

  • Source用於存放Framework源文件,
  • Example用於放Demo項目
  • docsDocumentation放說明文檔,這個是可選的,
  • Tests測試文件也是可選。 我們製作私有庫時會仿照這個格式。

一、製作framework

因爲是Swift的工程,接口的開放直接通過open、public等關鍵字指定,所以工程中的ABTest.h頭文件可以刪除,加入我們自己的庫文件。

注意:在寫公有庫文件時,對外界開放的屬性,方法需要帶上public或者open關鍵字。

二、添加Example工程

通過Xcode菜單欄File->New->Target...添加一個Example工程。 引入第三方庫 如果無第三庫引用可以跳過這一步。 注意:引入Podfile文件,需要framework和Example兩個target都添加上。 測試項目 需要先編譯framework,沒有問題之後,導入到Demo項目裏

import ABTest
複製代碼

運行Dome,測試開發功能有沒有問題。

push項目到遠程庫 如果已經關聯過遠程私有倉庫,這一步可以跳過。 在遠程配置一個git地址,然後將本地項目關聯到遠程私有倉庫:

git remote add origin 倉庫地址
複製代碼

如過是首次關聯遠程倉庫,在push之前我們一般需要先拉去遠程分支

git pull origin master
複製代碼

如果提示:

There is no tracking information for the current branch.
複製代碼

那是因爲本地庫和遠程庫沒有建立聯繫,git認爲這兩個倉庫可能不是同一個,如果我們確認對應庫沒問題,可以使用:

$ git pull origin master --allow-unrelated-histories 
複製代碼

將遠程庫文件強制拉到本地倉庫。 之後再執行push命令將項目推到遠程倉庫。

git push -u origin master
複製代碼

三、Cocoapods配置文件

1、添加.swift-version .swift-version文件用來告訴cocoapods當前文件swift的版本,用命令行建立:

$ echo "4.0" > .swift-version
複製代碼

2、添加LICENSE 每個使用cocoapods添加的庫都需要準守開源協議,一般是MIT協議,因爲bitbucket沒法自動生成,我們可以手動生成這個同名文件,然後把協議內容複製進去:

MIT License

Copyright (c) [year] [fullname]

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
複製代碼

3、創建庫描述文件 可以通過命令行生成描述文件:

$ pod spec create ABTest
複製代碼

然後我們編輯ABTest.podspec文件,可以仿照下面的寫法

Pod::Spec.new do |s|

s.name         = "ABTest"
s.version      = "0.0.1"
s.summary      = "ABTest with Firebase"
s.description  = "This is a ABTest Framworks on swift"
s.homepage     = "https://bitbucket.org/company/abtest/src/master/"
s.license      = { :type => "MIT", :file => "LICENSE" }
s.author             = { "username" => "[email protected]" }

# ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.platform     = :ios, "8.0"
# ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.source       = { :git => "[email protected]:company/mvabtest.git", :tag => s.version }
s.source_files  = "Source", "Source/*.swift"

# ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
# s.resource  = "icon.png"
# s.resources = "Resources/*.png"

# ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.requires_arc = true
s.static_framework = true
s.dependency "Firebase/Core"
s.dependency "Firebase/RemoteConfig"
#s.ios.vendored_frameworks = "ABTest.framework"
s.xcconfig = { 'SWIFT_INCLUDE_PATHS' => '$(PODS_ROOT)/Firebase/CoreOnly/Sources' }
end
複製代碼

此時我們的文件目錄看起來應該大概是這個樣子:

4、驗證本地podspec文件

pod lib lint
複製代碼

該命令用於檢查podspec文件書寫是否正確,如果有error需要解決,warning可以不用管(可能會遇到較多問題,需耐心解決0。0)。解決之後再次運行檢查命令,當命令行顯示:

-> ABTest (0.0.1)
ABTest passed validation.
複製代碼

說明我們本地配置成功了,到這裏本地的第一個版本就算完成了! 然後我們需要將本次修改提交打上tag,提交到遠程倉庫。

git add .
git commit -m "build v0.0.1"
git push origin master
git tag 0.0.1
git push --tags
複製代碼

5、驗證遠程索引文件 上傳代碼成功之後,我們需要再次驗證它跟遠程倉庫(ABTest遠程庫和.podspec)是否匹配正確,執行:

pod spec lint
複製代碼

當出現:

ABTest.podspec passed validation
複製代碼

時,說明我們遠程倉庫匹配正確。

6、提交podspec文件到SpecsRepo

$ pod repo push SealRepo ABTest.podspec
複製代碼

這個命令會包含pod spec lint命令,驗證通過之後,會添加.podspec文件到本地索引庫:

和遠程索引庫:

使用私有庫

引用私有庫

我們可以像使用其他庫文件一樣在Podfile文件中添加使用私有庫了,引入方法有兩種:

1、全局添加 在Podfile文件最上面添加一行:

source '[email protected]:company/sealrepo.git'
複製代碼

注意:如果私有倉庫和cocoapods倉庫出現同名庫,會出現不可預期的情況(隨機拉下來公有庫或者私有庫文件)。這時我們需要使用單獨添加的方式。

2、單獨添加

pod 'ABTest', :git => '[email protected]:company/mvabtest.git'
複製代碼

使用時通過import方法導入庫就可以了。

更新私有庫

當我們需要升級私有庫,添加或者修改方法時,只需要:

1、修改.podspec文件中s.version的版本號

2、提交本地修改至遠程,打上對應tag

3、使用項目的工程執行pod update

可能遇到的問題

1、pod search 查不到本地庫 這個可能是cocoadpods本身問題,pod install安裝沒有問題

2、更新了版本,但是pod update沒有找到 我們可以採用如下形式,手動指定版本號:

pod 'ABTest', :git => '[email protected]:sealcn/mvabtest.git', :tag => '0.0.4'
複製代碼

3、提示The 'Pods-App' target has transitive dependencies that include static binaries 這是因爲引入的庫被編譯成了靜態庫,我們可以在.podspec文件中加入:

s.static_framework = true
複製代碼

4、引入的第三方庫,在pod lint時提示找不到 可以手動指定pod目錄,將firsebase替換成你的庫文件路徑:

s.xcconfig = { 'SWIFT_INCLUDE_PATHS' => '$(PODS_ROOT)/Firebase/CoreOnly/Sources' }
複製代碼

5、提示source_files對應文件爲空 每次pod lint時都是根據版本號進行查找的,可以檢查下當前修改跟版本號是否對應。

6、Encountered an unknown error (Unable to find a specification for MVNetRequest depended upon by MVABTest 在製作MVABTest倉庫時,引用了私有庫MVNetRequest。lint在對引用庫驗證時,默認只驗證官網的倉庫,我們需要手動添加驗證源才能通過。

pod spec lint [email protected]:sealcn/sealrepo.git,https://github.com/CocoaPods/Specs --allow-warnings
複製代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章