iOS 开发之Cocoapods的使用及制作私有pods

一、安装CocoaPods

第一步:升级ruby环境

更新Ruby环境

如果出现

更新ruby错误

然后就可以进行Cocoapods的安装了,

第二步:更换淘宝的RubyGems镜像代替官方版本,

移除官方的镜像

更换成淘宝镜像

验证是否更换成功

第三步:安装Cocoapods

如果你的是版本是10.11以下用这个命令

安装Cocoapods

如果你的是版本是10.11以上用这个命令

安装Cocoapods

然后执行

将Cocoapods Specs repository复制到你电脑的~/.cocoapods目录下

现在这个repo文件夹大概有750M,所以下载起来非常慢,如果你等的比较着急,想看一下当前下载的大小

首先

进入cocoa pods文件夹中

然后

用这个命令可以查看文件夹大小,我的已经下载完成了,一共是750M

至此我们的Cocoapods就安装完毕了。

二、如何使用我们的Cocoapods

第一步:创建一个Xcode工程并且进入你的Xcode工程的目录中

进入工程对应的文件夹

第二步:创建一个Podfile

执行pod init创建一个Podfile

或者

直接用vim Podfile创建一个Podfile

它们之间的区别就是pod init生成的Podfile会默认帮我们生成一些代码,而vim Podfile的Podfile是空的。

我是用pod init生成的Podfile文件

生成的默认代码

然后我们就要编写我们Podfile了,详见此文第四部分-我的Podfile

编辑好的Podfile文件

第三步:执行pod install.

初始化完成

然后打开MyApplication.xcworkspace就可以了。

三、pod update 和 pod install的区别

大部分人第一次初始化Podfile的时候会用pod install,之后就一直用pod update。

那么我们到底该怎么用他们呢,他们的之间的区别是什么呢?

pod install:每次如果下载新的pods的时候,都会把版本的信息写进podfile.lock中,podfile.lock会追踪这些版本,并且锁定这些版本。当你用这个命令的时候,他只会下载Podfile.lock中不存在的三方库。他也只会去下载Podfile.lock中记录的版本,而不会是检测一个更新的版本。如果没有Podfile.lock中没有指定版本,他会去搜索Podfile文件中对应的版本,如果不指定版本,默认为最新版本。

pod update [PODNAME]:会直接去找[PODNAME]最新的三方库,而不会去管Podfile.lock中的版本,他会一直下载最新版本,如果你指定了版本,他会下载你指定版本中最新的版本。如果使用 pod update,那么他会将你 Podfile中的所有三方库都更新成最新的版本。而且他会把Podfile.lock中的版本更改成对应的版本。

四、我的Podfile

第一行:你的平台+你支持的版本

(platform :ios, ‘8.0‘)

第二行:必须写上你所连接的Xcode target,这个一般就是你App的工程的名称

(target ‘MyApplication‘ do)

最后一行:end

(end)

第三到N行:在每一行添加一个你想要使用的三方库

(pod ‘$PODNAME‘)

我们有以下的几种方式添加三方库

一、添加开源的三方库

可以用pod search [PODNAME]命令搜索你想要的三方库

搜索到想要的三方库把对应的pod [PODNAME]添加到Podfile中即可,如果用pod [PODNAME]/[Subspecs]那么只使用对应的子三方库

关于版本的问题

‘> 0.1‘ :高于0.1的版本

‘>=0.1‘:0.1版本或者更高的版本

‘<0.1‘:小于0.1的版本

‘<=0.1‘:0.1版本或者更低的版本

‘~> 0.1.2‘:版本0.1.2~版本0.2,不包括0.2

‘~> 0.1‘:版本0.1~版本1.0,不包括版本1.0

二、从本地添加

1.从本地文件夹添加

pod ’Alamofire’, :path => ‘~/Documents/Alamofire‘

2.从主分支添加

pod ‘Alamofire’, :git => ’https://github.com/Alamofire/Alamofire.git‘

3.从次分支添加

pod‘Alamofire‘,:git=>‘https://github.com/Alamofire/Alamofire.git‘,:branch=>‘dev‘

4.用指定的tag

pod‘Alamofire‘,:git=>‘https://github.com/Alamofire/Alamofire.git‘,:tag=>‘3.1.1‘

5.用指定的commit

pod‘Alamofire‘,:git=>‘https://github.com/Alamofire/Alamofire.git‘,:commit=>‘0f506b1c45‘

五、创建私有podspec

这个和我们平常的项目最大的区别就是有必须.podspec和LICENSE这两个文件。

整体先说明一下创建一个私有的podspec包括如下那么几个步骤:

1.创建并设置一个私有的Spec Repo。

2.创建Pod的所需要的项目工程文件,并且有可访问的项目版本控制地址。

3.创建Pod所对应的podspec文件。

4.本地测试配置好的podspec文件是否可用。

5.向私有的Spec Repo中提交podspec。

6.在个人项目中的Podfile中增加刚刚制作的好的Pod并使用。

7.更新维护pod spec。

在这一系列的步骤中需要创建两个Git仓库,分别是第一步和第二步(第二步不一定非要是Git仓库,只要是可以获取到相关代码文件就可以,也可以是SVN的,也可以说zip包,区别就是在podspec中的source项填写的内容不同),并且第一步只是在初次创建私有podspec时才需要,之后在创建其他的只需要从第二步开始就可以。本文只介绍在Git环境下的操作,其他环境其他方式暂不说明。

1.创建私有Spec Repo

先来说第一步,什么是Spec Repo?它是所有的Pods的一个索引,就是一个容器,所有公开的Pods都在这个里面,它实际是一个Git仓库remote端在GitHub上,但是当你使用了Cocoapods后它会被clone到本地的~/.cocoapods/repos目录下,可以进入到这个目录看到master文件夹就是这个官方的Spec Repo了。

官方的Spec Repo目录

因此我们需要创建一个类似于master的私有Spec Repo,这里我们可以fork官方的Repo,也可以自己创建,个人建议不fork,因为你只是想添加自己的Pods,没有必要把现有的公开Pods都copy一份。所以创建一个 Git仓库,这个仓库你可以创建私有的也可以创建公开的,不过既然私有的Spec Repo,还是创建私有的仓库吧,需要注意的就是如果项目中有其他同事共同开发的话,你还要给他这个Git仓库的权限。因为GitHub的私有仓库是收费的,我还不是GitHub的付费用户,所以我使用了其他Git服务,我使用的是cocoachina,当然还有其他的可供选择开源中国、Bitbucket以及CSDN Code.

创建完成之后在Terminal中执行如下命令

MyLibrary是我们的私有库名字,后面是对应的git远程仓库的网址

此时如果成功的话进入到~/.cocoapods/repos目录下就可以看到PrivateRepo这个目录了。至此第一步创建私有Spec Repo完成。

添加成功对应的文件夹

PS:如果有其他合作人员共同使用这个私有Spec Repo的话在他有对应Git仓库的权限的前提下执行相同的命令添加这个Spec Repo即可。

2.创建Pod项目工程文件

这个第二步没有什么好介绍的,如果是有现有的组件项目,并且在Git的版本管理下,那么这一步就算完成了,可以直接进行下一步了。

如果你的组件还在你冗余庞大的项目中,需要拆分出来或者需要自己从零开始创建一个组件库,那么我建议你使用Cocoapods提供的一个工具将第二步与第三步结合起来做。

现在来说一下这个工具,首先我们可以用pod lib create MyLibrary,可以带上--template-url=URL参数(URL表示git仓库的地址),就拿我创建的podTestLibrary为例子具体讲一下这里是如何操作的,先cd到要创建项目的目录然后执行

进入你想创建的指定的文件中

他会问我们五个问题:

第一个问题:Objective-C 或者 Swift

第二个问题:Making a Demo Application,如果选是就会在你的Xcode工程中新建一个工程。

如果你想要一个demo或者你需要一个测试单元在你的工程中,你应该选是

第三个问题:Choosing a Test Framework,你应该测试你的工程,确保别人可用

如何选择:如果你不能决定,就选Specta/Epecta

第四个问题:View-based Testing,会根据你选的测试自动生成一个

第五个问题: 你的前缀是什么。

这个里面要是不填的话默认就是横线的答案

当你填完这些他会默认调用pod install帮我们初始化好工程,并帮我们打开对应的工程

自动帮我们执行,不用我们进行配置

然后可以看到MyLibrary的目录如下(如果没有tree命令,可以用brew安装一个):

MyLibraray下面二层的目录结构

这时打开MyLibrary工程,会看到如下的文件目录:

MyLibrary对应的文件目录

1.Podspec metadata:可以让你改变你的README和MyLibrary.podspec

2.Example for MyLibrary:一个让你编写测试文件的文件夹,如果你没有选择测试文件夹,你就没有这个目录。

3.Tests:这里就是之前选择的测试模块

4.Development Pods:你实际写代码的地方,用你的代码代替ReplaceMe.m文件

5.Frameworks:

如果你写好了你的库,想写测试模块或者测试demo的时候,首先进入Example文件夹执行pod update命令,打开工程你应该包含 #import <MyLibrary/WaterFlowLayout.h>

Example文件夹对应的目录

特别注意:当你更改了了Pod/Classes或者Pod/Assets或者更新了你的pod spec,你应该执行pod install命令或者 pod update。

测试无误可以将项目添加并推送到远程仓库,配置你的podspec文件。

本地追踪并且快照

关联远程服务器

推送到远程master分支并打上tag

1、你应该保存你的.podspec文件格式是正确的

我的MyLibrary.podspec文件

用 pod lib lint 或者 pod spec lint可以检查.podspec有没有error或者warning,这两个都是不能出现的,两者的区别就是pod lib lint 不访问网络,pod spec lint 会检查仓库和对应的tag值。

2、如果你提交你的开源库到trunk,你不可以用任何的error 或者 warnings,不过你的xcode中是可以用警告,这里不做解释。

3、如果提交到你的私人的仓库中,如果你本地仓库已经有了对应的私有仓库,用

MyLibrary表示的是本地的私有库,MyLibrary表示对应的.podspec文件

否则你要先建立一个私有仓库.

3.创建podspec文件

如果已经有了现成的项目,么就需要给这个项目创建一个podspec文件,创建它需要执行Cocoapods的另外一个命令,官方文档在这里

PodTestLibrary为本地库名,后面为对应的git网址

执行完之后,就创建了一个podspec文件,他其中会包含很多内容,可以按照我之前介绍的进行编辑,没用的删掉。编辑完成之后使用验证命令验证一下,验证无误就可以进入下一步了。

本地测试podspec文件

我们可以创建一个新的项目,在这个项目的Podfile文件中直接指定刚才创建编辑好的podspec文件,看是否可用。 在Podfile中我们可以这样编辑,有两种方式

可以用指定:path或者用指定:podspec路径这两种方法

然后执行pod install命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了,不过它们并没有在Pods目录下,而是跟测试项目一样存在于Development Pods/PodTestLibrary中,这是因为我们是在本地测试,而没有把podspec文件添加到Spec Repo中的缘故。

用.xcworkspace打开的文件目录如下

在项目中编写代码,测试库文件无误后就可以开始下一步了,提交podspec到Spec Repo中。

向Spec Repo提交podspec

向Spec Repo提交podspec需要完成两点一个是podspec必须通过验证无误,在一个就是删掉无用的注释(这个不是必须的,为了规范还是删掉吧)。 向我们的私有Spec Repo提交podspec只需要一个命令

完成之后这个组件库就添加到我们的私有Spec Repo中了,可以进入到~/.cocoapods/repos/WTSpecs目录下查看

再去看我们的Spec Repo远端仓库,也有了一次提交,这个podspec也已经被Push上去了。

至此,我们的这个组件库就已经制作添加完成了,使用pod search命令就可以查到我们自己的库了

这里说的是添加到私有的Repo,如果要添加到Cocoapods的官方库了,可以使用trunk工具,具体可以查看官方文档

使用制作好的Pod

在完成这一系列步骤之后,我们就可以在正式项目中使用这个私有的Pod了只需要在项目的Podfile里增加以下一行代码即可

$ pod ‘PrivateRepo‘,‘~> 0.1.0‘

然后执行pod update,更新库依赖,然后打开项目可以看到,我们自己的库文件已经出现在Pods子项目中的Pods子目录下了,而不再是Development Pods。

更新维护podspec

最后再来说一下制作好的podspec文件后续的更新维护工作,比如如何添加新的版本,如何删除Pod。

我已经制作好了PodTestLibrary的0.0.1版本,现在我对他进行升级工作,这次我添加了更多的模块到PodTestLibrary之中,包括工具类,底层Model及UIKit扩展等,这里又尝试了一下subspec功能,给PodTestLibrary创建了多个子分支。

具体做法是先将源文件添加到Pod/Classes中,然后按照不同的模块对文件目录进行整理,因为我有四个模块,所以在Pod/Classes下有创建了四个子目录,完成之后继续编辑之前的PodTestLibrary.podspec,这次增加了subspec特性

因为我们创建了subspec所以项目整体的依赖dependency,源文件source_files,头文件public_header_files,资源文件resource等都移动到了各自的subspec中,每个subspec之间也可以有相互的依赖关系,比如UIKitAddition就依赖于CommonTools。

编辑完成之后,在测试项目里pod update一下,几个子项目都被加进项目工程了,写代码验证无误之后,就可以将这个工程push到远端仓库,并打上新的tag->1.0.0。

最后再次使用pod lib lint验证编辑好的podsepc文件,没有自身的WARNING或者ERROR之后,就可以再次提交到Spec Repo中了,命令跟之前是一样的

最后介绍一下如何删除一个私有Spec Repo

PrivateRepo用你的私有库代替

这样这个Spec Repo就在本地删除了,我们还可以通过

