CocoaPods 使用总结

CocoaPods简介

CocoaPods 是专门为 iOS 工程提供第三方依赖库的管理工具,通过 CocoaPods,我们可以更方便地管理每个第三方库的版本,而且不需要我们做太多的配置,就可以直观、集中和自动化地管理我们项目的第三方库。

CocoaPods 将所有依赖的库都放在一个名为 Pods 的项目下,然后让主项目依赖 Pods 项目。然后,我们编码工作都从主项目转移到 Pods 项目。Pods 项目最终会编译为一个 libPod-项目名.a 静态库,主项目依赖于这个静态库。

对于资源文件,CocoaPods 提供了一个名为 Pods-resources.shbash 脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。CocoaPods 通过一个名为 Pods.xcconfig 的文件来在编译时设置所有的依赖和参数。CocoaPods 是用 Ruby 写的,并由若干个 Ruby 包 (gems) 构成的。在解析整合过程中,最重要的几个 gems 分别是: CocoaPods/CocoaPodsCocoaPods/CoreCocoaPods/Xcodeproj

CocoaPod的核心组件

  • CocoaPods/CocoaPod
    这是一个面向用户的组件,每当执行一个 pod 命令时,这个组件都将被激活。该组件包括了所有使用 CocoaPods 涉及到的功能,并且还能通过调用所有其它的 gems 来执行任务。
  • CocoaPods/Core
    Core 组件提供支持与 CocoaPods 相关文件的处理,文件主要是 Podfilepodspecs
  • Podfile
    Podfile 是一个文件,用于定义项目所需要使用的第三方库。该文件支持高度定制,你可以根据个人喜好对其做出定制。更多相关信息,请查阅 Podfile 指南。
  • Podspec
    .podspec 也是一个文件,该文件描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework、编译选项和某个库所需要的依赖等。
  • CocoaPods/Xcodeproj
    这个 gem 组件负责所有工程文件的整合。它能够创建并修改 .xcodeproj.xcworkspace 文件。它也可以作为单独的一个 gem 包使用。如果你想要写一个脚本来方便地修改工程文件,那么可以使用这个 gem

私有库开发流程

一般公司都会搭建自己的 git 服务器,在实战项目中,经常使用 Cocoapods 管理自己的私有库。

  • git 仓库至少需要两个,一个用于管理私有库对应版本的 podspec 文件,一个用于存放私有库的源文件。
  • 查看现有的 podspec 源地址:
cd ~/.cocoapods/repos

创建一个私有的 podspec 主要包括如下几步:

  • 创建一个私有的 Spec Repo,用于管理私有库对应版本的 podspec 文件;
  • 创建 pod 私有库所需要的项目工程文件,并上传到私有库;
  • 创建 pod 所对应的 podspec 文件,并进行验证/测试;
  • 向私有的 Spec Repo 中提交 podspec
  • 使用 pod 库;

创建一个私有的 Spec Repo

  • 在自己公司的 git 服务器上创建 SpecsRepo 仓库;
  • 将私有 SpecsRepo 关联到本地;
pod repo add IMXSpecsRepo http://192.168.120.32/app/sisi-iOS/IMXSpecsRepo.git

查看 SpecsRepo 是否创建成功

cd ~/.cocoapods/repos

创建 pod 私有库所需要的项目工程

命令行创建

pod lib create 仓库名字 --template-url=http://192.168.120.32/app/sisi-iOS/IMXPodTemplte

手动创建

手动创建 Xcode 工程项目,创建 podspec 文件

pod spec create XXXX.podspec

修改 podspec 文件

Pod::Spec.new do |s|
  s.name             = 'AKCBrowser'
  s.version          = '0.0.1'
  s.summary          = 'A short description of AKCBrowser.'

  # This description is used to generate tags and improve search results.
  #   * Think: What does it do? Why did you write it? What is the focus?
  #   * Try to keep it short, snappy and to the point.
  #   * Write the description between the DESC delimiters below.
  #   * Finally, don't worry about the indent, CocoaPods strips it!

  s.description      = <<-DESC
  TODO: Add long description of the pod here.
  DESC

  s.homepage         = 'http://192.168.120.32/app/akc-framework-ios/AKCBrowser.git'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'sunjinshuai' => 's_mike@163.com' }
  s.source           = { :git => 'http://192.168.120.32/app/akc-framework-ios/AKCBrowser.git', :tag => s.version.to_s }

  s.static_framework      = true
  s.requires_arc = true
  s.frameworks = 'UIKit', 'Foundation'
  s.ios.deployment_target = '8.0'
  s.xcconfig = {
    'GCC_PREPROCESSOR_DEFINITIONS' => 'MAS_SHORTHAND_GLOBALS=1'
  }
  s.resource_bundles = {
    'Browser' => ['AKCBrowser/Assets/Browser/*.*']
  }
  s.source_files = 'AKCBrowser/Classes/**/*'

  s.dependency 'SDWebImage','4.2.3'
  s.dependency 'YYImage'
  s.dependency 'AKCFoundation'
  s.dependency 'AFNetworking/Reachability'
  s.dependency 'SVProgressHUD'
  s.dependency 'AKCLog'

end

podspec 语法简介

s.name:私有库的名称,`pod search`搜索的关键词,注意这里一定要和`.podspec`的名称一样,否则报错。
s.version:私有库的版本。
s.ios.deployment_target:支持的pod最低版本。
s.summary:私有库简介。
s.description:私有库详细介绍。
s.homepage:私有库在GitHub上的地址。
s.license:开源协议。
s.author:作者。
s.social_media_url:社交网址,你的podspec发布成功后会@你
s.source:私有库在GitHub上的地址和版本号。
s.source_files:私有库对外共享的.h和.m文件。
s.requires_arc:是否支持ARC。

