使用CocoaPods管理私有库

2017-01-14 15:49:55来源:http://www.jianshu.com/p/e7e706a0ea35作者:周焕强人点击

第七城市

到新公司两个月,公司项目就开始转型,以至于需要将原来的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文件夹。



屏幕快照 2016-10-24 15.32.10.png
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" => "461416254@qq.com" } #作者
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


屏幕快照 2016-10-25 13.17.32.png

(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里面下载示例代码作为参考。
代码下载地址




第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台