使用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后,版本会删除成功。

参考文章
使用Cocoapods创建私有podspec
cocoapods.org

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容