如何编写一个CocoaPods的spec文件

2016 - 01 - 21

Posted by lintide Oct 16th, 2012

CocoaPods还是一个相对年轻的项目,所有的项目的Podspec文件都托管在https://github.com/CocoaPods/Specs。可能有一些库并未收录其中。下面我们通过为微博sso认证登录库编写Podspec文件来学习相关的概念。

初始化一个Podspec文件
$ pod spec create weibo_ios_sdk_sso-oauth

该命令将在本目录产生一个名为weibo_ios_sdk_sso-oauth.podspec的文件。用编辑器打开该文件,里面已经有非常丰富的说明文档。下面我们介绍如何声明第三方库的代码目录和资源目录,还有该第三方库所依赖ios核心框架和第三方库。

去除所有的注释,podspec文件如下所示:

Pod::Spec.new do |s|  
  s.name     = 'ADVProgressBar'  
  s.version  = '0.0.1'  
  s.license  = 'MIT'  
  s.summary  = 'Progress Bar Design with Percentage values.'  
  s.homepage = 'https://github.com/appdesignvault'  
  s.author   = { 'appdesignvault' => 'appdesignvault' }  
  s.source   = { :git => 'https://github.com/appdesignvault/ADVProgressBar.git', :commit => 'f17b15c15574d6d101cd5fcfd58239e16e806647' }  
  s.platform = :ios  
  s.source_files = 'ADVProgressBar/Classes/*.{h,m}'  
  s.resources = "ADVProgressBar/Resources/*.png"  
  s.framework = 'UIKit'  

  s.requires_arc = true  
end  

其中s.name和s.summary用来声明库的名称和一个简短的说明文档。pod search命令就是根据这两项内容作为搜索文本的。s.homepage声明库的主页,s.version库原代码的版本,s.license所采用的授权版本,s.author库的作者。

s.source 声明原代码的地址,以微博sso认证登录库为例,它托管在https://github.com/mobileresearch/weibo_ios_sdk_sso-oauth中,在其未尾加上.git扩展名就是库的原代码地址了,所以该行应声明为:

s.source = { :git => 'https://github.com/mobileresearch/weibo_ios_sdk_sso-oauth.git'}

对于很多第三方库而言,在发布的时候都会打上一个tag,如版本0.0.1就会打上一个名为v0.0.1的tag,但是weibo_ios_sdk_sso-oauth库还未打上所何tag,我们可以选择一个最新的commit来作为该库0.0.1版的代码。s.source最终如下:

s.source = { :git => 'https://github.com/mobileresearch/weibo_ios_sdk_sso-oauth.git', :commit => '68defea78942ecc782ffde8f8ffa747872af226d'}

以后我们可以根据该库不同的版本创建相应的podspec文件,例如0.0.2,0.1.0等。

让我们在浏览器中看一下weibo_ios_sdk_sso-oauth的目录结构:

--  
|  
+-- demo  
|  
+-- src  
|  
+-- .gitignore  
|  
+-- README.md  

demo目录保存一个示例项目,src才是库的原代码目录。src的目录结构如下:

-- src  
    |  
    +-- JSONKit  
    |  
    +-- SinaWeibo  
    |  
    +-- sinaweibo_ios_sdk.xcodeproj  
    |  
    +-- SinaWeibo-Prefix.pch  

JSONKit目录说明这个库本身依赖于JSONKit第三方库。我们可以在podspec文件中的s.dependency声明段中声明。SinaWeibo目录才是包含所有原代码的目录,我们需要在s.source_files中声明

s.source_files = 'src/SinaWeibo/*.{h,m}'

前一部分src/SinaWeibo/是一个相对目录,目录的层级关系一定要跟代码库的保持一致。最后一部分*.{h,m}是一个类似正则表达式的字符串,表示匹配所有以.h和.m为扩展名的文件。

src/SinaWeibo/目录下还有一个SinaWeibo.bundle目录,该目录存放一些资源文件(如图片等),这些文件并不需要进行编译。可以使用s.resourcs声明

s.resources = "src/SinaWeibo/SinaWeibo.bundle/**/*.png"

