CocoaPods 詳細(xì)介紹

一俐东、CocoaPods簡介

iOS 和 OS X下的一個第三方庫管理工具唾琼,類似的iOS工具還有Carthage(比較輕量級,需要手動配置主胧,非侵入式),與Java里的Maven也比較類似徙垫,但是沒有maven的構(gòu)建讥裤、運(yùn)行程序、打包等功能姻报,僅僅是庫依賴配置和庫版本管理工具己英。
作用:依賴庫版本管理、庫依賴自動配置吴旋;

二损肛、安裝與使用

安裝

  • sudo gem install cocoapods

由于被墻,通常需要切換gem源

查看gem源
gem sources -l
刪除gem源
gem sources --remove https://ruby.taobao.org/
修改gem源
gem sources -a https://gems.ruby-china.org
  • pod setup

在本地建立一個Cocoapods里描述文件主倉庫荣瑟,然后建立遠(yuǎn)程庫索引治拿,出現(xiàn)Setup completed 則安裝完成

基本使用

  • 命令pod search xx, 查找?guī)煜嚓P(guān)信息
pod search
pod search
  • podfile配置

Podfile文件描述了工程中一個或者多個Target的依賴關(guān)系。Podfile會默認(rèn)創(chuàng)建一個隱式的Target鏈接到工程中用戶的第一個target笆焰,名稱未“default”劫谅;

簡單的Podfile

pod 'AFNetworking', '~> 1.0'

復(fù)雜的Podfile

platform :ios, '9.0'
inhibit_all_warnings!

target 'MyApp' do
  pod 'ObjectiveSugar', '~> 0.5'

  target "MyAppTests" do
    inherit! :search_paths
    pod 'OCMock', '~> 2.0.1'
  end
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    puts "#{target.name}"
  end
end

依賴配置

pod 'Lib' 或者 pod 'Lib', '1.0.1' 或者 pod 'lib', ~>'1.0.1'

指定了依賴庫的名稱和版本

  • 不填,默認(rèn)使用最新版本
  • = 0.1
  • > 0.1
  • >= 0.1
  • < 0.1
  • <= 0.1
  • ~> 0.1.2 等價于 0.1.2<=版本<0.2.0, 并使用這個范圍內(nèi)最新的版本嚷掠。

pod一些用法

pod 'Objection', :head使用指定spec下最新可用版本捏检,會強(qiáng)制下載高風(fēng)險版本

pod 'AFNetworking', :path => '~/Documents/AFNetworking'

pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'

pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :branch => 'dev'

pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'

Target 語法

target 'name' do
pod xxx
end

指定target對應(yīng)的依賴庫

其他一些不常用的語法如:podspec、abstract_target不皆、abstract!贯城、inherit!。

Sources

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

Podfile從這里去搜索specs霹娄,全局定義能犯,不能定義在單獨(dú)一個Target里鲫骗。

編譯配置

platform

platform ios, '8.0' 或 platform (不填寫)

目前的默認(rèn)設(shè)置是iOS4.3、OS X10.6踩晶、tvOS 9.0执泰、watchOS 2.0

use_frameworks!

該命令的作用是讓依賴庫使用framework的方式被主工程使用,否則是以靜態(tài)庫的形式渡蜻;
framework:系統(tǒng)的framework是動態(tài)庫(dylib),自己開發(fā)的framework是靜態(tài)庫.
framework = 頭文件 + .a + 資源文件

用途:
當(dāng)OC和Swift庫互相引用的時候坦胶,原本需要使用XXX-Bridging-Header.h橋接文件來導(dǎo)入,使用framework方式則可以直接像本語言里導(dǎo)入頭文件方式import "AFNetwork/AFNetwork.h"

使用了use_frameworks!


use_frameworks!
use_frameworks!

未使用use_frameworks!(使用.a的靜態(tài)鏈接庫方式)


#use_frameworks!
#use_frameworks!

其他不常用的還有inhibit_all_warnings!晴楔、link_with、project峭咒。

