知识总结CocoaPods

使用Cocoapods创建公共podspec

2016-11-15  本文已影响462人  暗物质

一、创建Pod项目工程文件并推送到远端仓库

如果有现有的组件项目,并且在Git的版本管理下,那么这一步就算完成了,可以直接进行下一步了。
如果你的组件还在冗余庞大的项目中,需要拆分出来或者需要自己从零开始创建一个组件库,那么建议使用Cocoapods提供的一个工具来做。

1.1、Using Pod Lib Create 的使用:

这里使用ZSMenuView为例子具体讲一下过程,

  $ 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命令创建项目并生成依赖。
  $ 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
  #
# 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

上一篇下一篇

猜你喜欢

热点阅读