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索引文件.

  • 根据出现的下拉菜单,按需填写
屏幕快照 2019-02-15 下午2.08.42.png

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

屏幕快照 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' => 'niujf@kingnet.com' }
  s.source           = { :git => 'https://github.com/XXXX/NJFLibTest.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
  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'
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)

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


屏幕快照 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 <file>..." 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

参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容