CocoaPods 制作私有库 Swift/OC 过程、注意点和错误总结

2020-06-19 11:29:30 浏览数 (2)

前言


最近由于要做组件化,所以就顺便看了看私有库的制作,整体上制作的过程是比较简单的,但有一些点你注意到的话会在制作过程会少去很多的麻烦,在网上搜的制作过程的文章是一大把,但当你真的遇到一些问题的时候在去找答案有些就会比较困难,所以出于这样的一个初衷我在这里就把自己整个制作过程记录下来,以及这这些过程中你需要注意的点全都一点点的写出来,保证这篇文章能完全把整个过程说清楚,让你看着这篇文章能够完全理解过程和每一步我们到底是在做什么,而不是粘贴复制命令行,完了啥都不知道

一:先说说关于CocoaPods


不知道关于CocoaPods你到底掌握到什么程度,下面就说说最简单的关于几个制作过程中需要注意的点:

先进入下面路劲打开看看:command shift g 输入 ~/.cocoapods/repos 在1.8.0以后的版本中会有 trunk repo ,这是因为这个版本之后的Cocopods官方开始使用 CDN 不在使用以前的 master repo ,至于好处什么的我这里就不在说了,下面两篇文章能说清楚。

master 的 source 是

代码语言:javascript复制
'https://github.com/CocoaPods/Specs.git'

而 trunk 的 source 是

代码语言:javascript复制
'https://cdn.cocoapods.org/'

可能有小伙伴会问这和我们制作私有库有啥关系,这个我们后面肯定会说,你首先得区分好这点,可能有人在使用 CocoaPods 的时候有遇到下面这个问题:

代码语言:javascript复制
[!] CDN: trunk URL couldn't be downloaded:

然后按照网上搜索出来的解决方法直接把trunk源给删除了,因为网上90%的解决方案都是这个样子的,我自己是不建议这样,毕竟我们已经在使用新版本的Cocoapods,我们这样做不就回到就版本了吗?我自己还是喜欢尝试新鲜的东西,虽然可能新的东西遇到的问题会比较多。至于新版怎样利用CDN的方式都在下面文章中。

最后一点,下面我制作的过程中CocoaPods的版本是 1.9.1

1、CocoaPods 1.8 Beta is Here!

2、CocoaPods|安装流程与使用

3、CocoaPods 都做了什么

二:首先得有两个远程库


这里先解释一下为什么我们需要两个远程库,假设这两个库分别为 A 和 B , A 我们用来存放我们制作私有库项目的代码B 我们用来存放我们的私有库。我想这句话应该是解释清楚了为什么我么需要两个远程库了,当然你要说你不需要把你制作私有库的代码上传到远程库那也就意味这你不需要远程库A了,但这样的确是不行的,这个我们后面再说。

我们用码云为例子,创建两个远程私有库,填写名称什么的我就不说了,需要留意的也就下面两个地方:

建议还是使用 Readme 文件初始哈仓库吧,这样我们后面使用 MarkDown 语言来写使用说明会比较好,这也是现在很多三方在使用的方式。

三:制作私有库


这个制作过程我们按照步骤的形式往下说:

1、承接上面 A B 远程库的逻辑,比如说你是用远程私有库 B 来存放私有库,那你就先需要把 B 添加到你 CocoaPods 的本地 repo 中,终端打开准备干活了,命令如下:

pod repo add B私有库名称 B私有库码云地址

完成上面的步骤之后还是按前面我们说的你进入到 CocoaPods 的 repo 中去看看就应该有了 B私有库

2、在你本地创建一个文件夹用于存放项目 省略......

3、cd 到你上面创建的文件路径下面,创建你需要制作私有库的项目,执行下面命令:pod lib create 私有库项目名称 (建议这个名称最好不要和你私有库名称重复,便于区分)

4、如上图所示,我创建了三个私有库项目用来制作私有库,接下来要做的就是在替换文件或者是自己创建文件来写你的私有库项目代码了,要是你已经写好了你私有库的代码,那你就直接进入 ZXTestOCUIKit 路径下面的 Class文件进行一个替换,这里我们补充一点就是关于文件分层的问题,假如你在 Class下面要把你的文件分别放到两个文件下面,不是说我们直接放进去就可以了,这里涉及到 podspec 文件的设置问题,这里你先有个印象,具体的怎么处理我们在说 podspec 文件修改的时候集中说。

