CocoaPods创建属于自己的Pod库

项目想要模块化、组件化,就必须了解如何创建CocoaPods库,如何创建CocoaPods库呢,今天我们就来动手开始从头建立属于自己的CocoaPods库吧!

创建公有pod库

1. 注册CocoaPods账户信息(已注册过请略过)

创建一个开源pod库, 首先我们需要注册CocoaPods账户, 使用trunk方式在终端执行:
$ pod trunk register '邮箱地址' '用户名'  --description=‘描述内容’ --verbose

可以使用GitHub邮箱和用户名, 然后在你的邮箱中会收到确认邮件在浏览器中点击链接确认即注册成功, 
成功之后可以终端执行:
$ pod trunk me

2. 创建共享库文件, 上传到公有仓库

GitHub上创建一个公开项目,创建指南 Using Pod Lib Create

如果自己新建的库,可以用下面代码创建
$ pod lib create 库名

项目中必须包含这几个文件:
1. 共享文件夹:文件夹存放着你要共享的内容, 也就是其他人pod得到的文件, .podspec文件中的
   source_files需要指定此文件路径及文件类型
2. LICENSE:开源许可证,默认一般选择MIT;
3. README.md:仓库说明
4. 库描述文件.podspec:本库的各项信息描述, 需要提交给CocoaPods, pod通过这个文件查找到你共享的库.

然后可以使用SourceTree等工具上传你的代码到公共仓库, 或使用命令行上传代码到远端仓库, 如何操作可以移步:Git常用命令.

3. 编辑*.podspec文件

.podspec是用Ruby的配置文件,描述你项目的信息,现在创建库后已自动生成*.podspec文件

自己想要创建podspec文件,执行以下命令
$ pod spec create 库名

.podspec文件内容

Pod::Spec.new do |s|
  s.name         = "LMBannerView" # 项目名称
  s.version      = "0.0.1"        # 版本号 与 你仓库的 标签号 对应
  s.summary      = "轮播图"        # 项目简介
  s.description  = <<-DESC
  这中间写描述内容
               DESC
  s.homepage     = "https://github.com/1805441570@qq.com/test" # 你的主页
  s.license      = { :type => 'MIT', :file => 'LICENSE' } # 开源证书
  s.author       = { "limeng" => "1805441570@qq.com" } # 作者信息
  # 你的仓库地址,不能用SSH地址
  s.source       = { :git => "https://github.com/limeng99/LMBannerView", :tag => "0.0.1"}
  # 代码位置, LMBannerView/**/*.{h,m} 表示 ** 文件夹下所有的.h和.m文件
  s.source_files     = "LMBannerView/Classes/*.{h,m}"
  s.requires_arc = true # 是否启用ARC
  s.platform     = :ios, "8.0" # 平台及支持的最低版本
  s.frameworks = "UIKit", "Foundation" # 支持的框架
  # s.dependency "AFNetworking", "~> 2.3" # 依赖库
end

验证 .podspec 文件的格式是否正确,cd*.podspec 文件所在的目录下

$ pod lib lint 库名.podspec --allow-warnings
例如: $ pod lib lint LMBannerView.podspec --allow-warnings

验证成功会出现:

-> LMBannerView  (0.0.1)

LMBannerView passed validation.

4. 给仓库打Tag

标签相当于将你的仓库的一个压缩包,用于稳定存储当前版本。标签号与你在 s.version = "0.0.1" 的版本号一致 0.0.1

创建标签
$ git tag -a 0.0.1 -m '标签说明'

推送到远程
$ git push origin --tags

5. 发布 *.podspec

仓库目录下执行
$ pod trunk push LMBannerView.podspec --allow-warnings

将你的 *.podspec 发布到公有的 speecs 上,这一步操作包括:
1. 更新本地 pods库 ~/.cocoaPods.repo/master
2. 验证*.podspec格式是否正确
3. 将 *.podspec 文件转成 JSON 格式
4. 对 master 仓库进行合并、提交

成功后会出现Congrats信息如下:

limMac-2:LMBannerView limengmeng$ pod trunk push LMBannerView.podspec --allow-warnings
Updating spec repo `trunk`
Validating podspec
 -> LMBannerView (0.1.3)
    - WARN  | github_sources: Github repositories should end in `.git`.
    - NOTE  | xcodebuild:  note: Using new build system
    - NOTE  | [iOS] xcodebuild:  note: Planning build
    - NOTE  | [iOS] xcodebuild:  note: Constructing build description
    - NOTE  | [iOS] xcodebuild:  warning: Skipping code signing because the target does not have an Info.plist file and one is not being generated automatically. (in target 'App' from project 'App')

