【iOS】使用cocoapods创建私有库/公有库 2020年5月
本文源自weicy,转载请注明出处
一般来说一个公司不只有一个产品,当项目很多后,我们就要考虑代码的共用,我们需要把一些通用的功能抽离成一个公共类,或者把一些功能做成组件,方便不同产品的使用或者分离。这也就是组件化的一些功能。iOS组件化实现基本基于cocoapods,如何使用cocoapods创建自己的组件库,是实现组件化的第一要素。下面我们就来创建下自己的仓库吧。
-
创建私有库的索引库
-
准备一个私有库地址,内部有权限限制的仓库即可。意思就是我们把抽离出的代码放到github、gitlab、coding等代码托管平台上
如图我是在github上创建的。
-
-
将创建的索引库添加到本地的cocoapods仓库
-
查看本地索引库
pod repo
用上面的命令就能查出你当前电脑的本地索引库了
-
添加本地索引库
pod repo add 索引库名称 远程索引库地址
例子:
pod repo add CommonToolRepo https://github.com/xxx/CommonToolRepo.git
注意点: DFSpecs 是一个索引库,用来管理你的所有的私有pod 仓库的podspec文件的,执行完上面第2步,会在~/.cocoapods/repos 目录下自动生成DFSpecs 本地仓库
-
-
创建模板
- 创建模板这一步很简单,就是在某个位置创建一下我们代码。
$ cd ~/Desktop/ //这个命令的作用是创建一个pod项目,它会自动给你生成spec文件 $ pod lib create DYCategoryKit //pod lib create NAME使用默认模版,如果想使用其他模版,可以添加--template-url=URL参数。 //pod lib create NAME:创建标准目录结构、模板文件。pod lib create NAME不是创建pod的唯一方法,但它是最简洁的方法
- 我是在桌面创建的这个文件。如果这一步成功的话会有下面的图
What platform do you want to use?? [ iOS / macOS ] 选择iOS,直接回车默认选择第一个 What language do you want to use?? [ Swift / ObjC ] 选择Swift。CocoaPods会把你的库设置为framework Would you like to include a demo application with your library? [ Yes / No ] 选择Yes。如果你想要包含一个示例工程,或计划在app中测试你的库,这里需要选择Yes,以便模板文件为你的库创建Xcode工程。也就是如果你计划为pod添加截图,这里需要选择Yes。 Which testing frameworks will you use? [ Quick / None ] 选择Quick。提交库到CocoaPods前应当进行测试。CocoaPods推荐使用其附带的测试framework,而非Apple的XCTest。在Objective-C中,可以选择Specta/Expecta或Kiwi,其区别如下: Specta/Expecta:通过不同podspecs的模块化方法。 Kiwi:是对Stubs/Mocks/Expections的一种一体化方法。 CocoaPods已经在MyLib-Tests.pch文件中添加了所有必要的包含和设置,因此不必将它们包含在每个文件中。 但是由于现在的cdn问题有时候会不成功,我这边使用的是 None Would you like to do view based testing? [ Yes / No ] 选择Yes。根据你建立的仓库,你可能会发现基于快照的测试是验证视图不同部分不同操作的最佳方法,这里建议使用FBSnapShotTestCase。如果你使用的是Specta/Expecta,那么其会包含一个pod来改进语法。 What is your class prefix? 如果你选择的语言是ObjC,其最后会要求提供类前缀。你只要输入一个前缀即可
- 选项填完之后回车,会自动创建一个项目,名称就是CommonTool
-
将我们代码放入指定目录
打开桌面上的CommonTool,我们可以发现里面有一些文件,但是关键的文件夹就是CommonTool。这个文件夹中有两个文件夹(Assets和Classses)。
Assets:存放图片资源等等 Classes:存放源码,默认会有一个ReplaceMe.m文件 (比如SDWebImage pod里的类文件)可以删除这个文件
我们只要把需要上传的代码放入Classes文件夹中即可。然后进入Example文件夹,首次使用pod install进行安装,然后可以正常的引用和写测试代码。把你的demo修改的更完美,当然更重要的一点是保证没有错误。
-
在github或gitlab上创建新的pod项目
这里你会发现,我又重新创建了一个项目,和我之前创建的索引库项目是不一样的,这个就是真正放置我们封装的代码的地方
我的地址为
https://github.com/***/CommomTool.git
-
修改模板文件相关信息
进入CommonTool项目,使用xcode打开。找到.podspec文件,这里可以用Sublime Text或者Xcode (文本编辑器不推荐,因为可能会改变"的格式,造成lint不通过),我这里直接在xcode中进行更改,根据你的需要进行相应更改。
s.summary,这个是显示在pod search的简短描述,
s.version是版本号,第一次默认是0.1.0不用修改,如果不是请修改为对应版本,
s.homepage和s.source中的地址为我们创建组件仓库的地址即可!
# # Be sure to run `pod lib lint CommonTool.podspec' to ensure this is a # valid spec before submitting. # # Any lines starting with a # are optional, but their use is encouraged # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html # Pod::Spec.new do |s| s.name = 'CommonTool' s.version = '1.1.2' s.summary = 'A fairly complete class of common tools and extensions tool' s.description = <<-DESC 'my daily development.' DESC s.homepage = '``` https://github.com/***/CommomTool.git```' # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' s.license = { :type => 'MIT', :file => 'LICENSE' } s.author = { '***' => '**@163.com' } s.source = { :git => ' https://github.com/***/CommomTool.git', :tag => s.version } s.social_media_url = '你的地址' s.ios.deployment_target = '9.0' s.source_files = 'CommonTool/Classes/**/*' # s.resource_bundles = { # 'CommonTool' => ['CommmonTool/Assets/*.png'] # } # s.public_header_files = 'Pod/Classes/**/*.h' # s.frameworks = 'UIKit', 'MapKit' # s.dependency 'AFNetworking', '~> 2.3' end
-
验证spec文件
终端进入CommonTool文件夹中进行
pod lib lint
来进行验证。一般来说会有warn。这时我们就需要输入````pod lib lint --allow-warnings ```来允许警告 这时一般来说就成功了。
上面的警告一般都是因为我们没有在新的代码库中上传代码的原因。
备注上面的这些命令可以加上--verbose来显示详情。
显示下面这样就是成功的意思
-> CommonTool (1.1.2) CommonTool passed validation.
上面是建立本地测试,我们还需要进行仓库有效性验证
pod spec lint
使用方法和本地的一致
当然在使用上面的方法过程中可能会出现下面的bug。
使用命令 pod lib lint 时,出现警告: The URL () is not reachable。这是我们就加上后面的--allow-warnings
-
将制作好的组件上传到自己的git仓库
cd /Users/yourMacName/Desktop/CommonTool git remote add origin https://github.com/xxx/CommonTool.git git add . git commit -m "注释描述" git push origin master //注意:如果你创建项目的时候生成了README或者license文件,那么这里你push的时候可能会push不了,如是你可用 git push origin master -f 强制提交,会覆盖之前的文件
-
给版本打一个分支
为仓库打tag,这个tag需要和spec文件中的版本保持一致
git tag -m "你的描述" 1.1.2 git push --tags
-
建立关联
将你项目中的spec文件push到第一步创建的私有库进行管理,可以用pod repo 命令查看你的私有库
在终端执行
pod repo push <本地索引库> <索引文件名>
, 提交索引文件到远程索引。例如pod repo push CommonToolRepo CommonTool.podspec
通过这一步我们就同步好了远程和本地索引库,到此,私有库已经制作完毕!
-
使用自己的私有库
到了这一步我们就可以使用自己的私有库了,
创建成功之后可能会出现search不到的情况,此时可删除本地搜索索引,然后再进行搜索
rm ~/Library/Caches/CocoaPods/search_index.json pod search DYCategoryKit
如果还是不行那就全清
pod cache clean --all rm -rf ~/Library/Caches/CocoaPods/search_index.json pod repo remove trunk pod repo update
这样基本上就出来了
私有仓库的使用你应该懂的,需要在Podfile添加source源
//如果还要添加公有pod,还需要加上这行 source 'https://github.com/CocoaPods/Specs.git' //私有pod仓库索引 source 'https://github.com/***/CommonToolSpecs.git' platform :ios, "9.0" target "XXX" do pod 'CommonTool' end
-
发布到cocoapods,成为公开库
如果要添加到
Cocoapods
的官方库了,可以使用trunk
工具,具体可以查看官方文档上面我们已经将代码源用podspec文件管理起来了。要让其他人能下载使用你的代码,就要让他找到podspec文件,所以我们要讲podspec文件放在网络上托管起来。
- 公有库:将podspec放在cocoPods官方提供的仓库https://github.com/CocoaPods/Specs.git上托管
- 私有库: 将podspec放在个人或者公司git仓库托管。
私有库只能放在公司或个人的git仓库,如果没有权限就不能使用,那么我们如果想要多人使用怎么办。就需要将podspec文件放到cocoapods公有库中
-
第一步注册cocoapods
pod trunk register 邮箱地址 '用户名' --verbose 加上--verbose可以输出详细debug信息,方便出错时查看。也可以不加
这里我们一般使用github邮箱和用户名, 然后在你的邮箱中会收到确认邮件, 在浏览器中点击链接确认即注册成功
-
验证cocoaPods
确保打开了邮件中的链接之后(正常加载出来就行),继续执行命令
pod trunk me
这是你会看到一下信息,如果没错就成功了。
-
发布
发布时会验证 Pod 的有效性,如果你在上面步骤中手动验证 Pod 时使用了 --use-libraries 或 --allow-warnings 等修饰符,那么发布的时候也应该使用相同的字段修饰,否则出现相同的报错。
pod trunk push ***.podspec
图是网上的 我的忘了截图。
-
这时候在pod trunk me就会看到你的详细信息了,里面包含这个库
-
删除私有库
删除一个私有
Spec Repo
,只需要执行一条命令即可pod repo remove CommonToolSpec
这样这个
Spec Repo
就在本地删除了,我们还可以通过$ pod repo add WTSpecs git@coding.net:wtlucky/WTSpecs.git
再把它给加回来。
如果我们要删除私有
Spec Repo
下的某一个podspec
怎么操作呢,此时无需借助Cocoapods
,只需要cd
到`~/.cocoapods/repos/CommonToolSpec目录下,删掉库目录~/.cocoapods/repos/WTSpecs$ rm -Rf PodTestLibrary
然后在将
Git
的变动push
到远端仓库即可git add --all . git ci -m "remove unuseful pods" git push origin master
git添加远程库的时候有可能出现如下的错误。
git报错:'fatal:remote origin already exists'怎么处理。这个的解决方法也很简单git remote rm origin
我们先把之前的删除就行
更新库
在我们想升级私有库新版本的时候,我们就需要重新发布一个版本
这时我们首先需要都上面的第六步,修改版本号,然后第七步校验。然后第八步第九步上传到github。最后第十二步直接上传到cocopods。由于我们注册了账号,十二步的前几个操作就不需要做了,直接上传即可
参考:组件化探究值私有库的创建
git报错:'fatal:remote origin already exists'怎么处理?附上git常用操作以及说明
### 遇到的一些问题 补充 2020.06
1、Could not find remote branch 1.1.3 to clone. fatal: Remote branch 1.1.3 not found in upstream origin
这个问题很简单,就是你创建tag的时候没有上传到master分支,它在新建的时候找不到这个分支或者tag就会报这个错误。
2.Unable to accept duplicate entry for: WCYKit (1.1.3)
这个是因为之前已经push过1.1.3版本了,所以你再次重新push会报错
解决方法:
方法一:重新添加标签。如1.1.4
方法二:移除本版本,然后重新push,在终端执行下面指令:
pod trunk delete WCYKit 1.1.4 (即:pod trunk delete 库名 版本号)
这条指令可以帮助移除某个版本,完成之后,可以pod setup一下,然后pod search,可以发现,该版本以及不存在了,这个时候就可以重新push版本