本文主要介绍CocoaPods私有库的创建,做这件事的主要起因是,公司接过来一个外包的项目,项目中用到了他们的私有库,pod中可以看到源码,虽然直接将源码添加到工程中也是可行的,但本着学一点是一点的思想,借此机会尝试一下自己做一个私有库。
首先需要明确一个概念,私有仓库和私有库,类比CocoaPods的官方仓库,私有仓库就是整个库,其中会包含多个私有库以及同一个私有库的不同版本,在本机~/.cocoapods/repos/
路径下,CocoaPods官方仓库位于master文件夹中,~/.cocoapods/repos/master/Specs
文件夹下保存的就是各个开源库的podspec文件。在终端执行pod repo list
可以查看本地仓库,名字为master的就是官方仓库。
因此,在私有库创建之前,首先要创建一个私有的仓库:
创建CocoaPods私有仓库
创建私有仓库,可以在gitlab,github,coding等网站中直接创建即可,这里不详细描述。这里我用的是coding的git,创建后可以得到仓库的git地址,需要在本地添加仓库。
# pod repo add REPO_NAME SOURCE_URL
pod repo add TestRepository https://git.coding.net/rapunzel/TestRepository.git
添加后可以在本地查看是否添加成功。
pod repo list
成功后可以看到输出:

或者也可以直接查看~/.cocoapods/repos/
文件夹,如果有名字为刚才添加的REPO_NAME的文件夹,那就说明repo add成功。
本地仓库可以做删除和更新等操作:
pod repo remove REPO_NAME
pod repo update
添加私有库代码
在私有仓库中添加源码,这里暂时先上传一个文件夹,后面会在podspec中引用这个文件夹。

给私有库打tag,这个tag表示后面podspec文件中的引用版本,因此,每次重新编辑后,要重新打tag,然后再更新podspec文件,生成新版本的pod库。
git tag '0.0.1'
或者 git tag -a 0.0.1 -m 'version 0.0.1'
git push --tags
创建私有库
在前面创建仓库,添加代码,打标签等操作都完成后,就可以真正开始创建私有库了,这里主要分为几个步骤:
1. 创建podspec文件
2. 编辑podspec文件
3. 验证podspec文件
4. 本地调用验证
5. 将podspec文件推送到远程仓库
创建podspec文件
首先进入到库目录下:
cd /Users/masaike/.cocoapods/repos/TestRepository/PodTestAlertView
执行创建podspec文件语句:
pod spec create SPEC_NAME
在目录下会出现一个PodTestAlertView.podspec
文件,可以使用sublime打开。可以看到里面有很多信息需要补充:
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 = "PodTestAlertView"
s.version = "0.0.1"
s.summary = "A short description of PodTestAlertView."
#此处省略一万字
end
编辑podspec文件(大概介绍一下podspec文件中的每个字段的含义)
字段 | 含义 |
---|---|
name | 库名称,即pod search POD_NAME 中的POD_NAME 字段 |
version | 库版本,这里需要和上面的tag版本相同 |
homepage | 表示匹配所有子目录 |
license | 这个不是很了解,暂时使用MIT 了 |
author | 一般会根据本地的git账户自动填好 |
platform / deployment_target | 单平台用platform,多平台使用deployment_tartet |
source | git字段填写仓库地址,后面可以使用tag指定标签,也可以使用commit指定某一次提交 |
source_files | 指定库源文件的位置,如果仓库中包含多个pod库,那么在引用pod库时,则需要指定是什么库的文件 |
resource / resources | 资源文件,和source_files格式类似 |
framework / frameworks | 去掉.framework后缀,多个framework以逗号分隔,例如使用UIKit.framework 和Foundation.framework ,则为s.frameworks = "UIKit", "Foundation"
|
library / libraries | 去掉名字中的lib和.tbd等后缀,多个lib以逗号分隔,例如使用libsqlite3.0.tbd 和libc++.tbd ,则为s.libraries = "sqlite3.0", "c++"
|
dependency | 依赖的第三方库,可以指定版本,例如s.dependency "JSONKit", "~> 1.4" ,也可以不指定版本,例如s.dependency "JSONKit" 将默认使用最新版本;这里也可以使用自己的私有库,使用私有库在验证podspec时需要进行私有库地址的搜索,添加--sources = 'SOURCE_URL1, SOURCE_URL2' ,否则只会在官方仓库搜索,导致依赖库找不到的问题 |
source_files字段,表示在仓库中寻找并添加的文件类型,需要指定要添加的文件路径。例如我的目录中,这个字段就可以写成s.source_files = "PodTestAlertView/*.{h,m}"
source_files字段 | 匹配文件类型 |
---|---|
* | 表示匹配所有文件 |
*.{h,m} | 表示匹配所有以.h和.m的文件 |
** | 表示匹配所有子目录 |
编辑后的podspec文件大概如下:
Pod::Spec.new do |s|
s.name = "PodTestAlertView"
s.version = "0.0.3"
s.summary = "A short description of PodTestAlertView."
s.homepage = "http://EXAMPLE/PodTestAlertView"
s.license = "MIT"
s.author = "zhangmj"
s.platform = :ios, "8.0"
s.source = { :git => "https://git.coding.net/rapunzel/TestRepository.git", :tag => "#{s.version}" }
s.source_files = "PodTestAlertView/*.{h,m}"
s.frameworks = "UIKit"
s.dependency "IQKeyboardManager"
end
验证podspec文件
验证podspec文件命令:
pod spec lint SPEC_NAME.podspec
输出验证结果:

