CocoaPods创建私有pod库(踩坑篇)

这篇主要说说我在私有库创建与更新的过程中遇到的一些坑。

讲解制作三方库,其实纯属经验之谈,你没有实际做过肯定是不会做的。感觉做这些多半都是体力劳动,类似的还有一些,比如:利用Jenkins实现持续集成,苹果证书的一系列操作等,只要按照模板或者官方套路来就行了,当然如果能理解其内部原理最好,不理解也没关系。这和写代码的逻辑思维不同。记录这些,只是为了以后方便填坑,不想记住这些琐碎的命令和步骤。。。

下面开始说正题了:

先附上.podspec文件的主要内容:

Pod::Spec.new do |s|
  s.name             = 'XGCommonView'
  s.version          = '0.0.1'
  s.summary          = 'Some common views.'
  s.homepage         = 'http://git.ops.com/XGN-IOS/XGCommonView'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'username' => 'email' }
  s.source           = { :git => 'http://git.ops.com/XGN-IOS/XGCommonView.git', :tag => s.version.to_s }
  s.ios.deployment_target = '8.0'
  s.source_files = 'XGCommonView/Classes/**/*'
  s.dependency 'Masonry'
  s.dependency 'MBProgressHUD'
  s.dependency 'XGBaseComponent'
@end

1.创建库的过程中遇到的一些坑

1.1 私有库依赖其他第三方库

a.如果依赖的库是公有库,就直接在.podspec文件里写上库名就可以了

s.dependency '第三方库名'

b.如果依赖的库是私有库,只在.podspec文件里加上库名是不够的,会报“ERROR…xxx file not found”的错,意思就是找不到相关库的某个文件,需要在私有库工程里的Podfile文件里添加私有库的引用源,如下:

source 'http://git.ops.com/XGN-IOS/xgn.git'

需要注意的一点:添加的这个引用源不是所依赖的库的源,而是所依赖的库所在仓库的源,就是存放这个库的容器的地址,二者不要混淆,否则添加的源不对也会导致依赖失败。

c.如果依赖的库是某个库的静态库,也就是framework,则需要在.podspec文件中的添加依赖前进行指明,这种情况是我在使用高德地图相关功能时遇到的,地图包里面都是framework,如下:

s.static_framework = true

s.dependency 'AMap3DMap-NO-IDFA'
s.dependency 'AMapFoundation-NO-IDFA'
s.dependency 'AMapLocation-NO-IDFA'
s.dependency 'AMapNavi-NO-IDFA'
s.dependency 'AMapSearch-NO-IDFA'

这样就指明了依赖的库里面包含有静态库,否则就会报工程无法找到包含的静态库的错误,如下图:

1.2 验证.podspec文件

有无依赖其他第三方库时输入的验证命令是有区别的,大致分为以下几种情况:

a.不依赖任何第三方库

pod lib lint XGCommonView.podspec --allow-warnings --no-clean

b.依赖了第三方静态库

pod lib lint XGCommonView.podspec --use-libraries --allow-warnings --no-clean

c.依赖了第三方非静态私有库

pod lib lint XGCommonView.podspec --sources='http://git.ops.com/XGN-IOS/xgn.git,https://github.com/CocoaPods/Specs.git'  --allow-warnings --no-clean

d.同时依赖了第三方静态库和第三方非静态私有库

pod lib lint XGCommonView.podspec --sources='http://git.ops.com/XGN-IOS/xgn.git,https://github.com/CocoaPods/Specs.git' --use-libraries --allow-warnings --no-clean

所以要根据不同的依赖情况选择对应的验证命令,但push命令都是相同的,如下:

pod repo push ops-xgn-ios-xgn XGCommonView.podspec --allow-warnings

1.3 私有库中的文件引用依赖的第三方库文件时,OC的import的使用方式也不是千篇一律的,大致分为以下几种情况:

a.引用单个文件,这是最简单也是最常见的方式

#import “文件名.h”,如:#import “Person.h”,

b.引用某个库中的文件,这也是比较常见的方式

#import <库名/xxx.h>,如:#import <SDWebImage/UIImageView+WebCache.h>

c.引用某个库中的文件,不太常见的方式

#import <库名.h>,如:#import <Masonry.h>

d.引用某个库中的文件,不太常见的方式

#import "文件名.h",如:#import "MBProgressHUD.h"

之所以有这么多的导入方式,和该库的配置有关,也就是暴露给外界使用的入口不同。如果import的使用不对,也同样会报“ERROR…xxx file not found”的错,只要使用正确的import方式就可以解决问题。

2.更新库的过程中遇到的一些坑

如果你的库的创建,初始化,验证等都没问题或者问题都已经解决掉了,那么离制作成功也就差最后一步了,就是发布。是不是很激动,不要太乐观了,因为更多的坑在等着你呢,如果你的库比较单纯还好,若是依赖太多,或者太炫酷的话,那未知的错误很有可能接踵而至。其实也没啥,只要细心且姿势正确就行,没啥解决不了的技术问题,毕竟软件这东西归根结底是人写的嘛~

前提:只要更新了代码,就要打一次tag,tag号要大于上一次的,还要在.podspec文件里对应的修改版本号,要保持一致。

2.1 push失败,提示“Could not find remote branch 版本号 to clone.”

导致这个错误的原因是打tag时写的版本号与.podspec文件里的版本号不一致,更正下版本号重新打tag就行了。

2.2 push失败,提示“The repo … at … is not clean”,如下图:

意思就是你本地的该私有库仓库不干净,需要清理本地缓存。将本地repo中的该仓库删除,重新添加,然后再执行验证,push就可以了.

~/.cocoapods/repo #打开本地的总仓库,找到你的那个私有仓库,将整个文件夹删掉,清空废纸篓
pod repo add 私有库仓库名 私有仓库远程地址
pod lib lint ...
pod repo push ...

2.3 私有库发版成功后,需要在私有库工程中Example文件夹下 pod update,更新下私有库代码,接着再在需要引用该私有库的项目工程里pod install下,然后就可以看到私有库确实更新了,如果还没更新,可以将 Podfile 中“pod xxx”注释后 pod install 再 取消注释后再 pod install,这样就可以实现更新了!

库的更新其实也就是功能文件或资源的更新。代码的更新必须要在“库名/classes”文件夹中进行!不要用Xcode在项目工程中的Pods/Development Pods/库名下面直接更新代码,这样做是无效的,因为这里只是库更新成功后,pod update后从本地pods仓库中拉取到的代码,这里不要进行写的操作,不然会导致库的异常,导致下一次更新后pod lib lint的失败!

如果是更新了代码部分,则需要先将代码push后再pod repo push。
发版成功后,需要pod repo update ops-xgn-ios-xgn,然后再在项目中引用。

2.4 “An unexpected version directory ‘Assets’ was encountered for the /Users/yanyan/.cocoapods/repos/** Pod in the xxx repository.”

这可能是由于你的误操作将私有库制作成了私有仓库了,搞成容器了,可以进入指定文件夹repos把xxx删除即可,删除完再发布就可以了。

最后,push成功的反馈就是会出现最新的版本号提示,如下图: