创建自己的CocoaPods公有库


我把我整个灵魂都给你,连同它的怪癖,耍小脾气,忽明忽暗,一千八百种坏毛病。它真讨厌,只有一点好,爱你。
——王小波《爱你就像爱生命》

前言

什么是CocoaPods

  • CocoaPods 是一个 objc/swift 的第三类库依赖管理工具,而其本身是利用 ruby 的依赖管理 gem 进行构建的.
  • 通过CocoaPods工具我们可以为项目添加被称为“Pods”的依赖库(这些类库必须是CocoaPods本身所支持的),并且可以轻松管理其版本。

CocoaPods的好处

  • 1、在引入第三方库时它可以自动为我们完成各种各样的配置,包括配置编译阶段、连接器选项、甚至是ARC环境下的-fno-objc-arc配置等。
  • 2、使用CocoaPods可以很方便地查找新的第三方库,这些类库是比较“标准的”,而不是网上随便找到的,这样可以让我们找到真正好用的类库。

CocoaPods安装

如何制作自己的CocoaPods(公有)库

  • 想要制作自己的CocoaPods(公有)库,我们需要先大概了解一下CocoaPods的两个文件Podfile / Podspec

Podfile

  • podfile 是一个文件,用于定义项目所需要使用的第三方库。
  • 该文件支持高度定制,你可以根据个人喜好对其做出定制。更多相关信息,请查阅 Podfile 指南

Podspec

  • .podspec 也是一个文件,该文件描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework、编译选项和某个库所需要的依赖等。

  • 在我们执行pod install 命令加载第三方库的时候, 会先从远程Podspecs仓库拉取最新的包括版本信息在内的所有的第三方库的列表。

  • 存储在本地路径 ~/.cocoapods 中,先显示系统隐藏文件后才可以看到隐藏文件。

1
defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder
  • 使用终端进入查看仓库的远程地址
1
2
3
4
5
cd ~/.cocoapods/repos/master
git remote -v
// 拉取和更新地址
origin https://github.com/CocoaPods/Specs.git (fetch)
origin https://github.com/CocoaPods/Specs.git (push)
  • https://github.com/CocoaPods/Specs.git 实际就是CocoaPods的GitHub仓库地址。
  • 我们如果一直进入~/.cocoapods/repos/master
    • 就会发现里面的每一个文件夹下都是三方库列表
    • 每一个三方库文件下存放的是对应的版本号文件夹
    • 而对应的版本号文件夹里面则只存在唯一的一个以 三方库名称.podspec.json的文件, 我们看一下GoogleMaps大概的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"authors": "Google, Inc.",
"description": "Use the Google Maps SDK for iOS to enrich your app with interactive maps, immersive Street View panoramas, and detailed information from Google's Places database.",
"homepage": "https://developers.google.com/maps/documentation/ios/",
"license": { // 开源协议
// ...
},
"name": "GoogleMaps", // 三方库名称
"platforms": { // 三方库平台及版本
"ios": "8.0"
},
"preserve_paths": [
// ...
],
"source": {
"http": "https://dl.google.com/dl/cpdc/f4086b0aa122de6c/GoogleMaps-2.7.0.tar.gz" // 三方库源码
},
"summary": "Google Maps SDK for iOS.", // 三方库描述
"version": "2.7.0", // 三方库版本
}
  • 我们尝试在终端搜索一下第三方库GoogleMaps
1
2
3
4
5
6
7
8
9
10
11
// pod search GoogleMaps

