使用Cocoapods管理私有庫組件

cocoapods.png

CocoaPods是OS X和iOS下的一個第三方開源類庫管理工具吻谋,通過CocoaPods工具我們可以為項目添加依賴庫(這些類庫必須是CocoaPods本身所支持的)逗栽,并且可以輕松管理其版本鲁猩。它是目前iOS開發(fā)中使用最廣泛的開源庫管理工具蚪缀,如果我們內部協(xié)作的組件化能夠使用這種方式管理的話砰蠢,那將是很便利的磅网。
在通過Cocoapods建立內部私有庫之前婆咸,我們需要再熟悉下Cocoapods的工作流程竹捉,我們創(chuàng)建內部私有庫時也會依照這個流程來。

本文目錄
一尚骄、Cocoapods的工作流程
二块差、建立Cocoapods私有庫
三、使用私有庫
四、問題總結

Cocoapods工作流程

工作流程如圖所示:


cocoapods_work_flows

遠程索引庫:

這里存放了各個框架的描述文件憨闰,托管在github上:
CocoaPods/Specs

本地索引庫:

在安裝cocoapods時状蜗,執(zhí)行的pod setup就是講遠程索引克隆到本地,本地索引的目錄為:

~/.cocoapods/repos/master

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


localRepo.png

每個庫的每個版本都對應一個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"
      }
    }
  ]
}

本地索引文件

當執(zhí)行pod search命令時轧坎,如果本地索引不存在,就會創(chuàng)建出來:

$ pod search afn
Creating search index for spec repo 'master'..

本地索引文件路徑為:

~/Library/Cache/Cocoapods/Pods

遠程框架庫

以YYImage為例泽示,它的遠程框架庫就是json文件中的source:
https://github.com/ibireme/YYImage.git

所以再用文字總結下Cocoapods工作流程大概就是
1缸血、本地安裝cocoapods,建立本地索引庫和遠程索引庫的映射
2械筛、本地項目pod install
3捎泻、查找本地索引文件,然后找到各個庫對應版本的json文件
4埋哟、通過json文件source字段找到引用庫的git地址
5笆豁、把庫文件拉到本地項目

建立Cocoapods私有庫(framework)

建議采用framework的形式創(chuàng)建私有庫,這可以很好的在開發(fā)階段檢查出庫的不兼容或者文件權限出現的問題赤赊,Swift編寫的代碼通過Cocoapods生成的都是framework闯狱。

0、準備工作:

如何建立遠程索引庫
首先我們需要建立一個內部的遠程索引庫抛计,類似Cocoapods/Spec的功能哄孤,之后添加的庫文件索引文件都會存放到這里:https://zhangferry@bitbucket.org/sealcn/sealrepo.git
建立本地和遠程索引倉庫的關聯:

pod repo add SealRepo https://zhangferry@bitbucket.org/sealcn/sealrepo.git

執(zhí)行pod repo

91bd1bf2.png

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

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

image.png

我們看到這幾個文件:

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

一弟断、制作framework

3f2a44c9.png

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

5f8d2d4d.png

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

二叔汁、添加Example工程

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

import ABTest

運行Dome像屋,測試開發(fā)功能有沒有問題。

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 

將遠程庫文件強制拉到本地倉庫胁艰。
之后再執(zhí)行push命令將項目推到遠程倉庫。

git push -u origin master

三智蝠、Cocoapods配置文件

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

$ echo "3.0" > .swift-version

2杈湾、添加LICENSE
每個使用cocoapods添加的庫都需要準守開源協(xié)議解虱,一般是MIT協(xié)議,因為bitbucket沒法自動生成漆撞,我們可以手動生成這個同名文件殴泰,然后把協(xié)議內容復制進去:

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、創(chuàng)建庫描述文件
可以通過命令行生成描述文件:

