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。
pod
命令时,这个组件都将被激活。该组件包括了所有使用 CocoaPods
涉及到的功能,并且还能通过调用所有其它的 gems
来执行任务。Core
组件提供支持与 CocoaPods
相关文件的处理,文件主要是 Podfile
和 podspecs
。Podfile
是一个文件,用于定义项目所需要使用的第三方库。该文件支持高度定制,你可以根据个人喜好对其做出定制。更多相关信息,请查阅 Podfile
指南。.podspec
也是一个文件,该文件描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework
、编译选项和某个库所需要的依赖等。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 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
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到远端仓库
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
。表示验证通过。
# 如果依赖其他私有源 同样需要加上 --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'
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
在 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 改动原则: