cocoapods_从安装使用到创建自己的podspec

Cocoapods 从安装使用到创建自己的podspec


  • Cocoapods简介

    当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等。如果使 用他们,传统的方法是,在git上把他们下载下来,然后去配置。这个工作很繁琐,而且也容易出错。不 过有了Cocoapods你就会从这些繁琐的工作中解脱出来。

  • Cocoapods是Swif和Objective-C的cocoa项目依赖关系管理的工具。

  • 安装Cocoapods

    Cocoapods是用Ruby实现的,使用它需要Ruby环境。不过OS X 系统上已经默认安装了Ruby。所以我们只需要在终端中执行下面的命令:

    sudo gem install cocoapods

    Cocoapods是以Ruby gem包的形式安装的。在安装的过程中,如果询问是否要更新rake输入y即可。这
    是rake gem在检查更新。

    安装结束后,执行下面的命令

    pod setup

    安装完成后终端户显示 Setup completed

  • 安装中可能会遇到的问题

  • 执行 sudo geminstall cocoapods长时间没有反应
    这有可能是因为Ruby的默认源使用的是cocoapods.org,国内访问这个网址有时候会有问题,网上的一种解决方案是将远替换成淘宝的,替换方式如下:

     gem sources --remove https://rubygems.org/ 
    //等有反应之后再敲入以下命令
    gem sources -a http://ruby.taobao.org/

    为了验证你的Ruby镜像是并且仅是taobao,可以用以下命令查看:

    $ gem sources -l

    终端上会显示

*** CURRENT SOURCES ***

http://ruby.taobao.org/

然后在执行

sudo gem install cocoapods
pod setup

gem版本过老

gem是管理Ruby库和程序的标准包,如果它的版本过低也可能导致安装失败,解决方案自然是升级gem,执行下述命令即可:

sudo gem update --system

测试一下Cocoapods

安装完成之后,我们来试一下Cocoapods 以AFNetworking为例子

在终端执行下列命令

pod search AFNetworking

来看一下我的结果
cocoapods_从安装使用到创建自己的podspec_第1张图片

下面粘贴一下搜出来的结果简单的说一下

-> AFNetworking (2.5.4)

A delightful iOS and OS X networking framework.
pod ‘AFNetworking’, ‘~> 2.5.4’ //(注释)如何使用cocoapods 在Podfile写上这句,就可以使用AF了
- Homepage: https://github.com/AFNetworking/AFNetworking //(注释)AF的主页
- Source: https://github.com/AFNetworking/AFNetworking.git //(注释)AFgit地址
- Versions: 2.5.4, 2.5.3, 2.5.2, 2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0, 2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3,
2.0.0-RC2, 2.0.0-RC1, 1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0, 1.0.1, 1.0, 1.0RC3, 1.0RC2, 1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0,
0.5.1 [master repo]
- Subspecs://(注释)子项目
- AFNetworking/Serialization (2.5.4)
- AFNetworking/Security (2.5.4)
- AFNetworking/Reachability (2.5.4)
- AFNetworking/NSURLConnection (2.5.4)
- AFNetworking/NSURLSession (2.5.4)
- AFNetworking/UIKit (2.5.4)

使用Cocoapods

使用Xcode简历一个demo工程,我们的工程就叫做demo如下图

cocoapods_从安装使用到创建自己的podspec_第2张图片

然后使用终端cd 到这个文件夹下

例如我的工程文件的目录是 /Users/xudongzhang/Desktop/test/cocopodsDemo/demo

在终端执行下列命令

cd /Users/xudongzhang/Desktop/test/cocopodsDemo/demo 
//编写Podfile 文件
vi Podfile

以 AFNetworking 为例
cocoapods_从安装使用到创建自己的podspec_第3张图片

图中的代码如下

platform :ios ,'7.0' 
pod 'AFNetworking', '~> 2.5.4'

下载的文件结构如下
cocoapods_从安装使用到创建自己的podspec_第4张图片
然后执行
pod install

结果是
cocoapods_从安装使用到创建自己的podspec_第5张图片

这个时候查看你的目录
cocoapods_从安装使用到创建自己的podspec_第6张图片
双击demo.xcworkspace 文件(以后你就要使用这个workspace了)
cocoapods_从安装使用到创建自己的podspec_第7张图片

如果很长时间卡在这里
demo5

而且长时间没反应,这是pods在更新自己的本地库,你也可以等待,不过时间较长
也可以不更新可以执行另一个命令

pod install --verbose --no-repo-update

至此恭喜你已经会使用了你的第一个pods项目

Podfile文件介绍

platform :ios ,'7.0' #指定了针对哪一个版本的iOS系统
pod 'AFNetworking', '~> 2.5.4'#指定了AF对应的版本

如果修改了Podfile文件,可以执行

pod update

来更新你的pods库,同样的这个命令会先对本地的pod库进行更新,会等待比较长的时间,如果不想更新本地库,可以执行下面的命令

pod update --verbose --no-repo-update

将自己的工程纳入pod