5、进入到 Example 路径下面直接打开项目, 这里就一点,不管前面Class你是替换的文件还是你打开项目之后创建文件修改,改动完了之后都记得 pod install 一下!不然你在 Example 可能找不大你需要的文件。其实这里也有一个问题的,就是你把文件拉进来之后 不修改好 podspec 文件,执行 install 之后发现添加到项目中的文件引用不见了,我在尝试的时候就有这个问题,在添加 Assest 资源的时候也有这个问题,你要是遇到这个问题就找下面修改 podspec 文件的内容设置要分层路径再执行 install。

6、修改你的 podspec 打开项目找到最上面的 .podspec 文件,文件里面修改注意的点我都写在注释里面了。

代码语言:javascript复制
Pod::Spec.new do |s|
  s.name             = 'ZXTestOCUIKit'
  #版本号
  s.version          = '0.0.5'
  #摘要
  s.summary          = 'A Test Privity Kit About ZXTestOCUIKit.'

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!

  s.description      = <<-DESC
TODO: ZhangXu A Test Privity Kit About ZXTestOCUIKit.
                       DESC
  # 你的主页地址 填个能访问的 不然可能检验的时候报错
  s.homepage         = 'https://gitee.com/MrRisingSun'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  # 作者
  s.author           = { 'Zhangxu' => 'zhangxu@pipipifa.com' }
  # 你制作私有库项目的远程地址 A
  s.source           = { :git => 'https://gitee.com/MrRisingSun/ZXTsetOCUIKit.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
  # 最低版本
  s.ios.deployment_target = '9.0'

  # 文件层级分类
  #s.source_files = 'ZXTestOCUIKit/Classes/**/*'
  
  # 要是文件有分层 就这样写
  s.subspec 'ZXLoadingView' do |ss|
      ss.source_files = 'ZXTestOCUIKit/Classes/ZXLoadingView/*.{h,m}'
  end

  s.subspec 'ZXUIView' do |ss|
      ss.source_files = 'ZXTestOCUIKit/Classes/ZXUIView/*.{h,m}'
  end
  
  # 资源
  s.resource_bundles = {
     'ZXTestOCUIKit' => ['ZXTestOCUIKit/Assets/*.{png,json,xcassets}']
  }
    
  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
  # 依赖库
  s.dependency 'AFNetworking'
  s.dependency 'JSONModel'
  s.dependency 'lottie-ios','2.5.3' # 指定版本
  s.dependency 'ZXTest2OCUIKit'

注意:里面涉及到资源引用路径的时候稍微留意下,我在我的项目中引用了一个JSON格式文件的动画资源,你要有别的格式的资源引用方式是一样的。

还是那句,记得你要是修改了Class的文件,在写Example 的时候记得 pod install 一下使用

7、上面这些就基本上该修改的也都修改好了,在进行后面的操作的时候,我们先本地校验一下,按照我上面的创建 你应该在 ZXTestOCUIKit 文件下执行本地校验,也就是在 Example 的这一层路径下,别在 Example下校验 ,执行 pod lib lint 就OK。本地检验这一步也是错误比较多的一步,这里会检验出创建的各种各样的问题,你要有问题在后面错误的集中处理中看看有没有可以帮助到你的,还有问题可以在我主页QQ找我。

8、后面的操作就是一些关于git的操作, 我们先关联git: git remote add origin 远程仓库地址 A

9、然后拉去一下代码,正常的git流程:git pull 然后就报错了,哈哈哈.... 使用 git pull origin master --allow-unrelated-histories (允许合并不相关的历史内容) 正常这里是要冲突的,那就先解决一下冲突,你看那个文件冲突了,直接 vim 冲突文件 ,进去之后把冲突的地方删除掉就OK了,(按 i 进入编辑状态)。

10、上传制作私有库的项目代码到远程仓库:

git add .

git commit -m'描述'

git pull origin master

git push origin master

11、打标签,在最后制作私有库之前我们需要给它打个标签,在每一次我们修改文件更新私有库上传代码的时候我们都要进行这一步的,并且保证你打的标签和你本地 podspec文件的版本号是一致的

git tag -a 0.0.1 (比如是这个版本) -m '0.0.1'(m 里面的内容都是描述内容)

git push --tags 标签打完 你也可以通过 git tag 查看一下是不是你这个标签

12、最后就是私有库制作远程检验的了,其实也是最后的制作,执行:

pod spec lint

这一步也是一个错误集中爆发地,后面我也在经理总结这里有的错误,其实整个过程不是很复杂,只要自己动手多走几遍,慢慢的也就都理解不在觉得困难。

13、上传私有库到我们 cocoapods 的 repo

还记得最开始时候第一步我们添加的 repo B 吗?我们现在把我们制作的私有库提交到这个远程仓库中,执行下面命令:

pod repo push (cocoapods的repo) 你私有库的.podspec 文件

走到这一步就算是我们的私有库主要的我们制作完了,下面我们要说的这就是整个过程中你可能也会遇到的问题,其实真正让我们纠结的夜从来都不是过程,而是这过程中遇到的个猴子那个各样的问题,我甚至舔我 cocoapods 都重装过,所以说有啥问题慢慢解决就可以了,终究你还是会成功的。

四:遇到的问题


1、使用问题:

具体的使用办法是比较简单的,你在你项目的 podfile 文件中加入你私有库的源地址(B私有库地址),然后正常的 pod '你的库' ,最后先 pod update , pod install 就OK了,当然这是正常的情况,我们总结问题肯定不能总结正常的,我们说说不正常的。

<1>: 在你执行完上面13步之后可以 pod secrch '私有库' ,这地方在 1.9.1 这个版本失败的概率还是有的,我就经常失败,要是你确保你的步骤没问题,你再cocoapods 的 repo 当中也确实能看你的私有库,那就跳过这边一步,不要去网上找 pod search 失败,你会发现答案很多可就是不是和现在这个流程,我在最前面说过 不要去采用删除 master 源这个方式!

<2>: 为什么我的swift私有库找不到方法、文件等等呀,我制作过程没问题呀,当然这一步可能你在开始写 Example 的时候也会有这个问题,它的答案就是 权限问题swift 版本你要暴露的方法或者类什么的要使用open权限,我以为 public 默认的是没问题的,结果是有问题!你可以找那些swift版本的三方库就能发现是这个问题!

2、本地检验额问题:

<1>: 有警告检验不通过,就像下面这个一样。

解决办法:

其实最直接的办法就是你直接执行 pod lib lint --allow-warnings 允许警告 ,但要是细节处理这几个警告提挺有意思的,下面我们分析一下上面的三条警告:

1、摘要写的太差了,就是连敷衍了事那种都没做的地步,哈哈哈哈。。。当然要是你的摘要写的比描述都多,你试试 ?

2、检查一下写的主页地址还是项目地址有地方是有问题的,也就是连接不可用。所以我们前面雨说过主页地址写一个可以用的地址,百度都行,保证能正常访问,项目地址就写你远程项目仓库的地址,被填错了。

3、第三个你上网去搜还能找出很多答案,有制作文件的等等,其实简单点你指定一下swift的版本就可以了: s.swift_version = '4.0'

<2>: 我找不到答案的问题 私有库相互依赖本地检验不过的问题 Returuned an unsuccessful exit code

这个问题我还真的是纠结了很久了,比如说你现在有叫做 Zhangxu1 和 Zhangxu2 的两个私有库,然后你在 Zhangxu2中要使用一些Zhangxu1的东西,你把他们都放在一个叫zhangxu的 cocoapods repo 下面,这时候你2依赖1,然后本地检验是捕获通过的,错误如下:

说实话,按照上面的逻辑我暂时真的没找到怎么解决,当然你可以说不要有依赖关系就可以了,这样肯定是没问题的,我纠结的点可能变成是不是不能这样依赖,就两个私有库之间!如果有知道答案的小伙伴也请指教我一下,我也很想知道答案、原因!!

3、远程校验问题:

你有依赖别的第三方库, 直接使用 pod spec lint 检验不行,那就试着加上源地址试试吧:

4、还有许多会是一些关于 CocoaPods 的问题

我在前面有说过我利用一个json格式的文件,其实是用来做动画的,然后我尝试导入 lottie-ios 结果.....一直报下面这个错,然后上网找呀找,找呀找答案找的我睡着了还没解决,结果回到公司再次尝试。得到的结论就是应该是我网络差!┭┮﹏┭┮

当然还有许许多多的问题,只不过我写这篇文章的时候是我忙完这些后面一个星期了,有些我记得也是模棱两可了!记性差.......

总结就暂时这么多吧, 在整个私有库的使用过程中我相信关于它的问题我还是会遇到很多的,我再回来补充!

0 人点赞