CocoaPods简介
CocoaPods
是专门为 iOS
工程提供第三方依赖库的管理工具,通过 CocoaPods
,我们可以更方便地管理每个第三方库的版本,而且不需要我们做太多的配置,就可以直观、集中和自动化地管理我们项目的第三方库。
CocoaPods
将所有依赖的库都放在一个名为 Pods
的项目下,然后让主项目依赖 Pods
项目。然后,我们编码工作都从主项目转移到 Pods
项目。Pods
项目最终会编译为一个 libPod-项目名.a
静态库,主项目依赖于这个静态库。
对于资源文件,CocoaPods
提供了一个名为 Pods-resources.sh
的 bash
脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。CocoaPods
通过一个名为 Pods.xcconfig
的文件来在编译时设置所有的依赖和参数。CocoaPods
是用 Ruby
写的,并由若干个 Ruby
包 (gems) 构成的。在解析整合过程中,最重要的几个 gems
分别是: CocoaPods/CocoaPods、CocoaPods/Core 和 CocoaPods/Xcodeproj。
CocoaPod的核心组件
- CocoaPods/CocoaPod
这是一个面向用户的组件,每当执行一个pod
命令时,这个组件都将被激活。该组件包括了所有使用CocoaPods
涉及到的功能,并且还能通过调用所有其它的gems
来执行任务。 - CocoaPods/Core
Core
组件提供支持与CocoaPods
相关文件的处理,文件主要是Podfile
和podspecs
。 - 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,修改第二位;
- 大版本变更修改第一位;