使用Cocoapods创建公共podspec
一、创建Pod项目工程文件并推送到远端仓库
如果有现有的组件项目,并且在Git的版本管理下,那么这一步就算完成了,可以直接进行下一步了。
如果你的组件还在冗余庞大的项目中,需要拆分出来或者需要自己从零开始创建一个组件库,那么建议使用Cocoapods提供的一个工具来做。
1.1、Using Pod Lib Create 的使用:
这里使用ZSMenuView为例子具体讲一下过程,
- 1、创建项目
先cd到要创建项目的目录然后执行
$ pod lib create ZSMenuView
之后他会问你几个问题,
1. What is your name?
2. What is your email?
3. What language do you want to use?? [ Swift / ObjC ]
4. Would you like to include a demo application with your library? [ Yes / No ]
5. Which testing frameworks will you use? [ Specta / Kiwi / None ]
6. Would you like to do view based testing? [ Yes / No ]
7. What is your class prefix?
问题的具体介绍可以去看官方文档
依次回答完这些问题后会自动执行pod install命令创建项目并生成依赖。
-
2、 向Pod文件夹中添加库文件和资源
把
ZSMenuView
组件所有的代码文件放入到"ZSMenuView/Classes"中,然后进入"ZSMenuView /Example"文件夹执行pod update
命令,再打开项目工程可以看到,刚刚添加的组件已经在Pods子工程下"Development Pods/ZSMenuView"中了,然后编辑调试demo工程,测试组件。注意1:如果引入不了头文件,需要在"Build Settings -> User Header Search Paths"中添加
$(PODS_ROOT)设置为recursive
注意2:这里需要注意的是每当你向Pod中添加了新的文件或者以后更新了podspec的版本都需要重新执行一遍pod update命令。 -
3、将该项目添加并推送到远端仓库
$ git add .
$ git commit -m "init commit of ZSMenuView"
$ git remote add origin git@github.com:safiriGitHub/ZSMenuView.git
$ git push -u origin master
#因为podspec文件中获取Git版本控制的项目还需要tag号,所以我们要打上一个tag
$ git tag -m "first release" "0.1.0"
$ git push --tags
- 4、编辑podspec文件,没有涉及到的字段可以去官方文档查阅
#
# Be sure to run `pod lib lint ZSMenuView.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
s.name = 'ZSMenuView' #名称
s.version = '0.1.0' #版本号
s.summary = 'a simple menuView,every menu can be clicked' #简短介绍
# 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 = <<-DESC
TODO: Add long description of the pod here.
小功能:菜单栏。+ 练习使用Cocoapods创建公有podspec
DESC
s.homepage = 'https://github.com/safiriGitHub/ZSMenuView' #主页,这里要填写可以访问到的地址,不然验证不通过
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' #截图
s.license = { :type => 'MIT', :file => 'LICENSE' } #开源协议
s.author = { 'safiri' => 'safiri@163.com' } #作者信息
s.source = { :git => 'https://github.com/safiriGitHub/ZSMenuView.git', :tag => '0.1.0' } #项目地址,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
s.social_media_url = 'http://www.jianshu.com/users/2809c84474f6/latest_articles' #多媒体介绍地址
s.ios.deployment_target = '8.0' #支持的平台及版本
s.source_files = 'ZSMenuView/Classes/**/*' #代码源文件地址,**/*表示Classes目录及其子目录下所有文件,如果有多个目录下则用逗号分开,如果需要在项目中分组显示,这里也要做相应的设置
# s.resource_bundles = {
# 'ZSMenuView' => ['ZSMenuView/Assets/*.png']
# } #资源文件地址
# s.public_header_files = 'Pod/Classes/**/*.h' #公开头文件地址
# s.frameworks = 'UIKit', 'MapKit' #所需的framework,多个用逗号隔开
# s.dependency 'AFNetworking', '~> 2.3' #依赖关系,该项目所依赖的其他库,如果有多个需要填写多个s.dependency
end
编辑完podspec文件后,需要验证一下这个文件是否可用,如果有任何WARNING或者ERROR都是不可以的,它就不能被添加到Spec Repo中。
$ pod lib lint
当你看到
-> ZSMenuView (0.1.0)
ZSMenuView passed validation.
说明验证通过了
1.2、创建podspec文件
如果已经有了现成的项目,那么就需要给这个项目创建一个podspec文件。创建它需要执行Cocoapods的另外一个命令,官方文档
$ pod spec create [NAME|https://github.com/USER/REPO]
#Creates a PodSpec, in the current working dir, called NAME.podspec.
编辑完成之后使用验证命令验证一下
$ pod lib lint 本地验证
$ pod spec lint 建议使用远程验证
在远程验证前要将本地所有改动提交到远程仓库,并打好tag标记,在podspec文件中将tag标记改正确。
验证无误就可以进入下一步了。
二、本地测试podspec文件
创建一个新的项目,在这个项目的Podfile文件中直接指定刚才创建编辑好的podspec文件,看是否可用。
//在新项目目录下创建Podfile
$ pod init
//在Podfile中我们可以这样编辑,有两种方式,任选其一:
platform :ios, ‘8.0’
target 'podsoecTest' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# Pods for podsoecTest
pod ‘ZSMenuView’, :path => ‘/Users/safiri/Downloads/github/ZSMenuView’ #指定路径
pod ‘ZSMenuView’, :podspec => ‘/Users/safiri/Downloads/github/ZSMenuView/ZSMenuView.podspec’#指定podspec文件
end
执行pod install命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了,不过它们并没有在Pods目录下,而是跟测试项目一样存在于"Development Pods/ZSMenuView"中,这是因为我们是在本地测试,而没有把podspec文件添加到Spec Repo中的缘故。
三、向Spec Repo提交podspec,公共或私有(CocoaPods Trunk)
问题:什么是Spec Repo?
它是所有的Pods的一个索引,就是一个容器,所有公开的Pods都在这个里面,是一个Git仓库,remote端在GitHub上。
条件:
podspec必须通过验证无误
删掉无用的注释(这个不是必须的,为了规范还是删掉吧)
步骤:
//Getting started 第一次使用时注册一个邮箱账号
$ pod trunk register safiri@163.com 'safiri' --description='first
trunk'
访问邮箱中的链接,注册成功。
//Deploying a library
$pod trunk push [NAME.podspec] #部署公共的Podspec
$pod repo push REPO [NAME.podspec] #部署私有的Podspec
#例子,pod trunk push ZSMenuView.podspec --allow-warnings (--allow-warnings忽略Xcode的警告)
//Adding other people as contributors
$ pod trunk add-owner ARAnalytics kyle@cocoapods.org
#For example, to add kyle@cocoapods.org to the library ARAnalytics
四、使用制作好的Pod
在项目中
$ pod 'ZSMenuView', '~> 0.1.0'
然后执行pod update,更新库依赖,然后打卡项目可以看到,我们自己的库文件已经出现在Pods子项目中的Pods子目录下了,而不再是Development Pods。
五、更新维护podspec
升级代码 -> 根据具体改动,编辑name.podspec -> pod lib lint验证 -> 将项目推送到远端仓库,打上新的tag(git tag '0.2.0'
git push --tags
) -> 提交到Spec Repo中,$pod trunk push [NAME.podspec] (pod trunk push ZSMenuView.podspec
)
遇到的问题:
一
sudo gem update --system
升级gem ->sudo gem install -n /usr/local/bin cocoapods --pre
升级cocoapods ->pod setup
安装cocoapods->pod lib lint
验证
history
查看终端历史记录
pod search
查询不到最新版本 ---> pod repo update
更新本地缓存
如果还是不行:
尝试删除本地缓存,重新setup,
$rm -fr ~/.cocoapods/repos/master
$pod setup
二、pod lib lint
执行时报错
- ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information.
- ERROR | xcodebuild: aaa.h:10:9: error: include of non-modular header inside framework module 'xx': 'bbb.h' [-Werror,-Wnon-modular-include-in-framework-module]
原因:某个头文件(aaa.h)中直接import了依赖的第三方库的头文件(bbb.h),采用了向前声明@Class
解决。
三、删除提交到cocoapods上的框架?
查看CocoaPods上的个人信息:
pod trunk me
有时候如果提交有问题,可以执行一下命令删除:
// 直接废去这个pod
pod trunk deprecate xxx
// 废去这个pod的某个版本
pod trunk delete xxx 1.0.0
经测试,两个命令使用完都没返回成功,且pod search是可以找到的,可能是本地库的原因。然后更新本地库pod repo update
后,版本会删除成功。