使用CocoaPods管理私有库

到新公司两个月,公司项目就开始转型,以至于需要将原来的App重写一遍,只有其中的一个通信模块是可以复用的,但这个模块跟原有项目的耦合性太强。为了将来在其他项目中也能使用这个模块,我们决定将这个模块进行剥离,用CocoaPods进行管理。这里就涉及到了使用CocoaPods管理私有库,这也是App组件化的第一步。今天我们就一个简单例子讲解私有库的创建过程。里面的注意事项都是我这段时间所遇到的问题,还挺折腾人的。

我们现在要将以下工程的MyPrivateLib文件夹用cocoapods管理。注意,这个工程一定要对应一个远程的git仓库。

使用CocoaPods管理私有库_第1张图片

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文件夹。

使用CocoaPods管理私有库_第2张图片
屏幕快照 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" => "[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
使用CocoaPods管理私有库_第3张图片
屏幕快照 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里面下载示例代码作为参考。
代码下载地址

你可能感兴趣的:(使用CocoaPods管理私有库)