使用CocoaPods创建开源库和私有库详解
笔者看了许多关于使用CocoaPods创建开源库的文章,大都写的不尽详细,尤其是对于从来没有创建过开源库的同学,不知道哪个步骤文章没写,在验证 .podspec 文件时就一堆错误,一脸懵逼。本文是一篇从零开始创建一个自己的开源库甚至是私有库分享,如有问题,评论交流。
首先,你需要注册一个CocoaPods账号,email使用你的GitHub邮箱,起一个用户名,打开终端:
pod trunk register GitHub_email 'user_name' --verbose
等终端出现下面文字,CocoaPods 会发一个确认邮件到你的邮箱,登录你的邮箱进行确认。
[!] Please verify the session by clicking the link in the verification email that has been sent to [email protected]
验证成功出现下图:
回到终端:
pod trunk me
会看到你的注册信息:
创建开源库
在你要创建项目的目录执行
pod lib create 'ADTextFieldLimit'
根据命令行的提示一步步选择,最后会为你创建一个模板工程和.podspec文件、README.md文件、MIT LICENSE文件等。 并且还会自动帮你打开Xcode,目录结构如下:
我们把要开源的核心代码放在红色区域所在的目录下,此时通过Cocoapods创建出来的目录在本地的Git管理下,我们需要把它添加到远端仓库:
git add .
git commit -m 'Initial Commit'
git remote add origin https://github.com/liushuorepo/ADTextFieldLimit.git #添加远端仓库
git push origin master #提交到远端仓库
此时项目已经被推到了远程端,下面要做的就是修改.podspec文件,配置成下面这样:
Pod::Spec.new do |s|
s.name = 'ADTextFieldLimit' #项目名称
s.version = '0.0.1' #版本号 与仓库的标签号对应
s.summary = 'This is a light library to limit the lenght of what you input.' #项目简介
s.description = <<-DESC
This is a light library to limit the lenght of what you input. Thankyou!
DESC
s.homepage = 'https://github.com/liushuorepo/ADTextFieldLimit' #Git上项目主页
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' } #开源证书
s.author = { 'liushuorepo' => '[email protected]' } #项目作者
s.source = { :git => 'https://github.com/liushuorepo/ADTextFieldLimit.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '9.0'
s.source_files = 'ADTextFieldLimit/Classes/**/*'
# s.resource_bundles = {
# 'ADTextFieldLimit' => ['ADTextFieldLimit/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
s.frameworks = 'UIKit'
# s.dependency 'AFNetworking', '~> 2.3'
end
- s.source 指定源,你的Git仓库地址
- s.source_files 指明哪些源文件会被包含进去,比如s.source_files =
‘ADTextFieldLimit/Classes/**/*’,**表示匹配所有子目录,*表示匹配所有文件,.{h,m}表示匹配其中的.h和.m文件。 - s.license,一般写法有s.license = ‘MIT’ 或 s.license = { :type => ‘MIT’, :file => ‘LICENSE’ }, LICENSE对应.podspec所在目录下的名为LICENSE文件。
- s.platform = :ios, “7.0”,s.ios.deployment_target = ‘7.0’,指定可用平台和版本,如果支持多个平台应该使用后者,并指定其他平台的版本如s.osx.deployment_target =“10.7”。
- s.public_header_files,公开的头文件,如果指定,在pod lint验证时,会以framework的形式验证,一般可以不用这个配置。
- s.frameworks、s.libraries,指定依赖的系统库。两者内容都需要去除后缀,其中s.libraries需要去除前缀lib,如静态库依赖是libz.tbd,则s.libraries= ‘z’。
- s.vendored_libraries 、s.vendored_frameworks 如果开源库中是一个静态库,使用这个指定静态库。如微博的podspec中s.vendored_libraries = ‘libWeiboSDK/libWeiboSDK.a’
- s.xcconfig 指定项目配置,如HEADER_SEARCH_PATHS 、OTHER_LDFLAGS等,e.g s.xcconfig = { “OTHER_LDFLAGS” => “-ObjC” }
- s.resource_bundles 指定包含的资源文件。
- s.dependency 指定依赖,如s.dependency = ‘AFNetworking’
更多信息可查阅官方文档:http://guides.cocoapods.org/syntax/podspec.html
验证 .podspec 文件的格式是否正确:
pod lib lint ADTextFieldLimit.podspec --verbose
- –verbose 会给出详细的信息。
- –allow-warnings 允许警告,默认有警告的podspec会验证失败。
–fail-fast 遇到错误马上停止,默认会完成全过程再停止。 - –use-libraries 如果项目中引用了.a、.framework,在验证和提交时需要加。
- –sources 如果此podspec 依赖了其他不包含在官方specs里的pod,则用它来指明源,比如依赖了某个私有库。多个值以逗号分隔。
验证成功出现:
-> ADTextFieldLimit (0.0.1)
ADTextFieldLimit passed validation.
验证成功后,推到远程:
git add .
git commit -m '添加关键文件'
git push origin master #提交到远端仓库
打标签:
git tag 0.0.1
git push --tags
发布 .podspec:
pod trunk push ADTextFieldLimit.podspec
发布成功,出现下面提示:
发布成功后,会把podspec更新到官方的repo中,可以访问:https://cocoapods.org/pods/ADTextFieldLimit 在CocoaPods官网搜索到自己的pod,也可以执行下面的命令来搜索:
pod search 'ADTextFieldLimit'
但是有时候你在官网搜到了,而你在终端执行pod search 时却报错:
[!] Unable to find a pod with name, author, summary, or description matching `ADTextFieldLimit`
这是因为有可能你本地的repo不是最新的,执行更新,然后重新搜索:
pod repo update
如果还是搜不到,可能是因为搜索的缓存导致,删除缓存重新搜索:
rm ~/Library/Caches/CocoaPods/search_index.json
pod search 'ADTextFieldLimit'
搜所结果如下:
然后别人就可以在项目中导入你的开源仓库了。
创建私有库
创建私有库和公有库步骤基本类似,区别是:
需要先在Git上创建远程仓库,然后在本地目录下执行:
pod repo add 'repoName' 'repo URL'
编辑 .podspec,同上
验证 .podspec,如果依赖了其他私有库,需要使用–sources指定source。
pod lib lint BaseFundation.podspec --sources=https://github.com/liushuorepo/XMTextFieldLimit.git
发布 .podspec
pod repo push 'BaseFundation' BaseFundation.podspec
使用私有库
platform :ios, '9.0'
use_frameworks!
# 共用的pod第三方
pod 'BaseFundation', :git => 'https://github.com/liushuorepo/BaseFundation.git'
# 项目中的target各自的设置
target "xuanmeng" do
#xuanmeng独自引用
end
很多时候,在开发过程中,我们希望在开发私有库的过程中,修改代码后不用一直打tag并执行pod update,我们可以这样写Podfile:
pod 'BaseFundation', :path => '~/Desktop/BaseFundation'
这样在普通的修改代码时,不需要重新打tag并pod update,但是当工程结构有变化(文件移动,增删等)、podspec修改,最好执行一次pod update。
参考文章:
- CocoaPods公有仓库的创建:https://www.tuicool.com/articles/uq6NJnJ
- 使用Cocoapods创建私有podspec:http://www.cocoachina.com/ios/20150228/11206.html