上面的知识在很多的文章中已经介绍过,下面说一下如何建立自己的pod仓库
pod是如何搜索网上的那些开源库呢?当你执行pod search ‘AF’时,是如何工作呢。其实这个要归功于xxx.podspec文件。这个podspec文件中保存了,希望纳入pods管理的资源和该资源的版本号,下载路径等信息。然后将这个资源推送到Cocoapods的仓库中。执行pod install 或者pod update 一直在更新的其实就是人们推送到pod的podspec文件。这些会被下载到~/.cocoapods目录下,来看一下
cocoapods_从安装使用到创建自己的podspec_第8张图片
对应的AFNetworking在github上的地址。我这里截图大家看一下。
cocoapods_从安装使用到创建自己的podspec_第9张图片
点击AFNetworking.podspec文件查看不在截图了,直接上文件内容(里边有我写的注释)

AFNetworking.podspec 文件

Pod::Spec.new do |s|
  s.name     = 'AFNetworking'#sepc文件的名字
  s.version  = '2.5.4'#对应的版本
  s.license  = 'MIT'#开源协议
  s.summary  = 'A delightful iOS and OS X networking framework.'#简单的介绍
  s.homepage = 'https://github.com/AFNetworking/AFNetworking'#主页
  s.social_media_url = 'https://twitter.com/AFNetworking'#作者的twitter 
  s.authors  = { 'Mattt Thompson' => '[email protected]' }#作者 和他的邮箱
  s.source   = { :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => s.version, :submodules => true }#对应的资源文件的地址,注意后边的tag ,其实就是他的版本,pods是以git为基础管理的。版本就是tag值了
  s.requires_arc = true#是否是arc模式 

  s.ios.deployment_target = '6.0'#iOS对应的版本
  s.osx.deployment_target = '10.8'#OX S 对应的版本

  s.public_header_files = 'AFNetworking/*.h'#公共的头文件地址
  s.source_files = 'AFNetworking/AFNetworking.h'#文件地址,pod会以这个地址下载需要的文件构建pods

  s.subspec 'Serialization' do |ss|#对应的一些子工程
    ss.source_files = 'AFNetworking/AFURL{Request,Response}Serialization.{h,m}'
    ss.ios.frameworks = 'MobileCoreServices', 'CoreGraphics'
    ss.osx.frameworks = 'CoreServices'
  end

  s.subspec 'Security' do |ss|
    ss.source_files = 'AFNetworking/AFSecurityPolicy.{h,m}'
    ss.frameworks = 'Security'
  end

  s.subspec 'Reachability' do |ss|
    ss.source_files = 'AFNetworking/AFNetworkReachabilityManager.{h,m}'
    ss.frameworks = 'SystemConfiguration'
  end

  s.subspec 'NSURLConnection' do |ss|
    ss.dependency 'AFNetworking/Serialization'
    ss.dependency 'AFNetworking/Reachability'
    ss.dependency 'AFNetworking/Security'

    ss.source_files = 'AFNetworking/AFURLConnectionOperation.{h,m}', 'AFNetworking/AFHTTPRequestOperation.{h,m}', 'AFNetworking/AFHTTPRequestOperationManager.{h,m}'
  end

  s.subspec 'NSURLSession' do |ss|
    ss.dependency 'AFNetworking/Serialization'
    ss.dependency 'AFNetworking/Reachability'
    ss.dependency 'AFNetworking/Security'

    ss.source_files = 'AFNetworking/AFURLSessionManager.{h,m}', 'AFNetworking/AFHTTPSessionManager.{h,m}'
  end

  s.subspec 'UIKit' do |ss|
    ss.ios.deployment_target = '6.0'

    ss.dependency 'AFNetworking/NSURLConnection'
    ss.dependency 'AFNetworking/NSURLSession'

    ss.ios.public_header_files = 'UIKit+AFNetworking/*.h'
    ss.ios.source_files = 'UIKit+AFNetworking'
    ss.osx.source_files = ''
  end
end

建立自己的pods

Cococapods是基于git的,所以我们需要使用git来做版本管理,我使用的是github的免费服务。
建立自己的pod项目需要以下几个步骤

1,建立git仓库
2,在仓库中添加工程,编写podspec文件
3,验证spec文件,推送到pod的主干
4,更新本地的pod文件

1, 建立git仓库

建立git仓库(我是在github上建立的),pod对开源协议的要求比较严格,项目必须含有开源协议,在尽力git仓库的时候我们会指定以下协议,直接上图
cocoapods_从安装使用到创建自己的podspec_第10张图片

然后把项目copy到本地,我使用的是github for mac 如下图所示
cocoapods_从安装使用到创建自己的podspec_第11张图片

2在仓库中添加工程,编写podspec文件

在本地创建一个项目,然后推送到git。

来看一下我创建好的工程以及工程的目录
cocoapods_从安装使用到创建自己的podspec_第12张图片

cd到仓库的目录在终端执行
pod spec create xxx xxx是你pod名字
下面是我的项目名XDPodDemo

pod spec create XDPodDemo

pod会为你创建一个名为xxx.podspec 文件。
cocoapods_从安装使用到创建自己的podspec_第13张图片
成功后你会看到我们的目录下面多了一podspec文件,打开修改
(这里需要注意一个问题pod的版本是根据git的tag来区分的,所以我们创建好工程之后需要修为我们的仓库打一个tag,并且推送到远程仓库)

