Cocoapods系列(二)公有篇

根据存放代码的仓库不同,对于公开给所有人的开源称为公有库,而对于公司内的开源称为私有库,本文将详细描述如何在GitHub上利用CocoaPods开源公有代码库。

准备工作

需要在GitHub上创建一个Public仓库,常规操作不再过多描述,需要注意的是需要在Add a license中选择MIT License(软件授权条款)。

将创建完的仓库clone到工作目录,使用命令行工具创建一个podspec文件:

1
$ pod spec create 库名

这个文件是告诉Cocoapods你这个库的一些基本信息,包括你的版本号、获取的地址、那些文件是希望被包含进来的等一些信息。

编辑 podspec文件,这里是用vim打开的,命令:

1
$ vim 库名.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
Pod::Spec.new do |s|
# ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# These will help people to find your library, and whilst it
# can feel like a chore to fill in it's definitely to your advantage. The
# summary should be tweet-length, and the description more in depth.
#
s.name = "RYJBlankDataSet"
s.version = "0.0.2"
s.summary = "Easy to make blank page."
# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
# * Try to keep it short, snappy and to the point.
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!
s.description = "Make blank page implementation simpler and more flexible."
s.homepage = "https://github.com/developRen/RYJBlankDataSet"
# s.screenshots = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif"
# ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# Licensing your code is important. See http://choosealicense.com for more info.
# CocoaPods will detect a license file if there is a named LICENSE*
# Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'.
#
s.license = "MIT"
# s.license = { :type => "MIT", :file => "FILE_LICENSE" }
# ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# Specify the authors of the library, with email addresses. Email addresses
# of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also
# accepts just a name if you'd rather not provide an email address.
#
# Specify a social_media_url where others can refer to, for example a twitter
# profile URL.
#
s.author = { "YiJie Ren" => "jie_ios@163.com" }
# Or just: s.author = "RYJ"
# s.authors = { "RYJ" => "" }
# s.social_media_url = "http://twitter.com/RYJ"
# ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# If this Pod runs only on iOS or OS X, then specify the platform and
# the deployment target. You can optionally include the target after the platform.
#
s.platform = :ios, "8.0"
# s.platform = :ios, "5.0"
# When using multiple platforms
# s.ios.deployment_target = "5.0"
# s.osx.deployment_target = "10.7"
# s.watchos.deployment_target = "2.0"
# s.tvos.deployment_target = "9.0"
# ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# Specify the location from where the source should be retrieved.
# Supports git, hg, bzr, svn and HTTP.
#
s.source = { :git => "https://github.com/developRen/RYJBlankDataSet", :tag => "#{s.version}" }
# ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# CocoaPods is smart about how it includes source code. For source files
# giving a folder will include any swift, h, m, mm, c & cpp files.
# For header files it will include any header in the folder.
# Not including the public_header_files will make all headers public.
#
s.source_files = "RYJBlankView/RYJBlankDataSet", "RYJBlankView/RYJBlankDataSet/**/*.{h,m}"
s.exclude_files = "Classes/Exclude"
# s.public_header_files = "Classes/**/*.h"
# ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# A list of resources included with the Pod. These are copied into the
# target bundle with a build phase script. Anything else will be cleaned.
# You can preserve files from being cleaned, please don't preserve
# non-essential files like tests, examples and documentation.
#
# s.resource = "icon.png"
# s.resources = "Resources/*.png"
# s.preserve_paths = "FilesToSave", "MoreFilesToSave"
# ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# Link your library with frameworks, or libraries. Libraries do not include
# the lib prefix of their name.
#
s.framework = "UIKit"
# s.frameworks = "SomeFramework", "AnotherFramework"
# s.library = "iconv"
# s.libraries = "iconv", "xml2"
# ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# If your library depends on compiler flags you can set them in the xcconfig hash
# where they will only apply to your library. If you depend on other Podspecs
# you can include multiple dependencies to ensure it works.
# s.requires_arc = true
# s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
# s.dependency "JSONKit", "~> 1.4"
end

发布公有库

创建tag,并推送到github,依次执行以下命令:

1
2
3
4
5
$ git add .
$ git commit -m "描述"
$ git tag -a '版本号' -m '描述'
$ git push --tags
$ git push origin master

验证podspec文件

1
$ pod spec lint 库名.podspec

如果验证不通过,会有详细的ERROR和WARING提示,根据提示依次解决,然后重新来一遍。
注意:在重新开始之前,我们要删除远程库的tag和本地的tag,命令如下:

1
2
$ git tag -d 版本号 // 删除本地tag
$ git push origin :refs/tags/版本号 // 删除远程库tag

验证通过后,提交到CocoaPods。命令:

1
$ pod trunk push 库名.podspec

如果是第一次提交,需要先执行这个命令,邮箱验证通过后再提交到CocoaPods:

1
$ pod trunk register 这里写邮箱 '这里起个名字' --description=' 这里写描述'

使用公有库

提交完成后,就可以通过cocopods查找该公有库了:

1
$ pod search 库名

具体使用可以看作者前一篇文章Cocoapods系列(一)使用篇

迭代更新公有库

首先更新 pod 中的文件, 及 podspec, 在示例程序中无错误后, podspec 中的 version 改为更大的版本号。操作 git:

1
2
3
4
5
6
$ git add .
$ git commit -m '描述'
$ git push
$ git tag -a '版本号' -m '描述'
$ git push --tags
$ pod trunk push 库名.podspec

再将 podspec 利用上面 repo push 命令推到私有源, podfile 修改对应版本号, pod update 对应pod, 完成了版本的升级. 值得注意的是 git 的 tag 不要删除, 否则会出现一些缓存问题.