-> GoogleMaps (2.7.0) // 三方库名称
Google Maps SDK for iOS. // 三方库描述
pod 'GoogleMaps', '~> 2.7.0' // 三方库版本
- Homepage: https://developers.google.com/maps/documentation/ios/
- Source: https://dl.google.com/dl/cpdc/f4086b0aa122de6c/GoogleMaps-2.7.0.tar.gz // 三方库源码
- Versions: 2.7.0, 2.6.0, 2.5.0, 2.4.0, 2.3.1, 2.3.0, 2.2.0, 2.1.1, 2.1.0, 2.0.1, 2.0.0, 1.13.2, 1.13.1, 1.13.0, 1.12.3, 1.12.2, 1.12.1, 1.12.0, 1.11.1, 1.11.0, 1.10.5, 1.10.4, 1.10.3, 1.10.2, 1.10.1,
1.10.0, 1.9.2 [master repo]
- Subspecs:
// ...
  • 我们平时在pod search第三方库后出现的结果其实都是三方库名称.podspec.json这个文件的内容,所以我们只做自己的CocoaPods库,也要从整个文件入手。

正式开始

注册 CocoaPods 账号

  • 因为我们的是用CocoaPods统一管理我们的自己的开源库,所以需要一个CocoaPods账号用来发布库。
  • 我们使用终端来进行注册,在终端输入下面的指令、回车:
1
2
3
// gitHub_email : 注册CocoaPods的邮箱, 我使用的是和注册GitHub一样的邮箱。
// your_user_name :你注册CocoaPods的用户名
pod trunk register gitHub_email 'your_user_name' --verbose
  • 成功后终端输入下面信息,CocoaPods 会发一个确认邮件到你的邮箱上,登录你的邮箱进行确认。
1
[!] Please verify the session by clicking the link in the verification email that has been sent to gitHub_email
  • 确认完成后,输入如下指令查看注册信息
1
2
3
4
5
6
7
8
// pod trunk me

- Name: your_register_name // 你的注册昵称
- Email: your_register_email // 你的注册邮箱
- Since: June 26th, 03:26
- Pods: None
- Sessions:
- June 26th, 03:26 - November 1st, 03:28. IP: 119.136.114.95

创建Git仓库

  • 在 GitHub 上创建一个公开项目,项目中必须包含这几个文件

    • LICENSE: 开源许可证
    • README.md: 库的使用介绍文件
    • 你的开源库代码
    • 你的三方库名称.podspec : CocoaPods 的描述文件,这个文件非常重要
  • 这里我们以我仿写的一个demo为例子,如下图:

  • 开源库文件组成
  • XSSecurityCodeButton-Demo是一个演示项目
  • XSSecurityCodeButton是一个演示项目
  • LICENSE开源许可证,如何创建请自行百度/谷歌,非常简单。
  • README.md库的使用介绍文件,如何创建请自行百度/谷歌,非常简单。
  • XSSecurityCodeButton.podspecCocoaPods的描述文件

创建.podspec

  • 进入你需要制作开源库的项目根目录
  • 终端执行下面的指令,会在你的仓库下生成 XSSecurityCodeButton.podspec文件
1
2
3
4
5
// XSSecurityCodeButton 我的项目名称,请自行修改
pod spec create XSSecurityCodeButton

// 执行完成生成会输入如下信息
Specification created at XSSecurityCodeButton.podspec
  • XSSecurityCodeButton.podspec文件配置及修改请参考下面(已删除部分无用的干扰内容),重要的地方我已经给出注释。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Pod::Spec.new do |s|

# ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.name = "XSSecurityCodeButton"
s.version = "0.0.1" # 版本号 与 你仓库的 标签号 对应
s.summary = "XSSecurityCodeButton 是一个简约的验证码按钮."
s.description = <<-DESC
# 这里的描述,必须比s.summary的长度要长。
DESC
s.homepage = "https://github.com/SevenCho/XSSecurityCodeButton" # 你的源码页
# s.screenshots = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif"

# ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.license = "MIT" # 开源证书
# s.license = { :type => "MIT", :file => "FILE_LICENSE" }

# ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.author = { "库发布者" => "邮箱" }
# Or just: s.author = "库发布者"
# s.authors = { "库发布者" => "邮箱" }
s.social_media_url = "https://sevencho.github.io" // 你的个人网页,如果有的话

# ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
# s.platform = :ios
s.platform = :ios, "8.0" # 平台及支持的最低版本

# ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.source = { :git => "https://github.com/SevenCho/XSSecurityCodeButton.git", :tag => "#{s.version}" } # 你的仓库地址,不能用SSH地址

# ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.source_files = "XSSecurityCodeButton", "XSSecurityCodeButton/**/*.{h,m}" # 你代码的位置, XSSecurityCodeButton/*.{h,m} 表示 XSSecurityCodeButton 文件夹下所有的.h和.m文件
# s.exclude_files = "Classes/Exclude" # 可执行文件
# s.public_header_files = "Classes/**/*.h" # 公共头文件

# ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
# s.resource = "icon.png" # 注意:如果你的代码里包含xib文件,xib属于资源文件,需要resource引入。
# s.resources = "Resources/*.png"
# s.preserve_paths = "FilesToSave", "MoreFilesToSave"

# ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
# s.framework = "SomeFramework"
s.frameworks = "UIKit", "Foundation" # 支持的框架

# s.library = "iconv"
# s.libraries = "iconv", "xml2"


# ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
s.requires_arc = true # 需要ARC支持
# s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
# s.dependency "JSONKit", "~> 1.4"
end

验证 .podspec 文件的格式是否正确

  • 创建完成.podspec文件并按照上面配置完成,接下来我们就需要文件内容及格式是否正确。
  • 终端执行如下指令:
1
pod lib lint
  • 验证通过就会输入如下信息
1
XSSecurityCodeButton passed validation.
  • 如果你的项目源码被验证出有警告信息,会输出含有如下内容的信息
1
(but you can use `--allow-warnings` to ignore them).
  • 此时你只需要在验证指令后面加上对应的提示,重新验证一遍
1
pod lib lint --allow-warnings

给仓库打标签

  • 验证成功后,就需要将仓库提交到远程,然后给仓库打上标签并将标签也推送到远程。
  • 标签相当于是你的仓库的一个压缩包,用于稳定存储当前版本。
  • 标签号与你在 s.version = “0.0.1”的版本号一致0.0.1
1
2
3
4
// 创建标签
git tag -a 0.0.1 -m '标签说明'
// 推送到远程
git push origin --tags

发布.podspec

  • 发布项目的描述的文件, 在项目根目录下执行
1
pod trunk push XSSecurityCodeButton.podspec
  • 这一步会执行如下操作:
    • 更新本地 pods 库 ~/.cocoaPods.repo/master
    • 验证.podspec格式是否正确
      -.podspec 文件转成 JSON 格式
    • 对master仓库 进行合并,提交.master仓库地址
  • 发布成功后输入如下内容:
1
2
3
4
5
6
7
8
Updating spec repo `master`
--------------------------------------------------------------------------------
🎉 Congrats

🚀 XSSecurityCodeButton (0.0.1) successfully published
📅 June 26th, 04:13
🌎 https://cocoapods.org/pods/XSSecurityCodeButton // 你发布的cocoapods仓库信息,可在浏览器打开查看
👍 Tell your friends!

使用仓库

  • 先更新本地pods仓库信息
  • 更新完成本地仓库后就可以搜索使用我们自己发布的cocoapods仓库了
  • 就可以在需要的项目的Podfile添加、使用自己的仓库了
1
2
3
pod setup   // 更新
pod search XSSecurityCodeButton // 搜索
pod 'XSSecurityCodeButton', '~> 0.0.1' // 需要使用的项目的Podfile文件中添加后安装,和使用其他三方库一样

更新维护

  • 当我们维护修改了我们的源码文件后就需要重新发布一个新的版本到cocoapods
    • 项目源码打上对应的标签推送到自己的远程仓库
    • 更新XSSecurityCodeButton.podspec中版本号(和新的标签一致)
    • 重新执行pod trunk push XSSecurityCodeButton.podspec --allow-warnings推送发布到pods仓库
要不要鼓励一下😘