到新公司两个月,公司项目就开始转型,以至于需要将原来的App重写一遍,只有其中的一个通信模块是可以复用的,但这个模块跟原有项目的耦合性太强。为了将来在其他项目中也能使用这个模块,我们决定将这个模块进行剥离,用CocoaPods进行管理。这里就涉及到了使用CocoaPods管理私有库,这也是App组件化的第一步。今天我们就一个简单例子讲解私有库的创建过程。里面的注意事项都是我这段时间所遇到的问题,还挺折腾人的。
我们现在要将以下工程的MyPrivateLib文件夹用cocoapods管理。注意,这个工程一定要对应一个远程的git仓库。
1.创建私有的Spec Repo
Spec Repo是cocoapods库的索引,所有库都在这里面,它实际上是一个git仓库,对应于本地的路径是~/.cocoapods/repos/,执行pod search 方法的时候,实际上就是在这个路径下面搜索的,~/.cocoapods/repos/master是cocoapods官方的Spec Repo,里面包含了几十万个库的索引,我们执行pod setup的时候实际上就是将官方的Spec Repo克隆到~/.cocoapods/repos/master下面。
所以我们现在也创建一个私有的git仓库,作为我们的Spec Repo,这里我使用Coding创建了一个git仓库。然后将这个git仓库添加到本地。
$ pod repo add MySpecs https://git.coding.net/zhq1992/CustomSpecRepo.git
MySpecs是本地的Spec Repo,名字可以随意修改
这时候就能在~/.cocoapods/repos/ 下看到MySpecs文件夹。
2.创建PodSpec文件
PodSpec或者说Spec描述了Pod库的版本,一个Pod可以有很多的spec,它包含了这个库的源代码获取地址,使用哪些文件,还有版本,描述等信息。podspec文件可以手动创建,也可以使用pod spec create
创建。
cd 到工程目录下
pod spec create PrivateSpecDemo
用Xcode打开PrivateSpecDemo.podspec文件,会出现100多行的默认配置和注释,我们将其全部删除,然后添加自己需要的配置。下面是一个podspec文件的样例。
Pod::Spec.new do |s|
s.name = "PrivateSpecDemo" #私有库的名称
s.version = "0.0.2" #版本号
s.summary = "私有库demo" #简介
s.description = <<-DESC #描述
一个cocoapods管理私有库的样例
DESC
s.homepage = "https://coding.net/u/zhq1992/p/PrivateSpecDemo" #项目主页,不是git地址
s.license = { :type => "MIT", :file => "README.md" } #开源协议,填MIT即可,文件选Readme.md
s.author = { "zhouhuanqiang" => "[email protected]" } #作者
s.platform = :ios, "8.0" #支持的平台和版本号
s.source = { :git => "https://git.coding.net/zhq1992/PrivateSpecDemo.git", :tag => "#{s.version}" } #库的git地址,以及tag号,tag号一般直接用版本号
s.source_files = 'PrivateSpecDemo/PrivateSpecDemo/MyPrivateLib/**/*.{h,m}' #库的源文件路径
s.resources = 'PrivateSpecDemo/PrivateSpecDemo/MyPrivateLib/MyPrivateLibResouce.bundle' #资源文件地址,资源文件最好用bundle管理,注意xib文件也是资源文件,私有库中如果有xib,需要先编译成nib文件,再放进bundle中
s.requires_arc = true #是否需要ARC支持
#s.dependency "SDWebImage" #如果依赖其他第三方库,在这里添加,可以添加多个
#s.dependency "MyCustomLib" #也可以引用其他的私有库,但是在验证的时候要加上这个私有库的地址
end
3.验证PodSpec文件
执行以下验证命令
$ pod lib lint
成功的话会提示
-> PrivateSpecDemo (0.0.1)
PrivateSpecDemo passed validation.
注意:
(1)如果引用了静态库文件,需要在pod lib lint 后面加上--use-libraries
pod lib lint --use-libraries
(2)如果引用了其他的私有库,那么需要加上另一个私有库的地址进行验证
pod lib lint --sources=https://git.coding.net/zhq1992/zhqSpecs.git,master --use-libraries
(3)执行 pod lib lint XXX 验证podspec的时候如果报错 ,记得加上 --verbose(pod lib lint XXX --verbose) 看看报错的具体原因。
(4)如果报错 xcodebuild: error: 'App.xcworkspace' does not exist, CocoaPods需要升级到最新的 1.1.1 ,CocoaPods安装流程可以查看我的上一篇文章。
(5)升级Xcode8之后,如果出现
- ERROR | [iOS] unknown: Encountered an unknown error (Must be in the root of the repo (/Users/zhouhuanqiang/.cocoapods/repos/master), instead in /Users/zhouhuanqiang/Desktop/IM.) during validation.
原因是xcode8路径改了,执行以下命令即可解决
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
(6)pod lib lint --quick 命令可以不编译源文件。
4.测试podspec文件
在测试之前,首要要确保工程已经上传到远程仓库了,而且打了tag。
git add .
git commit -m "first release"
git push origin master
git tag -m "first relase" "0.0.1"
git push --tags 或 git push origin 0.0.1
在测试工程下创建Podfile文件,然后pod install
platform:ios,'8.0'
target 'testRepo' do
pod 'PrivateSpecDemo', :podspec => '/Users/zhouhuanqiang/Desktop/PrivateSpecDemo/PrivateSpecDemo.podspec' #指定podspec文件
end
注意
(1)编译工程如果遇到Unable to run command 'StripNIB MyCustomView.nib' - this target might include its own product.这种错误,说明没有将xib文件加到s.resource中。但是直接将xib拖进bundle还是无法读取的,需要先将xib文件编译成nib文件,再放进bundle中。
$ ibtool --errors --warnings --output-format human-readable-text --compile MyCustomView.nib MyCustomView.xib
(2)读取bundle文件不能像平时一样用[NSBundle mainBundle],应该通过如下代码。
// 获取bundle
NSBundle *resourceBundle = [NSBundle bundleWithPath:[[NSBundle bundleForClass:[self class]] pathForResource:@"MyPrivateLibResouce" ofType:@"bundle"]];
self = [[resourceBundle loadNibNamed:@"MyCustomView"
owner:self
options:nil] firstObject];
// 有@2x的图片记得加上@2x
self.picView.image = [UIImage imageWithContentsOfFile:[resourceBundle pathForResource:@"loading@2x" ofType:@"png"]];
5.向Spec Repo提交podspec
pod repo push MySpecs PrivateSpecDemo.podspec
如果有静态库也需要加上--use-libraries
6.使用私有库
Podfile要加上远程Spec Repo的地址
source 'https://git.coding.net/zhq1992/CustomSpecRepo.git'
platform:ios,'8.0'
target 'testRepo' do
pod 'PrivateSpecDemo'
end
7.更新私有库
私有库有更新时,只要更新一下代码和podspec文件的版本号即可,重复上述步骤。然后在测试工程里pod update (库名)
如果有需要的话,可以去我的github里面下载示例代码作为参考。
代码下载地址