iOS包依赖管理工具(三):创建自己的 Pod 库

一、前言

我们已经学习了 CocoaPods 的使用和基本原理知识,我们在项目开发中,不可避免的要工程化与组件化,因此,需要开发自己的 pod 组件,本文将带领大家如何创建自己的 pod 库,并发布至 pod trunk。

二、自定义 pod 库

2.1、创建 pod 库

  • 先初始化 Pod
pod-init.png
  • 然后再 pod install ,最终结果如下:
pod-install.png
  • 创建自定义 Pod 库::
// 命令行
$ pod lib create XXX

整个创建过程如下图:

pod-lib-create.png

2.2、pod template 分析

pod-template.png

上图标示的非常清楚了:

  • 我们虽然是创建 pod lib,实现是下载 pod template;
  • 根据我们的输入选项,最终生成一个自带『工程』+『Pod Library』的完整项目;
  • 左侧 Xcode 目录区就展示是『工程』如何引用『Pod lib』;

2.3、Example 的 Podfile 分析

pod-file.png

一目了然,pod 只需要指明 path,如果不给 path,pod 会自动从 pod repo 中去寻找,这里,我们给定一个本地的 path,pod 就知道了;后面,我们会重新调整这个目录结构。

2.4、podspec 文件

我们先来看一下 podspec 文件内容

podspec.png

重点是1、2两个区域,其它信息,都是根据你的 git 的 config 读取的信息默认生成的,并不准确,后面上传至 git 时,会修改这里,如果仅是本地使用,这可以无视。

三、调整目录 & 引入项目

3.1、调整 pod lib 目录

删除如下,只留我们需要的文件和目录:

adjust-dir-files.png

3.2、修改 podspec

Pod::Spec.new do |s|
  s.name             = 'PodLogger'
  s.version          = '1.0.0'
  s.summary          = 'A pod library demo'

  s.description      = <<-DESC
  TODO: Add long description of the pod here.
  DESC

  # 先修改为之后要提交到 github 上的地址
  s.homepage         = 'https://github.com/qingye/PodLogger'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { '青叶小小' => '24854015@qq.com' }
  s.source           = { :git => 'https://github.com/qingye/PodLogger.git', :tag => s.version.to_s }

  s.ios.deployment_target = '10.0'
  s.source_files = 'PodLogger/**/*'

end

3.3、本地工程引入

local-import.png

接下来,我们在主工程下 pod install --verbose 一下,结果如下图:

re-pod-install.png

3.4、实现 Logger.swift

public struct Logger {
    var DEBUG: Bool = false
    
    public init(_ DEBUG: Bool) {
        self.DEBUG = DEBUG
    }
    
    public func log(_ msg: String) {
        print("Pod..Logger => \(msg)")
    }
}

3.5、测试 pod lib

local-proj-test.png

四、上云( github )

\color{red}{注:命令行到 PodLogger 根目录下}

4.1、创建 github 仓库

github-repo-create.png

4.2、提交 & tag

操作步骤如下:

  1. git add .
  2. git commit -m “xxx"
$ git add .
$ git commit -m "pod lib for demo"
[master 7256090] pod lib for demo
 19 files changed, 38 insertions(+), 1050 deletions(-)
 delete mode 100644 Example/PodLogger.xcodeproj/project.pbxproj
 delete mode 100644 Example/PodLogger.xcodeproj/project.xcworkspace/contents.xcworkspacedata
 delete mode 100644 Example/PodLogger.xcodeproj/xcshareddata/xcschemes/PodLogger-Example.xcscheme
 delete mode 100644 Example/PodLogger/AppDelegate.swift
 delete mode 100644 Example/PodLogger/Base.lproj/LaunchScreen.xib
 delete mode 100644 Example/PodLogger/Base.lproj/Main.storyboard
 delete mode 100644 Example/PodLogger/Images.xcassets/AppIcon.appiconset/Contents.json
 delete mode 100644 Example/PodLogger/Info.plist
 delete mode 100644 Example/PodLogger/ViewController.swift
 delete mode 100644 Example/Podfile
 delete mode 100644 Example/Tests/Info.plist
 delete mode 100644 Example/Tests/Tests.swift
 rewrite PodLogger.podspec (73%)
 delete mode 100644 PodLogger/Assets/.gitkeep
 delete mode 100644 PodLogger/Classes/.gitkeep
 delete mode 100644 PodLogger/Classes/ReplaceMe.swift
 create mode 100644 PodLogger/Logger.swift
 delete mode 120000 _Pods.xcodeproj
  1. git remote add origin 远程代码仓库地址
  2. git push origin master
