cocoapods私有库的创建和使用

使用cocoapods私有库能够更好的帮助我们实现组件化开发,大体分为五部分+坑

官网链接

1.私有仓库pod repo的创建

  • 私有仓库本地安装
$ pod repo add YourRepo xxx.xxx.git

YourRepo是你自己私有库的名称
xxx.xxx.git是你私有库的地址
私有库是用来存放podspec索引文件的仓库,不存放代码,一个私有库可以对应Npodspec

  • 查看本地私有仓库
$ cd ~/.cocoapods/repos
$ ls
或者
$ pod repo

可查看此文件夹下,除了官方的master仓库,还会有自己刚刚安装的YourRepo私有仓库。

  • 私有仓库的移除
pod repo remove [name]

2.代码仓库的创建

  • cd 本地创建的文件夹
  • 使用cocoapods命令:pod lib create xxxxLib

xxxxLib是你自己组件代码的名称
这个命令会自动生成一套组件代码工程测试代码,并且有Git管理
还会生成podspec索引文件.

  • 根据出现的下拉菜单,按需填写
cocoapods私有库的创建和使用_第1张图片
屏幕快照 2019-02-15 下午2.08.42.png

上面依次对应平台类型 、 语言 、 Demo 、 测试框架 、 界面测试 、 类前缀 等,填完之后Enter,会生成如下图的工程目录代码。

cocoapods私有库的创建和使用_第2张图片
屏幕快照 2019-02-15 下午2.15.06.png
  • 把 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号一致,否则在提交podspecpod远程仓库的时候会出错。

  • 修改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.homepages.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'
cocoapods私有库的创建和使用_第3张图片
image.png

可以看到,如果我们只需要用到SDWebImage中的Core功能,那么并不需要将整个SDWebImage都下载下来,在Podfile中将pod 'SDWebImage'改为 pod SDWebImage/Core即可单独使用这一功能

子库格式:

s.subspec '子库名称' do |别名|

end

因为这里已经分离出子库了,所以s.source_filess.dependency就不能这么使用了,需要我们在子库里分别指定,所以我们直接把原来的s.source_filess.dependency都注释掉。写法参考如下:

屏幕快照 2019-04-04 下午4.40.04.png

  # 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)

在项目中如果引用所有的库目录结构应该是这个样子,引用个别子库我就不贴了,大家试一下就知道了


cocoapods私有库的创建和使用_第4张图片
屏幕快照 2019-04-04 下午4.59.42.png

可能遇到的坑

  • 冲突
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

参考链接

你可能感兴趣的:(cocoapods私有库的创建和使用)