CocoaPods
是OS X和iOS下的一個第三方開源類庫管理工具,經過CocoaPods
工具咱們能夠爲項目添加依賴庫(這些類庫必須是CocoaPods
自己所支持的),而且能夠輕鬆管理其版本。它是目前iOS開發中使用最普遍的開源庫管理工具,若是咱們內部協做的組件化可以使用這種方式管理的話,那將是很便利的。 在經過Cocoapods
創建內部私有庫以前,咱們須要再熟悉下Cocoapods
的工做流程,咱們建立內部私有庫時也會依照這個流程來。ios
本文目錄git
1、Cocoapods的工做流程github
2、創建Cocoapods私有庫json
3、使用私有庫swift
4、問題總結bash
工做流程如圖所示: 框架
這裏存放了各個框架的描述文件,託管在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": "ibireme@gmail.com"
},
"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
工做流程大概就是:
一、本地安裝cocoapods,創建本地索引庫和遠程索引庫的映射
二、本地項目pod install
三、查找本地索引文件,而後找到各個庫對應版本的json文件
四、經過json文件source字段找到引用庫的git地址
五、把庫文件拉到本地項目
建議採用framework
的形式建立私有庫,這能夠很好的在開發階段檢查出庫的不兼容或者文件權限出現的問題,Swift編寫的代碼經過Cocoapods
生成的都是framework
。
如何創建遠程索引庫 首先咱們須要創建一個內部的遠程索引庫,相似Cocoapods/Spec
的功能,以後添加的庫文件索引文件都會存放到這裏:username@bitbucket.org/sealcn/seal… 創建本地和遠程索引倉庫的關聯:
pod repo add SealRepo https://username@bitbucket.org/sealcn/sealrepo.git
複製代碼
執行pod repo
能夠看到咱們有了兩個索引倉庫,能夠去在這個目錄~/.cocoapods/repos
看到咱們剛創建的SealRepo
。
如何組織文件結構 咱們能夠看下Alamofire的文件組織結構:
咱們看到這幾個文件:
Source
用於存放Framework源文件,Example
用於放Demo項目docs
和Documentation
放說明文檔,這個是可選的,Tests
測試文件也是可選。 咱們製做私有庫時會仿照這個格式。由於是Swift的工程,接口的開放直接經過open、public等關鍵字指定,因此工程中的ABTest.h頭文件能夠刪除,加入咱們本身的庫文件。
注意:在寫公有庫文件時,對外界開放的屬性,方法須要帶上public
或者
open
關鍵字。
經過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
複製代碼
一、添加.swift-version .swift-version
文件用來告訴cocoapods
當前文件swift的版本,用命令行創建:
$ echo "4.0" > .swift-version
複製代碼
二、添加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.
複製代碼
三、建立庫描述文件 能夠經過命令行生成描述文件:
$ 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" => "username@company.biz" }
# ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.platform = :ios, "8.0"
# ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.source = { :git => "git@bitbucket.org: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
複製代碼
此時咱們的文件目錄看起來應該大概是這個樣子:
四、驗證本地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
複製代碼
五、驗證遠程索引文件 上傳代碼成功以後,咱們須要再次驗證它跟遠程倉庫(ABTest遠程庫和.podspec)是否匹配正確,執行:
pod spec lint
複製代碼
當出現:
ABTest.podspec passed validation
複製代碼
時,說明咱們遠程倉庫匹配正確。
六、提交podspec文件到SpecsRepo
$ pod repo push SealRepo ABTest.podspec
複製代碼
這個命令會包含pod spec lint
命令,驗證經過以後,會添加.podspec文件到本地索引庫:
和遠程索引庫:
咱們能夠像使用其餘庫文件同樣在Podfile文件中添加使用私有庫了,引入方法有兩種:
一、全局添加 在Podfile文件最上面添加一行:
source 'git@bitbucket.org:company/sealrepo.git'
複製代碼
注意:若是私有倉庫和cocoapods倉庫出現同名庫,會出現不可預期的狀況(隨機拉下來公有庫或者私有庫文件)。這時咱們須要使用單獨添加的方式。
二、單獨添加
pod 'ABTest', :git => 'git@bitbucket.org:company/mvabtest.git'
複製代碼
使用時經過import方法導入庫就能夠了。
當咱們須要升級私有庫,添加或者修改方法時,只須要:
一、修改.podspec
文件中s.version
的版本號
二、提交本地修改至遠程,打上對應tag
三、使用項目的工程執行pod update
一、pod search 查不到本地庫 這個多是cocoadpods自己問題,pod install安裝沒有問題
二、更新了版本,可是pod update沒有找到 咱們能夠採用以下形式,手動指定版本號:
pod 'ABTest', :git => 'git@bitbucket.org:sealcn/mvabtest.git', :tag => '0.0.4'
複製代碼
三、提示The 'Pods-App' target has transitive dependencies that include static binaries
這是由於引入的庫被編譯成了靜態庫,咱們能夠在.podspec
文件中加入:
s.static_framework = true
複製代碼
四、引入的第三方庫,在pod lint
時提示找不到 能夠手動指定pod目錄,將firsebase替換成你的庫文件路徑:
s.xcconfig = { 'SWIFT_INCLUDE_PATHS' => '$(PODS_ROOT)/Firebase/CoreOnly/Sources' }
複製代碼
五、提示source_files
對應文件爲空 每次pod lint
時都是根據版本號進行查找的,能夠檢查下當前修改跟版本號是否對應。
六、Encountered an unknown error (Unable to find a specification for MVNetRequest
depended upon by MVABTest
在製做MVABTest
倉庫時,引用了私有庫MVNetRequest
。lint在對引用庫驗證時,默認只驗證官網的倉庫,咱們須要手動添加驗證源才能經過。
pod spec lint --sources=git@bitbucket.org:sealcn/sealrepo.git,https://github.com/CocoaPods/Specs --allow-warnings
複製代碼