注:因为最近公司需求,本文为参考他人网上资源后进行的尝试,可能与多个网上资源重复
cocoapods的原理
- Pods 项目最终会编译成一个名为 libPods.a 的文件,主项目只需要依赖这个 .a 文件即可。
- 对于资源文件,CocoaPods 提供了一个名为 Pods-resources.sh 的 bash 脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。
- CocoaPods 通过一个名为 Pods.xcconfig 的文件来在编译时设置所有的依赖和参数。
工具依赖
➜ ~ nvm --version
0.31.3
➜ ~ ruby --version
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]
➜ ~ pod --version
1.2.1
➜ ~ git --version
git version 2.11.0 (Apple Git-81)
tip:本文跳过cocoapods安装
查看本地pod 仓库
本地已经有一个master库(安装pod后自动就会存在,官方的目录)
OFToolSpec是后来创建的一个私有库
Type:版本管理工具类型及分枝名
URL:git仓库地址
Path:本地仓库地址(在根目录下.cocoapods下)
➜ ~ pod repo
master
- Type: git (master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/master
OFToolSpec
- Type: git (master)
- URL: https://git.coding.net/one_fools/OFToolRepo.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFToolSpec
2 repos
创建pod lib
在桌面创建PodPrivate文件,然后在终端进入PodPrivate文件并运行命令 pod lib create OFPublicTool
创建私有库模版
➜ ~ cd Desktop
➜ Desktop mkdir PodPrivate
➜ Desktop cd PodPrivate
➜ PodPrivate ls
➜ PodPrivate pod lib create OFPublicTool
以下是配置选择,可以使用默认选项(带有下划线的选项,并且除了Prefix前缀设置,其他的不区分大小写)
- 工程语言
- 是否需要Demo
- 测试框架
- 是否需要view测试
- 工程前缀
//设置使用的语言
What language do you want to use?? [ Swift / ObjC ]
> ObjC
//是否为library创建一个demo工程
Would you like to include a demo application with your library? [ Yes / No ]
>
yes
//使用的单元测试框架(具体请参看下方`单元测试`链接)
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
//使用UITest
Would you like to do view based testing? [ Yes / No ]
> no
//你的项目中类的前缀
What is your class prefix?
> OF
单元测试
然后会在当前目录生成 OFPublicTool
文件夹,并且会在Xcode中自动打开这个项目
注意可能会有一个警告提示
打开
OFPublicTool/Example/OFPublicTool.xcworkspace
工程删除此处的
ReplaceMe.m
文件,在这里创建将要使用私有库管理的文件如下:
然后修改此处的 OFPublicTool.podspec
文件,下面标注必须修改的地方
创建git私有仓库(使用coding)
申请账号后创建Git私有仓库项目
之后需要在页面上获取的信息有
创建pod私有库
把相关的信息修改到 OFPublicTool.podspec
中
以下是我的修改
s.summary = 'My PublicTool.'
s.homepage = 'https://coding.net/u/one_fools/p/OFPublicTool'
s.source = { :git => 'https://git.coding.net/one_fools/OFPublicTool.git', :tag => s.version.to_s }
之后进入 Example
目录使用 pod update
命令
➜ Example git:(master) ✗ pod update
发现有报错信息 The validator for Swift projects uses Swift 3.0 by default...
不过上面有写到
echo "2.3" > .swift-version
继续使用此命令,然后再来一次
➜ Example git:(master) ✗ echo "2.3" > .swift-version
➜ Example git:(master) ✗ pod update
安装成功后发现下面的警告并没有消失(暂时不管)
对项目进行 command + B
构建一次应该会成功,然后在项目中 OFViewController.m
中引入
#import "OFPublicTool.h"
并对项目再次进行 command + B
构建,若成功,说明 OFPublicTool.podspec
中的source_files路径是正确的
若是报错无法找到文件:
接下来用pod的命令检查一下此文件下的lib。
后退到podspec文件存在的目录下
➜ OFPublicTool git:(master) ✗ pod lib lint
-> OFPublicTool (0.1.0)
OFPublicTool passed validation.
如果出现此处提示说明检查通过
用 pod spec lint
命令检查一下远程的lib,现在没有提交到git私有仓库,一定会报错的
➜ OFPublicTool git:(master) ✗ pod spec lint
-> OFPublicTool (0.1.0)
- ERROR | [iOS] unknown: Encountered an unknown error ([!] /usr/bin/git clone https://git.coding.net/one_fools/OFPublicTool.git /var/folders/dr/688z508n1fb2m9bh9kqs5_ch0000gn/T/d20170520-7169-ee52z2 --template= --single-branch --depth 1 --branch 0.1.0
Cloning into '/var/folders/dr/688z508n1fb2m9bh9kqs5_ch0000gn/T/d20170520-7169-ee52z2'...
fatal: Remote branch 0.1.0 not found in upstream origin
) during validation.
Analyzed 1 podspec.
[!] The spec did not pass validation, due to 1 error.
发现报了一个错误,需要一个tag 0.1.0,下面将本地文件提交到git私有仓库并打一个0.1.0的tag
➜ OFPublicTool git:(master) ✗ git add .
➜ OFPublicTool git:(master) ✗ git commit -m"first commit"
➜ OFPublicTool git:(master) git remote add origin https://git.coding.net/one_fools/OFPublicTool.git
➜ OFPublicTool git:(master) git push origin master
➜ OFPublicTool git:(master) git tag -m"tag 0.1.0" 0.1.0
➜ OFPublicTool git:(master) git push --tags
git操作不再细述
上传成功之后再次用 pod spec lint
命令检查一下远程的lib
➜ OFPublicTool git:(master) pod spec lint
-> OFPublicTool (0.1.0)
Analyzed 1 podspec.
OFPublicTool.podspec passed validation.
➜ OFPublicTool git:(master)
发现通过检查,这时候可以去私有仓库看一下会发现已经上传成功了
本地测试podspec文件
我们可以创建一个新的项目,在这个项目的Podfile文件中直接指定刚才创建编辑好的podspec文件,看是否可用。 在Podfile中我们可以这样编辑,有两种方式
platform :ios, '8.0'
target 'XDTestPod' do
pod 'OFPublicTool', :path => '~/.cocoapods/repos/OFPublicToolSpec' #指定路径
pod 'OFPublicTool', :podspec => '~/.cocoapods/repos/OFPublicToolSpec/OFPublicTool.podspec' #指定podspec文件
end
然后执行pod install命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了,不过它们并没有在Pods目录下,而是跟测试项目一样存在于Development Pods/PodTestLibrary中,这是因为我们是在本地测试,而没有把podspec文件添加到Spec Repo中的缘故。
向Spec Repo提交podspec
但是现在还没完,接下来我们把podspec文件上传的我们自己的spec仓库里,而不是cocoapods的仓库。
下面我们创建本地仓库并把这个podspec文件上传进去
➜ OFPublicTool git:(master) pod repo
➜ OFPublicTool git:(master) pod repo add OFPublicToolSpec https://git.coding.net/one_fools/OFPublicTool.git
➜ OFPublicTool git:(master) pod repo
master
- Type: git (master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/master
OFPublicToolSpec
- Type: git (tags/0.1.0^0)
- URL: https://git.coding.net/one_fools/OFPublicTool.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFPublicToolSpec
OFToolSpec
- Type: git (master)
- URL: https://git.coding.net/one_fools/OFToolRepo.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFToolSpec
3 repos
然后上传
➜ OFPublicTool git:(master) pod repo push OFPublicToolSpec OFPublicTool.podspec
Validating spec
-> OFPublicTool (0.1.0)
Updating the `OFPublicToolSpec' repo
Already up-to-date.
Adding the spec to the `OFPublicToolSpec' repo
- [Update] OFPublicTool (0.1.0)
Pushing the `OFPublicToolSpec' repo
To https://git.coding.net/one_fools/OFPublicTool.git
8632a92..98f3d44 master -> master
上传成功
最后检验
➜ OFPublicTool git:(master) pod search OFPublicTool
Creating search index for spec repo 'OFPublicToolSpec'.. Done!
[!] Unable to find a pod with name, author, summary, or description matching `OFPublicTool`
发现报错,这是因为search index中缓存没有清理,再次搜索会等待一段时间
➜ OFPublicTool git:(master) rm ~/Library/Caches/CocoaPods/search_index.json
➜ OFPublicTool git:(master) pod search OFPublicTool
添加到Cocoapods的官方库
添加到Cocoapods的官方库,可以使用trunk工具,具体可以查看官方文档。
pod trunk register 631292061@qq.com 'Ec631292' ---verbose #注册trunk,邮箱以及用户名请使用大家自己的。执行这个语句后,你的邮箱将会受到一封带有验证链接的邮件,如果没有请去垃圾箱找找,有可能被屏蔽了。点击邮件的链接就完成了trunk注册流程。
pod trunk me #如果终端显示了你的用户名和昵称,则说明注册成功。
pod trunk push OFPublicTool.podspec #通过trunk上传你的podspec文件,要cd到podspec文件所在目录执行
最后在一个新项目里引入使用,测试是否ok,只需要在项目的Podfile里增加以下一行代码即可
pod 'OFPublicTool', '~> 0.1.0'
注:每当你向Pod中添加了新的文件或者以后更新了podspec的版本都需要重新执行一遍pod update命令。
更新维护podspec
Pod::Spec.new do |s|
s.name = 'OFPublicTool'
s.version = '0.1.3'
s.summary = 'My PublicTool.'
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://coding.net/u/one_fools/p/OFPublicTool'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'ECwlf' => '631292061@qq.com' }
s.source = { :git => 'https://git.coding.net/one_fools/OFPublicTool.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '8.0'
s.subspec 'iCarousel' do |iCarousel|
iCarousel.source_files = 'XDLibrary/Classes/iCarousel/**/*'
iCarousel.public_header_files = 'XDLibrary/Classes/iCarousel/**/*.h'
end
s.subspec 'XDProgress' do |progress|
progress.source_files = 'XDLibrary/Classes/XDProgress/**/*'
progress.public_header_files = 'XDLibrary/Classes/XDProgress/**/*.h'
progress.dependency 'MBProgressHUD', '~> 1.0.0'
end
# s.source_files = 'XDLibrary/Classes/**/*'
# s.resource_bundles = {
# 'XDLibrary' => ['XDLibrary/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 2.3'
end
因为我们创建了subspec所以项目整体的依赖dependency,源文件source_files,头文件public_header_files,资源文件resource等都移动到了各自的subspec中,每个subspec之间也可以有相互的依赖关系,比如XDProgress依赖于MBProgressHUD。不同的子模块之间还能互相依赖。
编辑完成之后,在测试项目里pod update一下,几个子项目都被加进项目工程了,写代码验证无误之后,就可以将这个工程push到远端仓库,并打上新的tag->1.0.0。
最后再次使用pod lib lint验证编辑好的podsepc文件,没有自身的WARNING或者ERROR之后,就可以再次提交到Spec Repo中了,命令跟之前是一样的
pod repo push OFPublicToolSpec OFPublicTool.podspec
之后再次到~/.cocoapods/repos/OFPublicToolSpec目录下查看已经有两个版本了。
最后介绍一下如何删除一个私有Spec Repo,只需要执行一条命令即可
pod repo remove OFPublicToolSpec
这样这个Spec Repo就在本地删除了,我们还可以通过
pod repo add OFPublicToolSpec https://git.coding.net/one_fools/OFPublicTool.git
再把它给加回来。
如果我们要删除私有Spec Repo下的某一个podspec怎么操作呢,此时无需借助Cocoapods,只需要cd到~/.cocoapods/repos/OFPublicToolSpec目录下,删掉库目录,然后在将Git的变动push到远端仓库即可.