$ 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/sealcn/remoteabtest/src/master/"
  s.license      = { :type => "MIT", :file => "LICENSE" }
  s.author             = { "zhangferry" => "zhangfei@dailyinnovation.biz" }

  # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
  s.platform     = :ios, "8.0"
  # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
  s.source       = { :git => "https://zhangferry@bitbucket.org/sealcn/remoteabtest.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

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


framework_catalog.png

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 tag 0.0.1
git push --tags

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

pod spec lint

當出現:

ABTest.podspec passed validation

時,說明我們遠程倉庫匹配正確祟敛。
6疤坝、提交podspec文件到SpecsRepo

$ pod repo push SealRepo ABTest.podspec

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

7dffd809.png

和遠程索引庫:


7e052503.png

使用私有庫

引用私有庫

我們可以像使用其他庫文件一樣在Podfile文件中添加使用私有庫了跑揉,引入方法有兩種:
1、全局添加
在Podfile文件最上面添加一行:

source 'https://zhangferry@bitbucket.org/sealcn/sealrepo.git'

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

pod 'ABTest', :git => 'https://zhangferry@bitbucket.org/sealcn/remoteabtest.git'

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

更新私有庫

當我們需要升級私有庫,添加或者修改方法時勋桶,只需要:
1脱衙、修改.podspec文件中s.version的版本號
2、提交本地修改至遠程例驹,打上對應tag
3捐韩、使用項目的工程執(zhí)行pod update

可能遇到的問題

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

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

pod 'ABTest', :git => 'https://zhangferry@bitbucket.org/sealcn/remoteabtest.git', :tag => '0.0.4'

3仅政、提示The 'Pods-App' target has transitive dependencies that include static binaries
這是因為引入的庫被編譯成了靜態(tài)庫,我們可以在.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時都是根據版本號進行查找的运褪,可以檢查下當前修改跟版本號是否對應惊楼。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末玖瘸,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子檀咙,更是在濱河造成了極大的恐慌雅倒,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弧可,死亡現場離奇詭異蔑匣,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門裁良,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凿将,“玉大人,你說我怎么就攤上這事价脾∧恋郑” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵侨把,是天一觀的道長犀变。 經常有香客問我,道長秋柄,這世上最難降的妖魔是什么获枝? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮骇笔,結果婚禮上省店,老公的妹妹穿的比我還像新娘。我一直安慰自己蜘拉,他們只是感情好萨西,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旭旭,像睡著了一般谎脯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上持寄,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天源梭,我揣著相機與錄音,去河邊找鬼稍味。 笑死废麻,一個胖子當著我的面吹牛,可吹牛的內容都是我干的模庐。 我是一名探鬼主播烛愧,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掂碱!你這毒婦竟也來了怜姿?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤疼燥,失蹤者是張志新(化名)和其女友劉穎沧卢,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體醉者,經...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡但狭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年披诗,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片立磁。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡呈队,死狀恐怖,靈堂內的尸體忽然破棺而出唱歧,到底是詐尸還是另有隱情掂咒,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布迈喉,位于F島的核電站绍刮,受9級特大地震影響,放射性物質發(fā)生泄漏挨摸。R本人自食惡果不足惜孩革,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望得运。 院中可真熱鬧膝蜈,春花似錦、人聲如沸熔掺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽置逻。三九已至推沸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間券坞,已是汗流浹背鬓催。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恨锚,地道東北人宇驾。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像猴伶,于是被迫代替她去往敵國和親课舍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內容

  • 項目組件化他挎、平臺化是技術公司的共同目標筝尾,越來越多的技術公司推崇使用pod管理第三方庫以及私有組件,一方面使項目架構...
    swu_luo閱讀 21,771評論 0 39
  • 背景 上一篇博客最新的CocoaPods的使用教程(一)里主要講解了CocoPods得簡單的日常使用。但是我們經常...
    Dely閱讀 5,807評論 11 34
  • 最近想為公司搭建cocoapods私有庫框架,老早之前做過减俏,踩過不少坑,想不到又一次掉坑里贸街。果真是好記性不如爛筆頭...
    生光閱讀 1,542評論 0 4
  • 目錄 環(huán)境 TL;DR(步驟概述)1、創(chuàng)建示例工程2狸相、編寫 Pod 庫3薛匪、Build 項目后,在 Demo 工程中...
    Vinc閱讀 6,135評論 3 7
  • 一脓鹃、iOS和OSX中添加第三方依賴庫1.1 CocoaPods介紹1.2 Carthage介紹1.3 CocoaP...
    小米鍋巴閱讀 2,215評論 0 8