$ git remote add origin https://github.com/qingye/PodLogger.git
$ git push origin master
Counting objects: 40, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (33/33), done.
Writing objects: 100% (40/40), 14.39 KiB | 2.05 MiB/s, done.
Total 40 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), done.
remote: 
remote: Create a pull request for 'master' on GitHub by visiting:
remote:      https://github.com/qingye/PodLogger/pull/new/master
remote: 
To https://github.com/qingye/PodLogger.git
 * [new branch]      master -> master
  1. git tag 版本号 (注:这里的版本号必须和podspec里写的版本号一致)
  2. git push --tags
$ git tag 1.0.0
$ git push --tags
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/qingye/PodLogger.git
 * [new tag]         1.0.0 -> 1.0.0

4.3、验证 & 提交至 pod

  1. 验证:pod spec lint --verbose --allow-warnings
pod-spec-lint.png
  1. 如果还没有注册过 pod trunk,可以如下注册
$ pod trunk register 24854015@qq.com '青叶' --description='Personal PodLib'
[!] Please verify the session by clicking the link in the verification email that has been sent to 24854015@qq.com
  1. 邮箱验证
mail-verify.png

点击验证链接:

verify-success.png
  1. 命令行查看 pod 账户
$ pod trunk me
  - Name:     青叶
  - Email:    24854015@qq.com
  - Since:    March 2nd, 00:58
  - Pods:     None
  - Sessions:
    - March 2nd, 00:58 - July 8th, 01:05. IP: 203.156.215.154 Description: Personal PodLib
  1. 提交索引至远程仓库

根据 CocoaPods 官方描述:
公有库发布(全体可见):pod trunk push [NAME.podspec]
私有库发布(自己可见):pod repo push REPO [NAME.podspec]

如果报如下错误,就是没有注册,请回看第2步:

error-no-register.png
  • 公库提交
pod trunk push PodLogger.podspec --verbose --allow-warnings
  • 私库提交
pod repo push PodLogger PodLogger.podspec --verbose --allow-warnings

我这里是用『公有库』提交的,提交完结果如下:

pod-trunk-push.png

我们可以去 CocoaPods/Specs 中去查看,已经被索引了:

find-index-ok.png

4.4、更新本地 pod repo

如果此时,你直接使用 pod search 会发现找不到自己的库:

$ pod search PodLogger

虽然我们提交至 pod trunk(即 pod specs)成功,但是我们本地还没有,所以,我们需要先更新一下本地的 pod 仓库:

$ pod repo update
Updating spec repo `master`
  $ /usr/local/bin/git -C /Users/chris/.cocoapods/repos/master fetch origin --progress
  remote: Enumerating objects: 15, done.        
  remote: Counting objects: 100% (15/15), done.        
  remote: Compressing objects: 100% (9/9), done.        
  remote: Total 9 (delta 5), reused 0 (delta 0), pack-reused 0        
  From https://github.com/CocoaPods/Specs
     ab416c347b51..3bd397424c41  master     -> origin/master
  $ /usr/local/bin/git -C /Users/chris/.cocoapods/repos/master rev-parse --abbrev-ref HEAD
  master
  $ /usr/local/bin/git -C /Users/chris/.cocoapods/repos/master reset --hard origin/master
  HEAD is now at 3bd397424c41 [Add] AudioLibrary 0.7
Updating spec repo `trunk`

如果本地已有(默认如下路径):

~/.cocoapods/repos

但还是搜索不到,那可能需要重建搜索索引(search_index.json),路径在:

~/Library/Caches/CocoaPods

删除该索引文件,然后再执行 search,如下(会提示创建索引中....完成后,就有了):

$ pod search PodLogger
Creating search index for spec repo 'master'.. Done!

-> PodLogger (1.0.0)
   A pod library demo
   pod 'PodLogger', '~> 1.0.0'
   - Homepage: https://github.com/qingye/PodLogger
   - Source:   https://github.com/qingye/PodLogger.git
   - Versions: 1.0.0 [master repo]

4.5、修改主工程

# Uncomment the next line to define a global platform for your project
platform :ios, '10.0'

target 'PodDemo' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # 默认使用最新的版本,即 1.0.0
  pod 'PodLogger'

end

然后 pod install --verbose

$ pod install --verbose
Analyzing dependencies
Downloading dependencies
Installing PodLogger (1.0.0)
Generating Pods project
Integrating client project
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

重新编译运行工程,结果如下:

remote-pod-lib.png

注意:我们的 pod 库发布后,再引入,pod lib 将不再放在『Development Pods』下面,还是在『Pods』下面了!

至此,所有与 CocoaPods 相关的知识我们就分享在这,虽然还有很多其它的知识点,但核心点主要是这些!

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

推荐阅读更多精彩内容