更多语法查看(http://guides.cocoapods.org/making/specs-and-specs-repo.html)

上传项目工程的源文件

git add -A
git commit -m "first commit"
git remote add origin http://192.168.120.32/app/akc-framework-ios/AKCBrowser.git
git push -u origin master
git tag -m "first release" 0.0.1
git push --tags     #推送tag到远端仓库

验证 podspec 文件

pod lib lint --allow-warnings --verbose
pod lib lint --use-libraries --allow-warnings   // 使用静态库后的用法
pod lib lint --sources=http://192.168.120.32/app/sisi-iOS/IMXSpecsRepo.git

当看到 AKCBrowser passed validation。表示验证通过。

向 Spec Repo 中提交 podspec 文件

# 如果依赖其他私有源 同样需要加上 --sources 参数
pod repo push IMXSpecsRepo AKCFoundation.podspec --allow-warnings
pod repo push IMXSpecsRepo AKCProtobuf.podspec --allow-warnings --use-libraries  // 使用静态库后的用法

pod repo push IMXSpecsRepo AKCFoundation.podspec --allow-warnings --sources='http://192.168.120.32/ddcang/iOSGiftBox/SpecsRepo.git'

多 target 时 Podfile 该如何写

platform :ios, '8.0'

def commonPods #通用pods集
    pod 'AFNetworking', '~> 2.0'
    pod 'Masonry'
end

def appOnlyPods #app专用pods集
    pod 'MBProgressHUD'
end

def extensionPods #扩展专用pods集
    pod 'GTSDKExtension'
end

target :TestCocoaPods do
    commonPods
    appOnlyPods

    target :TestCocoaPodsTests do
    inherit! :search_paths
    # Pods for testing
    end

    target :TestCocoaPodsUITests do
        inherit! :search_paths
        # Pods for testing
    end
end

target :SecondTarget do
    commonPods
end

如何忽略Pods警告

Podfile 中对应的 target 或分组下加上关键字 inhibit_all_warnings即可。

如何直接引用第三方库中的头文件

在用 CocoaPods 集成第三方库之后,默认情况下,我们需要使用类似 #import <XXX/YYY.h>的方式引入第三方库的头文件。

可以在 Build Settings -> User Header Search Paths 中添加 ${SRCROOT} 并设置成 recursive,这样我们就可以直接使用 #impot "YYY.h"这种方式了。

pod install 和 pod update 的选择

pod install:

按照官方文档所说,pod install在第一次检索集成第三方以及每一次在 Podfile 中新增、更改或删除 pod 的时候使用。每一次执行 pod install命令,它都会下载安装新的 pod,并且会把每一个安装的 pod 的版本信息写入 Podfile.lock 文件。Podfile.lock 文件跟踪每一个安装的 pod 的版本并且上锁。每一次执行 pod install命令,只解决还没有在 Podfile.lock 中列出的依赖:对于已在 Podfile.lock 中列出的 pod,会下载指定的版本,不会检查是否有新版本。对于没有在 Podfile.lock 中列出的 pod,它会搜索并安装 Podfile 中指定的版本。

pod update:

直接执行 pod update命令会检查安装 Podfile 中列出的所有 pod 的最新版本。只有当你想要更新 pod 库的版本时才使用 pod update;它不管 Podfile.lock是否存在,都会读取 Podfile 文件的最新版本,下载好之后,重新生成 Podfile.lock文件。

两者的区别:

  • pod install命令来安装新的 pod,每次在 Podfile 中新增和删除 pod 都使用 pod install命令。

  • Podfile 中添加新的 pod 后应该用 pod install命令,而不是 pod update命令。通过 pod install命令安装新的 pod 而不用担心在同一进程中修改已有的 pod

  • pod update命令仅用在更新指定 pod 到指定版本或者更新所有 pod

如果想更新指定的 pod 仓库,可以使用

pod update XXX –no-repo-update

如果想安装新添加的库

pod install –no-repo-update

当需要在 CocoaPods 中删除一个我们不要的库时 可以在 Podfile 中直接删除相关库;

pod update --no-repo-update 会在删除相关库时 更新其他库版本
pod update XXX --no-repo-update 只会删除相关库 和下方一致
pod install --no-repo-update 只会删除相关库

关于版本指定约束

一般我们在使用 cocoapods 导入第三方库前都会生成一个 podfile 文件,文件中记录着我们要导入的第三方库以及对应的版本信息,比如:

pod 'SDWebImage', '~> 4.3.2'

cocoapods 导入 SDWbImage,版本号 4.3.2 和版本号处于 4.3.2-4.4 之间的,不包括 4.4 和更高版本。

pod 'SDWebImage' --- 不指定版本,表示希望使用最新版本
pod 'SDWebImage', '4.3.2' --- 指定明确版本,表示只想要这个版本
逻辑关系
'> 0.1' --- 版本号大于0.1的
'>= 0.1' --- 版本0.1和版本号大于0.1的
'< 0.1' --- 版本号小于0.1的
'<= 0.1' --- 版本号0.1和版本号小于0.1的
最优匹配
'~> 0.1.2' --- 版本0.1.2和版本号处于0.1.2-0.2之间的,不包括0.2和更高版本
'~> 0.1' --- 版本0.1和版本号处于0.1-1.0之间的,不包括1.0和更高版本
'~> 0' --- 版本0和更高,和没设没啥区

tag 改动原则:

  • 增加 api,修改第三位;
  • 修改 api,修改第二位;
  • 大版本变更修改第一位;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容