Hooks税弃、Workspace、Root Options等內(nèi)容配置官方文檔凑队。

  • 依賴庫安裝

pod install

工程目錄


工程目錄
工程目錄
  • 運(yùn)行

執(zhí)行.xcworkplace文件

  • 頭文件導(dǎo)入

三则果、內(nèi)部詳解

文件組成說明

  • Podfile

    描述本工程第三方庫的依賴關(guān)系

  • Podfile.lock 和 Pods/Manifest.lock

Podfile.lock描述了pod install之后各個依賴庫的具體版本,主要作用是在Podfile里未具體指定版本號的情況下漩氨,保證協(xié)同開發(fā)人員使用的版本一致西壮;除非修改了Podfile文件或者使用pod update 'PodName',否則Podfile.lock不會更新叫惊。

舉個例子:

sequenceDiagram
A->>Podfile: pod install
Podfile->>Podfile.lock: 描述了準(zhǔn)備的依賴庫版本號
Podfile.lock->>Repo: 版本控制
B->>Repo: 拉去代碼, 包括Podfile款青、Podfile.lock; 

B 從倉庫拉下代碼霍狰,也執(zhí)行pod install抡草,這個時候未具體指定版本號的依賴庫不再是拉去最新版本或者其他一些規(guī)則,而是根據(jù)Podfile.lock里的版本去下載依賴庫蔗坯,這樣就保證了大家使用的是同一個版本康震。

Manifest.lock是存放在Pods目錄下的,這個目錄一般不加入git版本控制宾濒;也是在pod install之后生成腿短,是Podfile.lock的拷貝,主要作用是為了校驗(yàn)已經(jīng)安裝的依賴庫和Podfile.lock里的是否一致绘梦,保證大家使用相同的依賴版本橘忱。

Manifest.lock
Manifest.lock

pod install具體的執(zhí)行過程:

pod install --verbose 或者pod install --no-repo-update --verbose

Preparing

Analyzing dependencies

Inspecting targets to integrate
  Using `ARCHS` setting to build architectures of target
  `Pods-LiveStream_IM_Demo`: (``)

Finding Podfile changes
  - Masonry
  - RealReachability
  - SVProgressHUD
  - YYKeyboardManager
  - YYModel
  - YYText
  - YYWebImage

Resolving dependencies of `Podfile`

Comparing resolved specification to the sandbox manifest
  - Masonry
  - RealReachability
  - SVProgressHUD
  - YYCache
  - YYImage
  - YYKeyboardManager
  - YYModel
  - YYText
  - YYWebImage

Downloading dependencies

-> Using Masonry (1.0.2)

-> Using RealReachability (1.1.8)

-> Using SVProgressHUD (2.1.2)

-> Using YYCache (1.0.4)

-> Using YYImage (1.0.4)

-> Using YYKeyboardManager (1.0.1)

-> Using YYModel (1.0.4)

-> Using YYText (1.0.7)

-> Using YYWebImage (1.0.5)
  - Running pre install hooks

Generating Pods project
  - Creating Pods project
  - Adding source files to Pods project
  - Adding frameworks to Pods project
  - Adding libraries to Pods project
  - Adding resources to Pods project
  - Linking headers
  - Installing targets
    - Installing target `Masonry` iOS 6.0
    - Installing target `RealReachability` iOS 6.0
    - Installing target `SVProgressHUD` iOS 7.0
    - Installing target `YYCache` iOS 6.0
    - Installing target `YYImage` iOS 6.0
    - Installing target `YYKeyboardManager` iOS 6.0
    - Installing target `YYModel` iOS 6.0
    - Installing target `YYText` iOS 6.0
    - Installing target `YYWebImage` iOS 6.0
    - Installing target `Pods-LiveStream_IM_Demo` iOS 8.0
  - Running post install hooks
  - Writing Xcode project file to `Pods/Pods.xcodeproj`
    - Generating deterministic UUIDs
  - Writing Lockfile in `Podfile.lock`
  - Writing Manifest in `Pods/Manifest.lock`

Integrating client project

