使用cocoapods
私有库能够更好的帮助我们实现组件化开发,大体分为五部分+坑
官网链接
1.私有仓库pod repo
的创建
- 私有仓库本地安装
$ pod repo add YourRepo xxx.xxx.git
YourRepo
是你自己私有库的名称
xxx.xxx.git
是你私有库的地址
私有库是用来存放podspec
索引文件的仓库,不存放代码,一个私有库可以对应N
个podspec
- 查看本地私有仓库
$ cd ~/.cocoapods/repos
$ ls
或者
$ pod repo
可查看此文件夹下,除了官方的master
仓库,还会有自己刚刚安装的YourRepo
私有仓库。
- 私有仓库的移除
pod repo remove [name]
2.代码仓库的创建
- cd 本地创建的文件夹
- 使用cocoapods命令:pod lib create xxxxLib
xxxxLib
是你自己组件代码的名称
这个命令会自动生成一套组件代码工程测试代码,并且有Git
管理
还会生成podspec
索引文件.
- 根据出现的下拉菜单,按需填写
上面依次对应平台类型 、 语言 、 Demo 、 测试框架 、 界面测试 、 类前缀 等,填完之后Enter,会生成如下图的工程目录代码。
把 ReplaceMe.m 文件替换你自己的组件代码
cd 到 Example 然后执行 pod install/pod update
需要需要重新
pod install
,因为不重新pod install
,Example
工程根本不知道Pod
更新了,pod install
的作用:重新让pod
库与所依赖的工程文件产生关联。
- cd 到 NJFLibTest 把代码上传到远程仓库
注意文件层级关系
NJFLibTest
不是与Example
同级的文件,是上一层文件 ,我们可以用command+shift+.
查看,一般是有.git
隐藏文件的上一级文件
远程仓库不需要创建gitignore
文件,因为pod lib
创建了
提交自己仓库代码到远程仓库
git status : 查看状态,如果有不想要的文件,可以用gitignore忽略掉
提交到本地缓存区 $git add .
提交到本地仓库 $git commit -m "初始化提交"
查看远程仓库地址 $git remote -v(查看有没有远程地址)
绑定远程地址 $git remote add origin xxxx.xxx.git
推送自己代码到远程仓库 $git push -u origin master
删除远程仓库地址 $git remote rm origin
如果推送成功,可以在远程仓库看到自己的提交
- 添加tag
$ git tag -a 0.0.1 -m '0.1.0'
$ git push --tags
查看本地tag
$ git tag
需要注意的是,这个
tag
需要与podspec
里的version
号一致,否则在提交podspec
到pod
远程仓库的时候会出错。
- 修改podspec索引文件
Pod::Spec.new do |s|
s.name = 'NJFLibTest'
s.version = '0.0.1' ///'注意,要与你打的tag一致'
s.summary = 'A short description of NJFLibTest.'
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/XXXXX/NJFLibTest' ///'后缀不要带.git'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'Miko-J' => '[email protected]' }
s.source = { :git => 'https://github.com/XXXX/NJFLibTest.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/'
s.ios.deployment_target = '8.0'
s.source_files = 'NJFLibTest/Classes/**/*'
# s.resource_bundles = {
# 'NJFLibTest' => ['NJFLibTest/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 3.2.1'
s.version
对应的版本号就是上面打的tag
s.homepage
和s.source
里面的路径要替换成你的 远程仓库地址
**表示所有文件
*表示通配符,可有可无.
- 执行$ pod lib lint 本地检查pod spec合法性
如果要出现
error
要修改,如果只有警告可以使用
$ pod lib lint --allow-warnings
如果出现NJFLibTest passed validation
则说明验证通过
- 执行$ pod spec lint 远程检查pod spec合法性
如果要出现
error
要修改,如果只有警告可以使用
$ pod spec lint --allow-warnings
如果出现NJFLibTest.podsepc passed validation
则说明验证通过
3.把自己私有库的索引podsepc添加到自己私有库中
$ pod repo push YourRepo ~/Desktop/xxxx/NJFLibTest.podspec
如果执行成功,刷新一下远程索引库,可以看到你更新的NJFLibTest/0.01
了
4.新建项目repoTest,引用自己的私有索引仓库
在Podfile
文件中编辑如下
# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'
use_frameworks!
source 'https://github.com/xxxxxx/xx.git' //自己私有库source源
source 'https://github.com/CocoaPods/Specs.git' //官方的source源
target 'repoTest' do
pod 'NJFLibTest' //自己创建的组件
end
然后pod install就可以了
5.进阶
- 更新代码仓库或者添加依赖库
更新代码仓库:很简单,从 ReplaceMe.m
文件替换你自己的组件代码,这里开始,跟上面的步骤一样
1.更新代码
2.进Example
,执行pod update
3.提交代码到远程仓库
4.打tag
,更新.podspec
文件,检查pod sepc
的合法性
5.添加索引到自己的私有库中
添加依赖库: 打开.podspec
文件 执行s.dependency 'AFNetworking', '~> 3.2.1'
- 子库Subspecs
先看一个简单的例子:
$ pod search 'SDWebImage'
可以看到,如果我们只需要用到SDWebImage
中的Core
功能,那么并不需要将整个SDWebImage
都下载下来,在Podfile
中将pod 'SDWebImage'
改为 pod SDWebImage/Core
即可单独使用这一功能
子库格式:
s.subspec '子库名称' do |别名|
end
因为这里已经分离出子库了,所以s.source_files
和s.dependency
就不能这么使用了,需要我们在子库里分别指定,所以我们直接把原来的s.source_files
和s.dependency
都注释掉。写法参考如下:
# s.source_files = 'NJFLibTest/Classes/**/*'
# s.dependency 'AFNetworking', '~> 3.2.1'
s.subspec 'ThirdLibs' do |t|
t.source_files = 'NJFLibTest/Classes/ThirdLibs/**/*'
t.dependency 'AFNetworking', '~> 3.2.1'
end
s.subspec 'Category' do |c|
c.source_files = 'NJFLibTest/Classes/Category/**/*'
end
s.subspec 'Configuration' do |c|
c.source_files = 'NJFLibTest/Classes/Configuration/**/*'
end
如果更新索引库后,可以在远程索引库中看到最新的版本
每次改动记得
tag
值要变一下,如果执行$ pod spec lint
遇到错误file patterns: The source_files pattern did not match any file.
更新tag
在尝试一下
搜索私有库
$ pod search NJFLibTest
可以看到最终结果:
-> NJFLibTest (0.0.3)
A short description of NJFLibTest.
pod 'NJFLibTest', '~> 0.0.3'
- Homepage: https://github.com/XXXXXX
- Source: https://github.com/XXXXX.git
- Versions: 0.0.3, 0.0.1 [NJF_PrivateRepo repo]
- Subspecs:
- NJFLibTest/AFNTool (0.0.3)
- NJFLibTest/Category (0.0.3)
- NJFLibTest/Configuration (0.0.3)
在项目中如果引用所有的库目录结构应该是这个样子,引用个别子库我就不贴了,大家试一下就知道了
可能遇到的坑
- 冲突
To https://github.com/Miko-J/NJF_RepoCode.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'https://github.com/Miko-J/NJF_RepoCode.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
遇到这种情况,我们先拉一下远程仓库的代码
$ git pull origin master
如果发现
fatal: refusing to merge unrelated histories //'分支拒绝了无历史关联的合并'
我们可以使用下面的命令
$ git pull origin master --allow-unrelated-histories
这个时候我们要查看一下状态
$ git status
如果有冲突,就解决冲突
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add ..." to mark resolution)
both added: .gitignore
both added: LICENSE
这里lz
简单粗暴直接本地文件覆盖远程
$ git push -u origin master -f
如果能提交,可以刷新一下远程仓库的代码看一下
- 库的索引
podsepc
添加到自己私有库中出现XXXXXX.podspec specification does not validate.
$ pod repo push YourRepo ~/Desktop/xxxx/NJFLibTest.podspec --verbose --use-libraries --allow-warnings
参考链接