在iOS项目开发中,我们制作自己的远程私有库或者开源库,然后用pod方式来安装或者移除比我们手动去删除或者集成更加的简单而且也不容易出错,管理起来更加方便。我们一般选择在github或者gittee、gitLab上创建自己的开源库或私有库,开源库和私有库原理是一样的,本文是主要关于私有库的制作和后期管理的。
一、制作自己的私有库
如果我们电脑里面安装了cocoaPod
,那么在本地电脑的用户目录下会有隐藏文件夹.cocoapods/repos
, 查看隐藏文件夹通过 command + shift + . 可以看到自己电脑里面包含的cocoapod官方索引库和自己的索引库(如果有的话)
我们平常去
pod repo update
更新pod库时就是在更新这里面的索引库, 如果你看不到自己制作的索引库,那么我们接下来开始制作一个!
1. 创建自己的远程索引库
我们一般选择创建一个私有库,这里使用gitee网站为远程库为例:
私有库自己命名,比如:
xxxxSpec
,这个库专门用来放索引文件的,可以放项目相关的多个私有库的索引文件,创建好接下来是将远程私有库拷贝到本地索引库做关联
(做关联这一步让我们可以命名自己的本地索引库).
pod repo add xxxxSpec http://gitee.***.***/xxx/xxxspecs.git
这一步下来我们可以使用pod repo
命令来查看是否已经在本地创建,或者直接在上述文件夹中查看。
2. 创建存放代码的远程仓库
远程仓库创建的方式跟上面索引库一样,名字比如为ZLFastUI,接下来创建对应的pod组件库.
pod lib create ZLFastUI // 回车之后会让你回答问题
What platform do you want to use?? [ iOS / macOS ]
> iOS
What language do you want to use?? [ Swift / ObjC ]
> ObjC
Would you like to include a demo application with your library? [ Yes / No ]
> Yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
Would you like to do view based testing? [ Yes / No ]
> Yes
What is your class prefix?
> ZL
上面步骤之后会帮你创建一个文件夹,里面包含了样板工程 + 类库文件夹 + ZLFastUI.podspec.
3. 将自己的文件放到上图ZLFastUI/Classes/中
在Example中打开自己的工程,执行pod install, 在Example中使用运行没问题了,接下来编辑好ZLFastUI.podspec
文件
Pod::Spec.new do |s|
s.name = 'ZLFastUI'
s.version = '0.2.1' // 这里是类库的版本号
s.summary = '这是一个OC的基于UIKit里面控件写的一个方便快速创建界面的库.'
s.description = <<-DESC
本库封装了我们通常创建一个UI控件时会设置的属性和一些UI相关的尺寸计算及常用的宏定义。UI创建方面是封装在对应控件类分类中,集成这个库后,我们创建对应UI控件可以调用对应分类的方法来快速实现.
DESC
s.homepage = 'https://gitee.com/smile_dandy/zlfast-uikit'// 库的介绍主页
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'dandy_zhouli' => '[email protected]' }
s.source = { :git => 'https://gitee.com/smile_dandy/zlfast-uikit.git', :tag => s.version.to_s } // 这里放的是具体的私有代码仓库的地址,不是索引仓库的地址
s.ios.deployment_target = '9.0'
s.source_files = 'ZLFastUI/Classes/**/*{h,m}'
end
上述填好之后进行下一步验证podspec文件有没有填对, 回到最外层的ZLFastUI文件夹
cd 拖最外层文件夹ZLFastUI到这里按回车
pod lib lint --allow-warnings // 执行这行命令行检查
如果检查正确了会提示
ZLFastUI passed validation.
4.将pod生成的lib库提交到远程
命令行现在还是在最外层的,接下来执行命令行
git remote add origin https://gitee.com/smile_dandy/zlfast-uikit.git // 将lib库添加到远程私有库,这个远程库地址是第二步自己创建的那个
git add .
git commit -a -m "第一次提交 版本为0.0.1"
git push -u origin master
git tag 0.2.1 // 这里要跟podspec文件中的s.version保持一致
git push --tag(将tag提交到远程)
上述命令行完成后,代码就已经成功上传到远程代码私有库中了,可以去网站查看下提交记录。接下来把索引添加到索引私有库:
pod repo push xxxxSpec ZLFastUI.podspec --allow-warnings // 前面的那个是自己在第一步创建的本地的索引库,后面的那个是lib中的podspec文件
这一步做了两个操作:一个是将其推送到私有的远程索引仓库,可以去网站对应的索引仓库中查看;另一个是将其 copy 到对应的本地索引仓库,这个可以去目录:/Users/admin/.cocoapods/repos/ZLFastUIKitSpec 下查看到对应的文件夹。
如果都成功了,可以使用pod search ZLFastUI
搜索到自己制作的。
二、在工程中使用自己制作的私有库
在使用时Podfile文件的写法:在顶部写上source源的地址,如:
source 'https://gitee.com/xxxx/xxxxSpec.git'// 这里是放自己私有库的索引库地址的,不要放私有库代码地址去了
source 'https://github.com/CocoaPods/Specs.git'// 使用了私有的,那么这个官方的也要加上,如果不加上,那么在github上的三方库会pod install不成功!
pod 'ZLKit', '~> 0.2.1'
执行pod install
Podfile语法参考
四、私有库更新
- 改好类库文件代码,执行没有错误之后,修改
ZLFastUI.podspec
文件,修改s.version = '0.2.2' - 执行pod lib lint --allow-warnings
- 回到lib库最外层文件夹,跟这一步一样的操作
4.将pod生成的lib库提交到远程
- 在使用的项目中Podfile修改对应版本号执行pod install就会找到新的版本安装。
五、关于使用cocoapods时可能存在的一些问题
- 有的第三方的库由于网络很难pod install成功
cocoapods的三方库缓存在下面两个地方,我们只需要从别人电脑中拷贝对应版本的代码到那两个地方就可以pod install成功
1.~/Library/Caches/CocoaPods/Release
2.~/Library/Caches/CocoaPods/Pods/Specs/Release
六、更新本地索引库
远程对应的私有索引库更新了,而我们本地的索引库却还停留在原地,我们需要更新本地私有库索引库,更新时指定只更新自己的索引库,否则会更新cocoapod索引,太慢了!
pod repo update ZLFastUIKitSpec // ZLFastUIKitSpec是你的本地索引库的名字
// 也可以删掉本地.cocoapods/repos里面的本地索引库,然后重新添加远程私有索引库到本地
pod repo add ZLFastUIKitSpec https://gitee.com/xxxx/xxxxspec.git
七、给私有库中文件分文件夹
我们在如上这样制作私有库后,会发现在一个新建工程中pod下来,所有文件都在一个文件夹中,如果库中文件多了的话就很不方面查看了,所以接下来我们来给私有库分一下文件夹。
- 首先在Classes文件夹中先将文件放到对应的文件夹
- 其次修改
.podspec
文件, 通过建立subspec
来修改索引,具体如下:
// s.source_files = 'ZLFastUI/Classes/**/*{h,m}'
s.source_files = 'ZLFastUI/Classes/*{h,m}' // 这里因为我只引用Classes文件夹下文件,子文件下文件分到subspec中引用了。
s.subspec 'Tools' do |ss|
ss.source_files = 'ZLFastUI/Classes/Tools/*.{h,m}'
end
s.subspec 'Extension' do |ss|
ss.source_files = 'ZLFastUI/Classes/Extension/*.{h,m}'
end
s.subspec 'CustomUI' do |ss|
ss.source_files = 'ZLFastUI/Classes/CustomUI/*.{h,m}'
ss.dependency 'ZLFastUI/Tools' // CustomUI中用到了Tools中内容
ss.dependency 'ZLFastUI/Extension'// CustomUI中用到了Extension中内容
end
- 改好后,更新一个私有库版本到远程
- 在自己测试项目的Podfile里面写新版本,
pod install
下来就可以看到分好文件夹了, 谢谢!
八、使用脚本来自动化更新私有库
cocopods私有库的更新
九、创建Pod本地库
有的模块的内容我们不想使用私有库的形式管理,只希望是跟随项目来自动变,但是又希望通过pod来集成或卸载,这个时候我们就可以创建一个本地库,方法如下:(前提是项目已安装好pod)
- 在项目的根目录下创建一个文件夹,这个文件夹专门用来存项目本地库的,比如我们在里面创建一个
AJCategory
. - cd 到
AJCategory
文件夹,然后执行下面命令行创建AJCategory.podspec
文件。
pod spec create AJCategory
- 再新建一个LICENSE文件,放在AJCategory文件夹下,LICENSE文件的内容是:
The MIT License (MIT)
Copyright © 2018
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
新建一个Classes文件夹,放在AJCategory文件夹下,把自己要制作成本地库的文件放到Classes文件夹内。
- 编辑好podspec文件,跟私有库类似,下面是一个模板:
spec.name = "AJCategory"
spec.version = "0.0.1"
spec.summary = "about colors use in project."
spec.description = <<-DESC
集成了项目中使用的颜色的情况 集成了项目中使用的颜色的情况
DESC
spec.homepage = "https://www.qyizhong.cn" // 瞎写的
spec.license = "LICENSE"
spec.source = { :git => "", :tag => "#{spec.version}" }
spec.source_files = "Classes", "Classes/**/*.{h,m}"
spec.exclude_files = "Classes/Exclude"
- cd 到podspec文件所在目录,执行命令行
pod lib lint --allow-warnings
去检查一下。
如果是这个报错是可以不用改的
pod lib lint --allow-warnings
nil versions are discouraged and will be deprecated in Rubygems 4
-> AJCategory (0.0.1)
- ERROR | [OSX] xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information.
- 在项目的Podfile文件中使用
pod 'AJCategory', :path => './LocolLib/AJCategory'
8.cd 到项目所在目录下,执行pod install
.