Updating spec repo `trunk`

--------------------------------------------------------------------------------
 🎉  Congrats

 🚀  LMBannerView (0.1.3) successfully published
 📅  December 6th, 02:40
 🌎  https://cocoapods.org/pods/LMBannerView
 👍  Tell your friends!
--------------------------------------------------------------------------------

6. 使用仓库

发布到Cocoapods后,在终端更新本地pods仓库信息

$ pod setup
$ pod search LMBannerView

如果`search`出现以下错误:
[!] Unable to find a pod with name, author, summary, or description matching `LMBannerView`

删除 cocoapods 的索引,然后重新 search
$ rm ~/Library/Caches/CocoaPods/search_index.json
$ pod search LMBannerView
终端输出:Creating search index for spec repo 'artsy'.. Done!
会触发cocoapods重新拉这个索引文件

7. 更新维护

  • 更新 *.podspec 中的版本号
  • 打上标签推送流程
  • pod trunk push *.podspec 推送到pods仓库

8. 遇到的问题

  • xcodebuild: Returned an unsuccessful exit code. error,*.podspec 文件里面设置的 s.ios.deployment_target = '8.0',最低支持版本为 8.0,而在代码里面用到 了 xib,里面勾了 Use Safe Area Layout Guides,项目支持最低版本为 9.0Build 不会报错,执行 pod lib lint *.podspecxcodebuild: Returned an unsuccessful exit code.,原来是 Use Safe Area Layout Guides 的问题,修改 *.podspec 文件 s.ios.deployment_target = '9.0' 修复了这个问题

  • xibUse Safe Area Layout Guides error, 修改 xibBuilds for 选项 改为 Deployment Target (9.0)

创建私有库

私有Pod库和公有Pod库的创建方式没有什么区别, 不一样的是管理他们的spec repo不一样

所以我们需要自己创建一个跟CocoaPods/Specs类似的仓库来管理内部创建的Pod库的podspec文件, 供内部人员更新和依赖使用内部Pod组件库。
私有repo的构建形式有两种, 一种是私有git服务器上面创建,一种是本机创建。本机创建请参考官方文档:Private Pods.

这里介绍的是在公司内部搭建的git服务器上面创建整个服务的方式。

1. 创建一个git仓库用来做内部私有库的Spec Repo

在私有服务器创建一个仓库,一个用来存放所有共享库的podspec, 这里创建好之后的内部SSH协议地址是:git@git.xxxx:podspecs/xxx.git, 创建的私有仓库给到的http/https地址也一样.终端输入命令:

$ pod repo add PodSpec git@git.xxxx:podspecs/xxx.git

将PodSpec添加到本地repo, 添加成功后可以在/.cocoapods/repos/目录下可以看到官方的specs:master和刚刚加入的specs:PodSpec

2. 创建私有Pod组件库

这一步跟上面创建共有pod库方式是一致的。即创建git工程,podspace文件,pod lib lint , 打tag 。但不是用trunk方式提交到master上

3. 将podspec加入私有Sepc repo中

公有库使用trunk方式将.podspec文件发布到CocoaPods/Specs, 内部的pod组件库则是添加到我们第一步创建的私有Spec repo中去, 在终端执行:

$ pod repo push podspec名称  Demo.podspec

添加成功之后PodSpec中会包含新建Demo库的podspec信息, 可以前往~/.cocoapods/repos下的PodSpec文件夹中查看, 同时git服务器中的远端也更新了.

4.查找和使用内部组件库

执行pod search Demo库 就能查到刚刚创建好的库了,然后在想要使用此组件的工程的Podfile中加入pod 'Demo', '~>0.0.1'即可使用内部组件啦!
值得注意的是:必须在Podfile前面需要添加你的私有Spec repo的git地址source, pod install时, 才能在私有repo中查找到私有库, 像这样:

source 'git@git.xxx.net:podspecs/PodSpec.git'
    
    platform :ios, '9.0'
    target "test" do
        pod 'Demo', '~>0.0.1'
    end

本文首发于我的个人博客 https://limeng99.club/,转载请标明出处。

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