前一部分跟上面相同,*表示匹配所有子目录,.png表示所有以.png为扩展名的图片文件。

通过查看代码我们知道,weibo_ios_sdk_sso-oauth还依赖一个ios的核心库QuartzCore

s.framework = 'QuartzCore'

在前面我们已经说过,weibo_ios_sdk_sso-oauth库自身也依赖于另外一个第三方库JSONKit,声明如下:

s.dependency 'JSONKit', '~> 1.4'

这行声明与Podfile文件中的声明类似。

最终的结果如下:

Pod::Spec.new do |s|  
  s.name         = "weibo_ios_sdk_sso-oauth"  
  s.version      = "0.0.1"  
  s.summary  = 'weibo.com sso oauth, 微博sso认证登录功能'  
  s.homepage     = "https://github.com/mobileresearch/weibo_ios_sdk_sso-oauth"  
  s.license      = 'MIT'  
  s.author       = {'mobileresearch' => 'mobileresearch'}  
  s.source       = { :git => 'https://github.com/mobileresearch/weibo_ios_sdk_sso-oauth.git', :commit => '68defea78942ecc782ffde8f8ffa747872af226d' }  
  s.platform = :ios  
  s.source_files = 'src/SinaWeibo/*.{h,m}'  
  s.resources = "src/SinaWeibo/SinaWeibo.bundle/**/*.png"  
  s.framework  = 'QuartzCore'  
  s.dependency 'JSONKit', '~> 1.4'  
end  

可以将该spec文件保存到本机的~/.cocoapods/master/目录中仅供自己使用,也可以将其提交到CocoaPods/Specs代码库中(后面描述)。下面我们将其保存到本机中

$ mkdir -p ~/.cocoapods/master/weibo_ios_sdk_sso-oauth/0.0.1  
$ cp weibo_ios_sdk_sso-oauth.podspec ~/.cocoapods/master/weibo_ios_sdk_sso-oauth/0.0.1  

是否可以通过搜索找到该库:

$ pod search weibo

同样在需要依赖于weibo_ios_sdk_sso-oauth这个库的项目,可以将下列添加到项目的Podfile文件中

pod 'weibo_ios_sdk_sso_oauth', '0.0.1'

保存文件,并用pod install安装weibo_ios_sdk_sso-oauth库。

发布到CocoaPods

CocoaPods 0.33中加入了 Trunk 服务。使用 Trunk 服务发布 Pod 时都会通过 $ pod lint 验证 .podspec 是否有效。要使用 Trunk 服务,须先注册,需要填写你的邮箱(spec文件中的)和名称即可。CocoaPods 会给你的邮箱发送验证邮件,点击链接即可通过验证。

pod trunk register harryzjm@live.com "harryzjm"  

然后发布 podspec 了。

pod trunk push XXXXX.podspec  

发布时会验证 podspec 的有效性,如你在手动验证 podspec 时使用了 –use-libraries 或 –allow-warnings 等修饰符,那么发布的时候也须使用相同的修饰符,以免验证不过。

pod trunk push XXXXX.podspec --use-libraries --allow-warnings  

发布成功后,就可以使用 pod search 搜索到你的 Pod 了!

-> AFNetworking (3.1.0)  
   A delightful iOS and OS X networking framework.  
   pod 'AFNetworking', '~> 3.1.0'  
   - Homepage: https://github.com/AFNetworking/AFNetworking  
   - Source:   https://github.com/AFNetworking/AFNetworking.git  

由于 pod search 是搜索本地“~/.cocoapods”,所以在其他设备上须执行 pod install 更新 pod 仓库.

版本升级

当需更新 Pod 版本时,修改 .podspec 中的 s.version 为更高的版本号,并修改 s.source 中对应的 Git 版本。提交到Git,并打上对应tag。然后再次执行pod trunk push XXXXX.podspec将新的 .podspec 发布到 CocoaPods。更新完成!

为了更新更加方便,建议采用如下写法:

s.source = { :git => "https://github.com/harryzjm/XXXXX.git", :tag => s.version }  
Table of Contents