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文件夹一直往里点,你会发现很多框架以及版本号
$ 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命令进行操作即可。
二,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 language do you want to use?? [ Swift / ObjC ]
ObjC是否自动生成demo,选择Yes,方便以后测试
Would you like to include a demo application with your library? [ Yes / No ]
Yes是否集成测试框架
Which testing frameworks will you use? [ Specta / Kiwi / None ]
NoneUI 测试
Would you like to do view based testing? [ Yes / No ]
No指定类前缀 (当指定前缀时系统会自动在模版内创建指定前缀的类,Delegate)
What is your class prefix?
LX示例图:
- 执行完之后,自动打开项目。
编写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的介绍及优点本文就不在赘述,我开始 ...
随机推荐
- 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_16_常用的函数式接口_Function接口中练习-自定义函数模型拼接
- VUE 全局监听sessionStorage变化
在做项目的时候,可能需要在其他模块获取推送的信息或者变量,但是数据量或者说数目少,而且项目中也没有引用VUEX,那么可以下手的方法之一也就是sessionStorage类的浏览器存储了. 首先在全局的 ...
- MySQL-mysql 8.0.11安装教程 windows
网上的教程有很多,基本上大同小异.但是安装软件有时就可能因为一个细节安装失败.我也是综合了很多个教程才安装好的,所以本教程可能也不是普遍适合的. 安装环境:win7 1.下载zip安装包: MySQL ...
- shell脚本中执行python脚本并接收其返回值的例子
1.在shell脚本执行python脚本时,需要通过python脚本的返回值来判断后面程序要执行的命令 例:有两个py程序 hello.py 复制代码代码如下: def main(): pri ...
- Jmeter的中英文互换
1.jmeter的中英文互换:为了更深入的了解Jmeter,一般使用英文版的jmeter. 旧版本下载的默认中文较多.新版本5.1的下载后默认英文比较的多. 方法一: 选项->选择一种语言,但是 ...
- python控制流-提前结束进程
一.sys.exit() 调用 sys.exit()函数,可以让程序终止或退出. 这个函 数在 sys 模块中,必须先导入 sys,才能使用它: #!/usr/bin/env python #codi ...
- Centos 7下Hadoop分布式集群搭建
一.关闭防火墙(直接用root用户) #关闭防火墙 sudo systemctl stop firewalld.service #关闭开机启动 sudo systemctl disable firew ...
- linux下的SSHD被连接端口修改
连接别人:vim /etc/ssh/ssh_config 被连接: vim /etc/ssh/sshd_config 端口重启生效: /etc/init.d/sshd restart
- BZOJ 1085(IDA*)
题面 传送门 分析 首先,直接搜索肯定会TLE 很容易想到用迭代加深的方法,限定搜索深度 但是,这样仍然不够,需要用启发式的方法优化 我们设计一个估价函数f(x)=g(x)+h(x)f(x)=g(x) ...
- Mysql 数据库存储的原理??
储存过程是一个可编程的函数,它在数据库中创建并保存.它可以有 SQL 语句和一些特殊的控制结 构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中的 ...