可以看到输出中,会有很多WARN,警告的结果就是最后说The spec did not pass validation
,不过它也给出了解决方案,就是you can use '--allow-warnings' to ignore them
,修改验证指令:
pod spec lint SPEC_NAME.podspec --allow-warnings
忽略警告后,验证通过:

验证过程中也可能由于代码问题,出现代码编译方面的error,可以添加--verbose
来查看详细的log:
pod spec lint SPEC_NAME.podspec --verbose
根据其中提示的代码方面的错误,库引用方面的错误,修改代码,上传更新,重新打标签,修改podspec文件的引用版本,继续验证。
这里如果在依赖时调用了自己的库,则需要在后面添加私有库地址的SOURCE_URL,因为验证时默认只搜索官方仓库,例:
pod spec lint --allow-warnings SPEC_NAME.podspec --sources='YOUR_PRIVATE_SOURCE_URL, https://github.com/CocoaPods/Specs.git'
本地调用验证
验证podspec文件的正确性后,可以在本地先进行一次安装,没问题后再推送到仓库,修改podfile,指定podspec地址为本地的地址:
pod 'PodTestAlertView', :podspec => '/Users/masaike/.cocoapods/repos/TestRepository/PodTestAlertView/PodTestAlertView.podspec'
成功安装!在做这行之前,我心里是拒绝红色和绿色同时出现的,但在终端里,这个红配绿是夺么和谐!

将podspec文件推送到远程仓库
本地验证通过后就可以上传版本了,推送podspec文件使用指令:
pod repo push REPO_NAME SPEC_NAME.podspec
如果在上一步验证时使用了--allow-warnings
来忽略警告,在推送podspec文件时也需要忽略警告:
pod repo push REPO_NAME SPEC_NAME.podspec --allow-warnings
开始推送后,一般会报一个错误[!] The repo 'TestRepository' at '..' is not clean
,原因是podspec文件是直接在repo下生成的,本地的repo
和远程仓库相比,多了一个podspec文件,所以可以选择将podspec文件移到别的位置,让本地的repo和远程保持同步,重新推送。
Validating spec
-> PodTestAlertView (0.0.3)
- WARN | homepage: The homepage has not been updated from default
- WARN | summary: The summary is not meaningful.
Updating the 'TestRepository' repo
From https://git.coding.net/rapunzel/TestRepository
* [new tag] 0.0.1 -> 0.0.1
* [new tag] 0.0.2 -> 0.0.2
* [new tag] 0.0.3 -> 0.0.3
Already up-to-date.
Adding the spec to the 'TestRepository' repo
- [Update] PodTestAlertView (0.0.3)
Pushing the 'TestRepository' repo
推送成功后,远程仓库和本地repo都可以看到一个名字和version相同的文件夹,里面包含刚才添加的podspec文件,代表这个版本的podspec文件,然后就可以试试使用私有库了~
使用私有库
在podfile中添加私有仓库地址,同时也要添加官方仓库地址,否则只会在私有仓库中搜索:
source 'https://git.coding.net/rapunzel/TestRepository.git' #私有仓库地址
source 'https://github.com/CocoaPods/Specs.git' #官方仓库地址
platform:ios, '8.0'
target 'test' do #工程名称
#三方开源
pod 'IQKeyboardManager'
#私有库
pod 'PodTestAlertView'
end
如果可以成功安装,那就ok啦!
一些问题
引用的文件生成的framework,此处感谢此分享的提示
在podspec文件中有一个字段是vendored_frameworks,可以使用自己生成的framework:
s.vendored_frameworks = 'Pod/Assets/*.framework'
然后在验证和push到远程仓库时需要添加--user-libraries
git push origin master
比较慢
如果和我一样用的是Coding,那可能是它给你的圣诞节彩蛋= =

其实还有一个文件夹目录的问题,但是不知道为什么,没有办法复现了,所以先不记录这一条了。
网友评论