前言


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

一:先说说关于CocoaPods 


快捷键: command + shift + g ,再输入  ~/.cocoapods/repos 就可以查看我们Cocoapods-repo的文件夹

   下面我制作的过程中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 文件,执行 pod install 之后发现添加到项目中的文件引用不见了,我在尝试的时候就有这个问题,在添加Assest资源的时候也有这个问题,你要是遇到这个问题就找下面修改podspec文件的内容设置要分层路径再执行 pod install。

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

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。本地检验这一步也是错误比较多的一步,这里会检验出创建的各种各样的问题,你要有问题在后面错误的集中处理中看看有没有可以帮助到你的,还有问题可以在我主页QQ找我。

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

9、然后拉去一下代码,git pull origin master --allow-unrelated-histories【unrelated-histories-允许合并不相关的历史内容】

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

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名称【记得带上.podspec】

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

14、要是用我们的私有库记得更新下我们Cocoapods的私有库Repo:

pod repo update 私有库repo

四:遇到的问题


1、使用问题:

<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,然后本地检验是捕获通过的,错误如下:

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

补充:

后面使用中发现两个私有库在相互依赖的情况下要进行校验(包括本地和远程)你是需要带上 source 源的,具体的Demo如下:

pod lib lint --sources=http://192.168.1.92/ice/PPSpecs.git,https://cdn.cocoapods.org/

前面的源是你CocoaPods中的repo地址,我这个后面是还依赖了第三方,需要指定 CocoaPods的trunk源地址。

3、远程校验问题:

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

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

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

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

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

CocoaPods+Gitee 制作私有库过程以及错误总结的更多相关文章

  1. iOS 组件化开发之使用CocoaPod制作自己的远程私有库

    随着应用需求逐步迭代,应用的代码体积将会越来越大,为了更好的管理应用工程,我们开始借助CocoaPods版本管理工具对原有应用工程进行拆分.但是仅仅完成代码拆分还不足以解决业务之间的代码耦合,为了更好 ...

  2. iOS:最详细的创建CocoaPods私有库教程

    一.感慨 说实话,创建这个CocoaPods私有库,我愣是搞了两个星期,创建的过程中,自己的感情波动是这样的:激情四射---->有点困惑----->极度困惑----->有点失望--- ...

  3. 利用Cocoapods、SVN 创建私有库实现方案(yoowei)

    由于项目年后要进行组件化,考虑到如果公司内部实现一些私有的组件,不对外公开,而又想在不同项目中使用,该怎么办呢? 使用Cocoapods制作私有库就完美的解决了这个问题.下图就是使用私有库带给我们的好 ...

  4. 利用Cocoapods创建基于SVN的私有库podspec

    由于项目年后要进行组件化,考虑到公司内部实现的一些私有组件,不对外公开,而又想在不同项目中使用,该怎么办呢?由于cocoapods有了强大的功能,可以自己创建podspec,更可以设置私有的库.那么利 ...

  5. 基于 svn 服务器及 cocoapods-repo-svn 插件进行组件化私有库的创建

    一.准备 组件化 随着业务需求的增长,在单工程 MVC 模式下,app 代码逐渐变得庞大,面对的高耦合的代码和复杂的功能模块,我们或许就需要进行重构了,以组件化的形式,将需要的组件以 pod 私有库的 ...

  6. iOS组件化开发入门 —— 提交自己的私有库

    前言:本人也是初次接触组件化开发,感觉现有的资料太繁杂,就简单整理了一下,在此跟大家分享一些入手的经验,主要就是描述cocoapods的私有库封装和提交.组件化开发是个大的议题,涉及到架构思路.设计模 ...

  7. gitLab创建自己的私有库

    一.创建私有库的流程简介 创建一个项目,留着后面的流程3制作私有库 在可以创建私有库的地方创建一个code repository, code repository是代码仓库,我们把代码上传到这个仓库. ...

  8. 制作CocoaPods公有库和私有库

    认识公有库和私有库 公有库:开源自己封装的库供别人使用,且往cocoaPods的官方Repo仓库(即CocoaPods Master Repo)中新增自己库的索引,该库索引是以*.podspec.js ...

  9. 利用cocoapods创建基于git的私有库

    上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...

  10. 利用cocoapods创建基于git的私有库Spec Repo

    上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...

随机推荐

  1. 自定义快捷命令程序(VC++加批处理)

    一 概述 在看<从小工到专家-程序员修炼之道>时,看到建议使用Shell,很有感触.在很多时候,通过键盘操作,比鼠标的确会块很多,如果能用好shell命令(或批处理命令)   ,的确能节省 ...

  2. ORACLE 中报ORA-30926 无法在源表中获得稳定的行的处理

    在库存处理的业务中有这么一个场景,一张处方划价单进行库存扣减处理,如果此单据同一商品有两行以上,同时扣减同一行库存记录,使用MERGE INTO批量更新是就会报错:ORA-30926 无法在源表中获得 ...

  3. mysql存储过程取得错误信息的方式。

    GET DIAGNOSTICS CONDITION 1 @v_sqlstate=RETURNED_SQLSTATE,@v_message= MESSAGE_TEXT; SELECT @v_sqlsta ...

  4. H5调用手机拨打电话的功能

    里面加上: 我没有写也是可以的 <meta name="format-detection" content="telephone=yes"/> 该标 ...

  5. NAT原理:概念、使用场景、转发流程及规则

    本文分享自天翼云开发者社区<NAT原理:概念.使用场景.转发流程及规则>,作者:x****n 网络地址转换(NAT)是一种在计算机网络中将一个网络的IP地址转换为另一个网络的IP地址的技术 ...

  6. NOIP 游记

    前情提要:color \(100\to 0\),arena \(92/100\to 36\). 最后一场模拟赛喜提 0+0+100+0,挺乐的. Day 0 晚上九点睡,然而还是很早就醒了,但是时间体 ...

  7. docker-镜像的作用

    ls /var/lib/docker tree /var/lib/docker overlay2 docker pull ubuntu:8.0 docker images ls /var/lib/do ...

  8. K230学习记录

    K230学习记录 参考自: # 立创·庐山派-K230-CanMV开发板资料与相关扩展板软硬件资料官网全部开源 # 开发板官网:www.lckfb.com # 技术支持常驻论坛,任何技术问题欢迎随时交 ...

  9. Android开发之定时任务(AlarmManager、WorkManager)

    Android 程序的定时任务主要有AlarmManager.WorkManager两种. 一.AlarmManager AlarmManager,又称闹钟,可以设置一次性任务,周期重复任务,定时重复 ...

  10. 大数据之路Week08_day02 (Flume 三个组件Source, channel, sink)

    在使用之前,先介绍组件Flume的特点和一些组件 Flume的优势: 1. Flume可以将应用产生的数据存储到任何集中存储器中,比如HDFS,HBase 2. 当收集数据的速度超过将写入数据的时候, ...