前面表示你私有库的名字,后面表示     git对应的远程仓库的地址

再把它给加回来。

如果我们要删除私有Spec Repo下的某一个podspec怎么操作呢,此时无需借助Cocoapods

cd到对应的文件夹,删掉对应的库就好了

参考文章:https://guides.cocoapods.org/

http://www.cocoachina.com/ios/20150228/11206.html

时间: 2024-10-11 18:57:40

iOS 开发之Cocoapods的使用及制作私有pods的相关文章

iOS开发之CocoaPods的使用

透明色:00ff00ff //设置柱状图的颜色                ColorSet cs = new ColorSet();                cs.Id = "colorset1"; #region 设置柱状图的颜色 待开发                    string strColor = oYAXIS.Color;                    switch (strColor)                    {           

iOS开发之CocoaPods的安装与使用

前言部分 注:本文内容摘抄自 http://blog.csdn.net/lizhongfu2013/article/details/26384029  内容做了些许修改以及更新. 一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 二.安装 由于网上的教程基本都大同小异,但细节之处还不是很完善,所以借机会在这里补充下: 注:要使用CocoaPods,那就要下载安装

iOS开发之CocoaPods(objective-c第三方库管理工具)

介绍: iOS开发中,大多数情况下,我们都需要集成一些第三方依赖库,对于一个稍大的项目,用到的第三方依赖库的数量也非常可观.CocoaPods是objective-c第三方库管理工具,方便第三方库的管理. 用法: 1. 安装 $ sudo gem install cocoapods 2. 用法 在iOS项目目录下新建Podfile文件,添加第三方依赖库,如 source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' p

李洪强iOS开发之iOS好文章收集

李洪强iOS开发之iOS好文章收集 该文收集朋友们转发或自己的写的技术文章,如果你也有相关的好文章,欢迎留言,当好文章多的时候,我会对这些好文章进行分门别类 文章 简述 日期 直播服务配置 使用 nginx 和 rtmp 插件搭建视频直播和点播服务器 2015-05-12 20:13:00 iOS9适配技巧 图iOS9适配新技巧 2015-09-29 09:01 TextKit分页效果 图文混排 2015年6月1日 iPhone 6 / 6 Plus 设计·适配方案 屏幕适配 2014-11-2

IOS开发之copy的问题

copy的目的就是修改副本,修改原始对象和副本时不会产生干扰. 定义一个不可变属性A,再定义一个可变属性B.用B做添加删除等操作后再将B赋值给A时,有些人习惯用A = B:其实这样是不安全的. 假设有下面的一段代码: ? 1 2 3 4 5 6 7 8 9 10   int main() {    NSMutableString *strM = [NSMutableString [email protected]"123"];    NSString *str = strM;    N

iOS开发之WKWebView简单使用和常用使用场景

iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版.本着对新事物的好奇,就上网查了一下,但是找了好多个都没说的多了详细,于是就问谷歌,找文档,看看使用方法,试用了一下,果然不错,记录下来,大家分享! WKWebView的特点: 性能高,稳定性好,占用的内存比较小, 支持JS交互 支持HTML5 新特性 可以添加进度条(然并卵,不好用,还是习惯第三方的). 支持内建手势, 据说高达60fps的刷

iOS开发之Auto Layout入门

随着iPhone6与iOS8的临近,适配的问题讲更加复杂,最近学习了一下Auto Layout的使用,与大家分享.  什么是Auto Layout? Auto Layout是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往Autoresizing在布局方面的不足之处,以及未来面对更多尺寸适配时界面布局可以更好的适应. 为什么要用Auto Layout? Autolayout能解决不同屏幕(iPhone4,iPhone5,iPad...)之间的适配问题. 在iPhone4时代开发者只需要适

iOS开发之UILabel

UILabel是iOS开发中常用的一个组件,主要用来显示内容. UILabel的主要使用如下: ? 1 2 3 4 5 6 7 8 9 10 /*尺寸*/ CGRect labelRect = CGRectMake(100, 100, 80, 40); /*初始化*/ UILabel *titleLabel = [[UILabel alloc] initWithFrame:labelRect]; /*一些属性的设置*/ titleLabel.font = [UIFont systemFontOf

iOS开发之多XIB之间相互关联

Xib link Xib 1.直接加载xib中的UIView 创建一个View1.xib, 随便设一个背景色,加一个标识UILabel, 这样好知道是这个view是哪一个view. 你可以在这个view上加作意的subview,我只是说明原理,所以这儿并没有加作何subview. 最终我的View1如下图: 由于View1会放到其它View上作为subview,所以这儿size是Freeform, Status Bar是:None. 将下面代码放到viewDidLoad中: &1这行代码就是加载