为git打tag的命令如下

git tag 0.01 ##为git打tag
git push --tags ##将tag推送到远程仓库
  • 注 关于git的操作,不是本文的重点。这里不做太多的介绍
    如果有需要,请关注我随后的文章将会介绍一些git的操作。

文件内容较多,我这里不再一一解释了,直接上我修改完成后的文件

#
#  Be sure to run `pod spec lint XDPodDemo.podspec' to ensure this is a
#  valid spec and to remove all comments including this before submitting the spec.
#
#  To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html
#  To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/
#

Pod::Spec.new do |s|

  # ―――  Spec Metadata  ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
  #
  #  These will help people to find your library, and whilst it
  #  can feel like a chore to fill in it's definitely to your advantage. The
  #  summary should be tweet-length, and the description more in depth.
  #

  s.name         = "XDPodDemo"
  s.version      = "0.0.1"
  s.summary      = "一个建立pod仓库的简单demo."

  s.description  = <<-DESC
                   这只是一个建立pod仓库的简单demo,并没有实际的意思。教学使用。

                   * Think: Why did you write this? What is the focus? What does it do?
                   * CocoaPods will be using this to generate tags, and improve search results.
                   * Try to keep it short, snappy and to the point.
                   * Finally, don't worry about the indent, CocoaPods strips it!
                   DESC

  s.homepage     = "https://github.com/hytzxdCode/XDPodsDemo"
  s.license      = { :type => "MIT", :file => "LICENSE" }
  s.author             = { "张旭东" => "[email protected]" }
  s.platform     = :ios, "8.0"
  s.source       = { :git => "https://github.com/hytzxdCode/XDPodsDemo.git", :tag => "0.0.1" }
  s.source_files  = "Classes", "XDPodsDemo/XDPodsDemo/Classes/**/*.{h,m}"

  # s.framework  = "SomeFramework" #可以指定你需要的framework 由于我这里是一个简单的demo,所以这里没有指定
  # s.frameworks = "SomeFramework", "AnotherFramework"

  # s.library   = "iconv"
  # s.libraries = "iconv", "xml2"

  s.requires_arc = true

  # s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
   s.dependency "JSONKit", "~> 1.4" #这里可以指定依赖一些其他的开源库,这里使用了jsonkit

end

基本上都不需要怎么解释但是有几条还是说一下

s.source s.source_files

这里的 source 我们看出是一个git 的地址,这里我们调试的时候,可以先暂时设置成本地git,调试完毕之后就可以发布 增加tag。想要最新的代码只需要这样设置就好

{ :git => “https://github.com/studentdeng/ShareCenterExample.git“}
我们的git项目中,并不是所有的代码都需要被引用到我们的代码中,通常project还会包括一些example,test cases等,这里的 source_files 就是用来指定一些文件夹,或是文件。我这里的设置也很容易理解,就是ShareCenter下面的递归后的所有后缀是h、m的子文件。

s.frameworks s.library

这里配置的就是我们的framework 和 library,这里注意一下library的名字规则就好。

vendored_libraries

这里用来指定外部的静态库。这里我们指定了sina sso认证的SDK

s.prefix_header_contents

这里用来指定预编译的配置,这里一定要鄙视一下renren的超级渣渣SDK。这里提供一种解决方法。

然后执行

pod lib lint 

这条命令会验证你的spec文件,根据错误提示来修改。

3,验证spec文件,推送到pod的主干

来看一下我修改一些的过程(不要怕出错,从命令提示中慢慢修改,总能学到很多的)
cocoapods_从安装使用到创建自己的podspec_第14张图片
这中间需要先注册到pod主干注册一下
命令是

$ pod trunk register orta@cocoapods.org 'Orta Therox' --description='macbook air'

这里使用邮箱就可以,不要密码

然后我们把项目推送到pod的主干

pod trunk push XDPodDemo.podspec 

下面是我执行的截图
cocoapods_从安装使用到创建自己的podspec_第15张图片
这样子pods库中就有了你自己的工程

4,更新本地的pod文件

如果要使用,需要先更新本地的pods仓库

pod repo update

这个过程比较长,需要耐心等待 ,更新完之后上图
cocoapods_从安装使用到创建自己的podspec_第16张图片
然后搜索我们刚才建立的pod库

pod search 'XDPodDemo'

cocoapods_从安装使用到创建自己的podspec_第17张图片
至此,已经建立了我们自己的pod仓库
下面是我使用刚藏建立的仓库成功后的截图

从图中可以看出,已经将我们sepc文件中要求的东西纳入了新的库中
cocoapods_从安装使用到创建自己的podspec_第18张图片

写在最后的话

本人水平有限,很多东西难免有不对的地方。如果您发现了,恳请您在评论区指点一下。
非常感谢!
参考文章:
* http://code4app.com/article/cocoapods-install-usage
* http://www.iwangke.me/2013/04/18/advanced-cocoapods/
* http://nshipster.cn/cocoapods/
* https://cocoapods.org/

你可能感兴趣的:(个人总结)