Mac终端的Cocoapods创建自己的私有库和公有库
一,前言
为什么要用Cocopods
通常在开发的过程中,大多时候,我们会处理一类相同的操作,比如对于字符串String的邮箱验证,是否为空,手机号验证,或者一些UIView的动画操作,我们为了避免写一些重复的代码,可能经过类目或者延展的形式对原有的类进行了一个扩充。还有一些是工程中一些基本的公共组件,比如城市列表,刷新控件,网络请求库或者商品的目录这种基本公共组件,在工程中好多地方需要调用,我们都可以进行封装成一个组件功能模块。为了以后方便在其他App中使用,我们可以使用Cocoapods把这些小点子,小功能,可以封装成一个pod,当下次使用的时候,只需简单配置就可以了。这一点特别是在公司开发多个项目的时候,可以很方便快速的共享公共的代码,节约开发时间,这就是为什么好多公司喜欢组件化管理代码。至于库是创建私有的还是公共的,看自己和公司要求而定,大多情况下公司的是私有库pod。当然通过cocopods除了集成自己开发的功能模块外,还可以引用第三方发布到cocopods上的功能功能模块,比如友盟的分享,神策的统计等等好的功能模块。总之Cocopods 减少了代码的耦合性,提供了开发效率等等。
理解Cocopods原理
cocoapods的下载原理
- 举例: s.source = { :git => 'git@gitlab.xxx.net:ios-thirdpartservice/xxxreact.git', :tag => '1.0.0' } //s.source 位于.podspec内
当使用Cocoapods导入私有库时,Cocoapods先是根据:git => ‘git@gitlab.xxx.net:ios-thirdpartservice/xxxreact.git’找到对应的git仓库,然后根据:tag => ‘1.0.0’定位到对应tag的提交(如果没有注明Pod依赖库版本则定位到最后一次的提交),然后在这次提交中检索后缀为.podspec的文件(文件可以随便命名)。找到podspec文件后先要验证s.name是否与Podfile中的一致,如果不一致则install时会报错:[!]Unable to find a specification for ‘React’. 如果验证成功后,就会根据Podspec中的s.source_files找到需要导入的代码文件,并通过其他的的数据找到对应的配置文件或资源文件等。最后,将其下载到本地项目中。
当使用Cocopods导入共有库时,和以上原理也相同。只是共有库要将podspec文件上传到cocoapods。在导入的时候通过名字React去cocoapods匹配对应的podspec,然后根据s.source去找到对应的仓库和对应的版本,然后会再去匹配新的podspec,后边的步骤就完全相同了。集成原理
当所有的依赖库都下载完后,Cocoapods会将所有的依赖库都放到另一个名为Pods的项目中,然后让主项目依赖Pods项目。这样,源码管理工作都从主目录移到了Pods项目中。Pods项目最终会编译成为一个名为libPods.a的文件,主项目只要依赖这个.a文件即可。对于资源文件,Cocoapods提供了一个名为Pods-resource.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将Pods依赖库的各种资源文件复制到目标目录中。Cocoapods还通过一个名为Pods.xcconfig的文件来在编译时设置所有的依赖和参数。libPods.a
Pods-resources.sh
Pods.xcconfig
版本控制原理
当执行完pod install之后,cocoapods会生成一个podfile.lock的文件。podfile.lock文件最大的用处在于多人开发。如果你没有在podfile中指定pods版本pod ‘React’,那么默认为获取当前React依赖库的最新版本。当团队中的某个人执行完pod install命令后,生产的podfile.lock文件就记录下了当时最新pods依赖库的版本,这时团队中的其他人check下来这份包含podfile.lock文件的工程以后,再去执行pod install命令时,获取下来的pods依赖库的版本和最开始用户获取到的版本一致。如果没有podfile.lock文件,后续所有用户执行pod install命令都会获取最新版本的React,这就可能造成一个团队使用的依赖库版本不一致,这对团队协作来说绝对是个灾难。
在这种情况下,如果团队想使用当前最新版本的React依赖库,有两种方案:
1、更改podfile,使其指向最新版本的React依赖库
2、执行pod update命令;鉴于podfile.lock文件对团队协作如此重要,所以应该加入到版本控制里面。区分pod install 与 pod update
我们在使用这个工具时,最经常用到的命令就是pod install 和 pod update;这两个命令都能为我们安装指定的Pod库,但是他们的使用是有区别的,有各自不同的作用和适用场景;了解这两个命令的差异前,需要先对Podfile.lock文件有所了解;Podfile.lock文件中记录了每个pod的当前已安装版本,并锁定这些版本(.lock命名因此而来);当运行pod install命令时,它只解析尚未列在Podfile.lock中的依赖库,在下载并安装新的pod时, 会在Podfile.lock文件中写入新的pod库的当前指定版本;对于已经在Podfile.lock中列出的pod, pod install命令不会尝试检查是否有更新的版本;而是直接使用在Podfile.lock文件中的pod版本;
pod install
在项目中第一次使用CocoaPods时,安装指定的pod库需要使用这个命令;
当在Podfile中 增加 或 删除 某个pod后, 使用这个命令进行更新;pod install不会尝试更新已安装的pod的版本;pod update
1、当运行pod update时,CocoaPods会把Podfile中所有的pod都更新到最新版本;并在Podfile.lock中写入最新的版本号;
2、执行pod update PODNAME命令更新指定的某个PODNAME库到最新版本;pod outdated
pod outdated命令可以检测出所有比Podfile.lock中写入的版本(每个pod当前安装的版本)更新的pod版本;
了解Cocopods的本地目录
我们先来看看CocoaPods本地目录中有什么
$ cd ~/.cocoapods/repos/master 或者显示隐藏文件
$ defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder
然后进入 ~/.cocoapods/repos/master你会发现 master 是一个 git 仓库,输出仓库的远程地址,发现是一个GitHub仓库
$ git remote -v
- origin https://github.com/CocoaPods/Specs.git (fetch)
- origin https://github.com/CocoaPods/Specs.git (push)
继续,我们进入Specs文件夹一直往里点,你会发现很多框架以及版本号
- origin https://github.com/CocoaPods/Specs.git (fetch)
$ pod search YYImage
选择一个框架,通过pod搜索 Specs 文件夹中的框架,输出框架信息- -> YYImage (1.0.)
- Image framework for iOS to display/encode/decode animated WebP, APNG, GIF,
- and more.
- pod 'YYImage', '~> 1.0.4'
- - Homepage: https://github.com/ibireme/YYImage
- - Source: https://github.com/ibireme/YYImage.git
- - Versions: 1.0., 1.0., 1.0., 1.0., 1.0, 0.9., 0.9., 0.9., 0.9.,
- 0.9., 0.9., 0.8. [master repo]
- - Subspecs:
- - YYImage/Core (1.0.)
- - YYImage/WebP (1.0.)
每个版本号对应的一个json文件,描述了每个对应版本的框架的信息、配置、及源码下载地。
我们在 CocoaPods 发布我们的框架时,就是要在 master 仓库中添加我们的仓库描述信息,然后push到远程仓库中。不过这个过程不用我们手动去操作,只需要通过pod命令进行操作即可。
- -> YYImage (1.0.)
二,iOS 创建自己的Cocoapods公有库
- 注册 CocoaPods 账号 (已注册可忽略)
想创建开源的Pod库,就要注册一个CocoaPods账号,我们使用终端注册, email 用你的 GitHub 邮箱
- $ pod trunk register GitHub_email 'user_name' --verbose
等终端出现下面文字,CocoaPods 会发一个确认邮件到你的邮箱上,登录你的邮箱进行确认。
- [!] Please verify the session by clicking the link in the verification email that has been sent to you_email@.com
注册成功!
确认后再终端输入
- pod trunk me
可以看到你的注册信息
类似如下:
- $ pod trunk me
- - Name: xxx
- - Email: xxx@.com
- - Since: November 17th, :
- - Pods: None
- - Sessions:
- - November 17th, : - March 27th, :. IP: xxx.xxx.xxx.xxx
- 创建一个工程
1、在桌面上新建一个工程文件夹比如“cocopods”
2、打开终端,切换到该目录- cd /Users/xxx/Desktop/cocopods
3、创建工程模板
- pod lib create cocopods
4、配置相关选择。
选择平台
- What platform do you want to use?? [ iOS / macOS ]
- iOS
- What platform do you want to use?? [ iOS / macOS ]
选择语言
- What language do you want to use?? [ Swift / ObjC ]
- ObjC
- What language do you want to use?? [ Swift / ObjC ]
是否自动生成demo,选择Yes,方便以后测试
- Would you like to include a demo application with your library? [ Yes / No ]
- Yes
- Would you like to include a demo application with your library? [ Yes / No ]
是否集成测试框架
- Which testing frameworks will you use? [ Specta / Kiwi / None ]
- None
- Which testing frameworks will you use? [ Specta / Kiwi / None ]
UI 测试
- Would you like to do view based testing? [ Yes / No ]
- No
- Would you like to do view based testing? [ Yes / No ]
指定类前缀 (当指定前缀时系统会自动在模版内创建指定前缀的类,Delegate)
- What is your class prefix?
- LX
示例图:
- What is your class prefix?
- 执行完之后,自动打开项目。
编写podspec文件。
1、 目录下文件介绍
podspec这个文件主要是用来描述项目名称、pod的版本号、介绍、首页(homepage)、作者信息、git源等,具体的可以参看官方Podspec Syntax Reference
README使用过GitHub的都会知道README文件的重要性,这个文件可以使用Markdown语法,主要展示在GitHub工程上的首页。README文件对于使用这个pod库的人来说,有和没有这个文件,区别是很明显的,此外这还有助于创建一个高质量的 CocoaPods Quality Index ;
LICENSE要想是Spec仓库接收,就必须包含一个license。命令
pod lib create
自动创建使用的是 MIT license;
2、如果用上面的命令创建工程模板,那么工程的目录下已经自动生成了.podspec(LCocopodsTest.podspec)。如果是已有的工程或者库文件目录,也可以利用Pod命令自己制作.podspec文件,命令如下:
pod spec cretae <组件库名>
PS注意:自动生成的podspec文件只是模板,需要结合工程的库文件、资源目录、远程代码仓库(第1步创建的远程代码仓库)修改补充podspec文件。
验证.podspec文件的格式是否正确
1、cd 到 *.podspec 文件所在的目录下,用到的一些命令
pod lib lint
解说:本地验证pod能否通过验证,如果失败使用下面命令:pod lib lint --verbose查看失败原因, 或使用pod lib lint --allow-warnings忽略警告错误
pod spec lint
解说:本地和远程验证pod能否通过验证,需要更新提交podspec到远程specs仓库,一般本地验证通过即可提交到远程specs仓库
pod lib lint --verbose
解说:加--verbose可以显示详细的检测过程,出错时会显示详细的错误信息
pod lib lint --verbose --allow-warnings
解说: 允许警告,用来解决由于代码中存在警告导致不能通过校验的问题
有时候会提示一个错误
⚠️:没有写简介,把简介填写一下,就可以验证通过。- 有时候会提示一个错误:
⚠️:到这个提示错误信息的时候,使用如下指令:
pod lib lint 文件名称.podspec --use-libraries --allow-warnings
相应的执行上传指令的时候,也需要加上参数:
pod repo push GofSpecs GofKit.podspec --use-libraries --allow-warnings
pod lib lint --sources=[https://git.xxx.com/XesAppMediator...]
解说: 私有库依赖需要添加specs源来验证引用当前私有库的podFile中指定source为私有库地址
source http://[privateLibName]/cocoaspecs.git'
source 'https://github.com/CocoaPods/Specs.git'pod lib lint --help
解说:查看所有可选参数,可选参数可以加多个
提交工程代码
提交工程代码到远程代码仓库,可以利用git或者svn进行代码版本管理,提交代码到GitHub等, 初始化提交命令如下:
//初始化git版本管理仓库,模板代码已经初始化过此步骤可以忽略(有.git文件夹)
git init
//添加到暂存区
git add .
//提交到本地仓库
git commit -a -m '提交信息'
示例:git commit -a -m '添加pod组件库'
//打标签,注意此标签可能在podspec中用到,用于区分版本
git tag 1.0.0
//本地仓库与远程仓库关联(已关联过的,可以忽略)
git remote add origin <url>
//拉取和合并本地与远程仓库
git pull origin master --allow-unrelated-histories
//本地仓库代码推送到远程
git push --set-upstream origin master
此时如果你报错,查看报错信息中如果有:“pre-receive hook declined” 说明存在权限问题,没有master分支的代码提交权限。分配权限后,就可以push成功。
//推送标签
git push --tags
- 使用仓库
发布到Cocoapods后,在终端更新本地pods仓库信息
更新本地pods仓库信息
- $ pod setup
查询仓库
- $ pod search LCocopodsTest
-> LCocopodsTest (1.0.0)
A delightful TextField of PhoneNumber
pod 'BYPhoneNumTF', '~> 1.0.0'
- Homepage: https://github.com/xxx/LCocopodsTest
- Source: https://github.com/xxx/LCocopodsTest.git
- Versions: 1.0.0, 0.0.1 [LCocopodsTest repo]
(END)若出现仓库信息说明已经成功了,这时候你就可以在 Podfile 添加、使用自己的仓库了 pod 'LCocopodsTest', '~> 1.0.0'
- 更新维护
当你的代码更新维护后,就需要重写发布,流程是:
更新LCocopodsTest.podspec中的版本号
打上标签推送远程
pod trunk push LCocopodsTest.podspec 推送到pods仓库
更新后你就可以在 CocoaPods Master Repo 仓库上看到自己的提交记录了。
Mac终端的Cocoapods创建自己的私有库和公有库的更多相关文章
- 使用CocoaPods创建自己的私有库-iOS组件化第一步
目前iOS组件化常用的解决方案是Pod+路由+持续集成,通常架构设计完成后第一步就是将原来工程里的模块按照架构图分解为一个个独立的pod工程(组件),今天我们就来看看如何创建一个Pod私有库. 新建: ...
- Mac终端的Cocoapods的安装及使用
阅读目录 第一步,首先要检查Mac是否安装了rvm.打开终端,输入指令 rvm -v 第二步,用rvm安装ruby环境 第三步,检查更新RubyGems(Ruby1.9.1 以后的版本自带RubyGe ...
- CocoaPods创建私有pods
由于项目需求,需要把项目的不同模块拆分出来即 组件化 ,一开始想做成多target模式,后来换成私有pods CocoaPods的安装和使用,网上很多,自行搜索即可. 听说可以基于svn创建pod私有 ...
- 制作CocoaPods公有库和私有库
认识公有库和私有库 公有库:开源自己封装的库供别人使用,且往cocoaPods的官方Repo仓库(即CocoaPods Master Repo)中新增自己库的索引,该库索引是以*.podspec.js ...
- 利用cocoapods创建基于git的私有库
上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...
- iOS代码组件化--利用cocoaPods创建私有库
如果项目模块多,模块间逻辑复杂,我们发现多个人同时维护一个代码仓库需要十分小心,一不小心,造成冲突,解决起来很烦,相信很多人都遇到手工删除合并的冲突的文件的经历. 如果利用组件化思想,每个人维护自己的 ...
- 利用cocoapods创建基于git的私有库Spec Repo
上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...
- 从mac终端创建cocos2d-x项目在xcode和eclipse正常运行环境配置
一.创建可以同时运行在xcode和eclipse的项目: 1.打开mac终端,进入cocos2d-x目录下的tools/project-creator,执行命令./create_project.py ...
- 【转】使用Cocoapods创建私有podspec
Cocoapods是非常好用的一个iOS依赖管理工具,使用它可以方便的管理和更新项目中所使用到的第三方库,以及将自己的项目中的公共组件交由它去管理.Cocoapods的介绍及优点本文就不在赘述,我开始 ...
随机推荐
- 关于崩溃报告的日志以及dump文件
在用户使用软件的过程当中突然产生软件崩溃的问题,必须采取相关的措施去拦截崩溃产生的原因,这有助于程序员解决此类崩溃的再次发生.特别是有些难以复现的崩溃,不稳定的崩溃,更有必要去调查崩溃产生的原因.一般 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第2节 匿名对象_6-匿名对象的说明
没有名字的对象,叫做匿名对象 新建一个Person类 把赵又廷赋值交给匿名对象Person里面的成员变量name 想调用里面的ShowName的话 还需要再定义一个匿名对象. 第三个对象是一个全新的. ...
- iView 实战系列教程(21课时)_1.iView 实战教程之配置篇_图片优化
首先需要安装vue cli 3.0版本 点击添加插件, 输入iview 选中后安装 全部导入还是按需导入. 2.是否需要自定义主题变量 3.多语言的设置. 这里我们全部选择为默认 然后点击继续. 启动 ...
- 封装redis(set/get/delete)str和哈希类型
将Redis的常用操作封装了一下: import redis class MyRedis(): def __init__(self,ip,passwd,port=6379,db=0): #构造函数 t ...
- linux(centos7.0以上)下对mysql数据库的导入导出
1:查看mysql安装路径: 指令 ps -ef|grep mysql 得出结果 root 968 1 0 18:25 ? 00:00:00 /bin/sh /usr/local/mysql/bin/ ...
- OO第四单元总结及课程总结
OO第四单元总结及课程总结 一.前言 紧张刺激的OO“昆仑课程”接近尾声,经过一个学期的学习,我的收获和感触颇多,借此博客作业的机会,对自己OO这门课程做一个总结.本博客主要有以下五个方面,一是第UM ...
- gradle阿里云镜像配置
Maven镜像的配置参考: http://blog.java1234.com/blog/articles/252.html buildscript { repositories { mavenLoca ...
- 20191105 《Spring5高级编程》笔记-第5章
第5章 Spring AOP 面向切面编程(AOP)是面向对象编程(OOP)的补充.AOP通常被称为实施横切关注点的工具.术语横切关注点是指应用程序中无法从应用程序的其余部分分解并且可能导致代码重复和 ...
- [Python3 练习] 001 温度转换1
题目:温度转换 I (1) 描述 温度的刻画有两个不同体系:摄氏度 (Celsius) 和华氏度 (Fabrenheit) 请编写程序将用户输入的华氏度转换为摄氏度,或将输入的摄氏度转换为华氏度 转换 ...
- winCE 获取路径信息
最近在做一个SAP的winCE扫描枪项目,采用C#开发,不过在获取路径是采用了常用的System.IO.Directory.GetCurrentDirectory, 并不能使用:查询后了解到winCE ...