Integrating target `Pods-LiveStream_IM_Demo` (`LiveStream_IM_Demo.xcodeproj` project)
  - Running post install hooks
    - cocoapods-stats from
    `/Users/netease/.rvm/gems/ruby-2.3.0@global/gems/cocoapods-stats-1.0.0/lib/cocoapods_plugin.rb`

Sending stats
      - Masonry, 1.0.2
      - RealReachability, 1.1.8
      - SVProgressHUD, 2.1.2
      - YYCache, 1.0.4
      - YYImage, 1.0.4
      - YYKeyboardManager, 1.0.1
      - YYModel, 1.0.4
      - YYText, 1.0.7
      - YYWebImage, 1.0.5

-> Pod installation complete! There are 7 dependencies from the Podfile and 9 total pods installed.

[!] Automatically assigning platform ios with version 8.0 on target LiveStream_IM_Demo because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.
  1. 'Inspecting targets to integrate',確定項(xiàng)目的架構(gòu)谚咬;
  2. 'Finding Podfile changes',
  3. 'Resolving dependencies of Podfile', 解析Podfile文件
  4. 下載依賴庫文件
  5. 生成一個Pods.project
    • 添加源文件
    • 添加frameworkworks
    • 靜態(tài)庫
    • 資源
    • 鏈接頭文件
    • 對每個依賴庫在Pods.project中生成一個target
  6. 生成Podfile.lock文件
  7. 生成Pods/Manifest.lock文件
  8. 與原有的工程集成

pod outdated

當(dāng)你運(yùn)行pod outdated命令鹦付,CocoaPods會列出那些所有較Podfile.lock里面有新版本的庫(那些當(dāng)前被安裝著的庫的版本)。

pod update

當(dāng)你運(yùn)行 pod update PODNAME 命令時择卦,CocoaPods會幫你更新到這個庫的新版本敲长,而不需要考慮Podfile.lock里面的限制郎嫁,它會更新到這個庫盡可能的新版本,只要符合Podfile里面的版本限制祈噪。
如果你運(yùn)行pod update泽铛,后面沒有跟庫的名字,CocoaPods就會更新每一個Podfile里面的庫到盡可能的最新版本辑鲤。

四盔腔、podspec制作

步驟

  1. 創(chuàng)建庫工程,添加git月褥,

    $ git add .
    $ git commit -m ""
    $ git push origin master

podspec文件中需要配置tag號弛随,所以需要打一個tag

$ git tag -m "comments" "0.1.2"
$ git push --tags 
  1. 創(chuàng)建podspec配置文件

pod spec create Name

自動生成Name.podspec文件

Pod::Spec.new do |s|
  s.name         = "iOS_Category"
  s.version      = "0.1.2"
  s.summary      = "all kinds of categories for iOS develop"
  s.description  = <<-DESC
                      this project provide all kinds of categories for iOS developer 
                   DESC
  s.homepage     = "https://github.com/sevenuncler/iOS_Category"
  s.license      = "MIT"
  s.license      = { :type => "MIT", :file => "LICENSE" }
  s.author             = { "fanghe" => "fanghe@xxx.com" }
  s.platform     = :ios
  s.source       = { :git => "https://github.com/fanghe/iOS_Category.git"宁赤, :tag => "0.0.1" }
  s.source_files  = "Classes"舀透, "iOS_Category/Classes/**/*.{h,m}"
  s.exclude_files = "Classes/Exclude"
  s.public_header_files = "iOS_Category/Classes/UIKit/UI_Categories.h"决左,"iOS_Category/Classes/Foundation/Foundation_Category.h"愕够,"iOS_Category/Classes/**/*.h"
  s.requires_arc = true
end
  1. 驗(yàn)證文件

pod lib lint

任何的編譯錯誤、警告佛猛、源文件找不到惑芭、podspec文件缺少一些必須的配置項(xiàng)都會驗(yàn)證失敗继找;

如果有警告

$ pod lib lint --allow-warnings

如果有錯誤可以添加--verbose查看具體的錯誤信息

