当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等。如果使 用他们,传统的方法是,在git上把他们下载下来,然后去配置。这个工作很繁琐,而且也容易出错。不 过有了Cocoapods你就会从这些繁琐的工作中解脱出来。
Cocoapods是Swif和Objective-C的cocoa项目依赖关系管理的工具。
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 以AFNetworking为例子
在终端执行下列命令
pod search AFNetworking
下面粘贴一下搜出来的结果简单的说一下
-> 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)
使用Xcode简历一个demo工程,我们的工程就叫做demo如下图
然后使用终端cd 到这个文件夹下
例如我的工程文件的目录是 /Users/xudongzhang/Desktop/test/cocopodsDemo/demo
在终端执行下列命令
cd /Users/xudongzhang/Desktop/test/cocopodsDemo/demo
//编写Podfile 文件
vi Podfile
图中的代码如下
platform :ios ,'7.0'
pod 'AFNetworking', '~> 2.5.4'
pod install
这个时候查看你的目录
双击demo.xcworkspace 文件(以后你就要使用这个workspace了)
而且长时间没反应,这是pods在更新自己的本地库,你也可以等待,不过时间较长
也可以不更新可以执行另一个命令
pod install --verbose --no-repo-update
至此恭喜你已经会使用了你的第一个pods项目
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 search ‘AF’时,是如何工作呢。其实这个要归功于xxx.podspec文件。这个podspec文件中保存了,希望纳入pods管理的资源和该资源的版本号,下载路径等信息。然后将这个资源推送到Cocoapods的仓库中。执行pod install 或者pod update 一直在更新的其实就是人们推送到pod的podspec文件。这些会被下载到~/.cocoapods目录下,来看一下
对应的AFNetworking在github上的地址。我这里截图大家看一下。
点击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
Cococapods是基于git的,所以我们需要使用git来做版本管理,我使用的是github的免费服务。
建立自己的pod项目需要以下几个步骤
1,建立git仓库
2,在仓库中添加工程,编写podspec文件
3,验证spec文件,推送到pod的主干
4,更新本地的pod文件
建立git仓库(我是在github上建立的),pod对开源协议的要求比较严格,项目必须含有开源协议,在尽力git仓库的时候我们会指定以下协议,直接上图
然后把项目copy到本地,我使用的是github for mac 如下图所示
在本地创建一个项目,然后推送到git。
cd到仓库的目录在终端执行
pod spec create xxx xxx是你pod名字
下面是我的项目名XDPodDemo
pod spec create XDPodDemo
pod会为你创建一个名为xxx.podspec 文件。
成功后你会看到我们的目录下面多了一podspec文件,打开修改
(这里需要注意一个问题pod的版本是根据git的tag来区分的,所以我们创建好工程之后需要修为我们的仓库打一个tag,并且推送到远程仓库)
为git打tag的命令如下
git tag 0.01 ##为git打tag
git push --tags ##将tag推送到远程仓库
文件内容较多,我这里不再一一解释了,直接上我修改完成后的文件
#
# 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文件,根据错误提示来修改。
来看一下我修改一些的过程(不要怕出错,从命令提示中慢慢修改,总能学到很多的)
这中间需要先注册到pod主干注册一下
命令是
$ pod trunk register orta@cocoapods.org 'Orta Therox' --description='macbook air'
这里使用邮箱就可以,不要密码
然后我们把项目推送到pod的主干
pod trunk push XDPodDemo.podspec
如果要使用,需要先更新本地的pods仓库
pod repo update
这个过程比较长,需要耐心等待 ,更新完之后上图
然后搜索我们刚才建立的pod库
pod search 'XDPodDemo'
至此,已经建立了我们自己的pod仓库
下面是我使用刚藏建立的仓库成功后的截图
从图中可以看出,已经将我们sepc文件中要求的东西纳入了新的库中
本人水平有限,很多东西难免有不对的地方。如果您发现了,恳请您在评论区指点一下。
非常感谢!
参考文章:
* http://code4app.com/article/cocoapods-install-usage
* http://www.iwangke.me/2013/04/18/advanced-cocoapods/
* http://nshipster.cn/cocoapods/
* https://cocoapods.org/