$ pod lib lint --verbose

驗(yàn)證通過:


pod lib lint
pod lib lint
  1. pod trunk上傳到庫配置文件到遠(yuǎn)程Cocoapods倉庫

$ pod trunk register orta@cocoapods.org 'Orta Therox' --description='macbook pro'

首先需要使用個人郵箱注冊一個賬號遂跟,在本地設(shè)備上建立一個session,不需要密碼婴渡,根據(jù)當(dāng)前注冊設(shè)備自動提供session令牌漩勤。

$ pod trunk push Name.podspec

驗(yàn)證遠(yuǎn)程倉庫,成功之后將.podspec文件推送到Cocoapods官方庫缩搅,這個過程比較耗時間越败;

pod push
pod push
  1. 查看自己的庫是否添加成功

$ pod search SUAdvancedPlayer

pod search失敗
pod search失敗

找不到自己寫的
rm ~/Library/Caches/CocoaPods/search_index.json

再次輸入

$ pod search SUAdvancePlayer

pod search
pod search

參考鏈接

http://www.reibang.com/p/a1d2d148fdd3

http://blog.jobbole.com/53365/

https://guides.cocoapods.org/syntax/podfile.html#group_target_configuration

http://www.reibang.com/p/8af475c4f717

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市硼瓣,隨后出現(xiàn)的幾起案子究飞,更是在濱河造成了極大的恐慌,老刑警劉巖堂鲤,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亿傅,死亡現(xiàn)場離奇詭異,居然都是意外死亡瘟栖,警方通過查閱死者的電腦和手機(jī)葵擎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來半哟,“玉大人酬滤,你說我怎么就攤上這事签餐。” “怎么了盯串?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵氯檐,是天一觀的道長。 經(jīng)常有香客問我体捏,道長冠摄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任几缭,我火速辦了婚禮河泳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘年栓。我一直安慰自己乔询,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布韵洋。 她就那樣靜靜地躺著,像睡著了一般黄锤。 火紅的嫁衣襯著肌膚如雪搪缨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天鸵熟,我揣著相機(jī)與錄音副编,去河邊找鬼。 笑死流强,一個胖子當(dāng)著我的面吹牛痹届,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播打月,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼队腐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奏篙?” 一聲冷哼從身側(cè)響起柴淘,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秘通,沒想到半個月后为严,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肺稀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年第股,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片话原。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡夕吻,死狀恐怖诲锹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梭冠,我是刑警寧澤辕狰,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站控漠,受9級特大地震影響蔓倍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盐捷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一偶翅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碉渡,春花似錦聚谁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至习霹,卻和暖如春朵耕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淋叶。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工阎曹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人煞檩。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓处嫌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親斟湃。 傳聞我的和親對象是個殘疾皇子熏迹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 項(xiàng)目組件化、平臺化是技術(shù)公司的共同目標(biāo)凝赛,越來越多的技術(shù)公司推崇使用pod管理第三方庫以及私有組件癣缅,一方面使項(xiàng)目架構(gòu)...
    swu_luo閱讀 21,600評論 0 39
  • Ruby 安裝 要安裝cocospods 首先需要安裝ruby,可以先安裝xcode哄酝,再安裝macport 友存,最后...
    山天大畜閱讀 1,846評論 0 1
  • 一. CocoaPods的介紹 什么是CocoaPods?CocoaPods是一個負(fù)責(zé)管理iOS項(xiàng)目中第三方開源庫...
    輝712閱讀 3,916評論 0 7
  • CocoaPods 是什么陶衅? CocoaPods 是一個負(fù)責(zé)管理 iOS 項(xiàng)目中第三方開源庫的工具屡立。CocoaPo...
    朝洋閱讀 25,662評論 3 51
  • 今天終于回到了我的小庭院膨俐,心里真舒服勇皇,這兩天天氣不好趁老公在家出去學(xué)習(xí)三天。一個人想重新?lián)Q種活法焚刺,想想容易敛摘,執(zhí)行起...
    心如大海建英閱讀 238評論 1 5