我们在这里,使用的是 第一部分使用pod lib create YohunlUtilsPod 创建的framework工程来说明.其创建过程在此就不重复了,当然你也可以下载我已经创建好的demo https://github.com/yohunl/YohunlUtilsPod

PS:既然是私有库,那么我们基本上不会使用github的,相信大家公司都有相应的git平台.不管使用什么git平台提供的服务,操作方式都是一样的

一:建立自己私有的spec仓库

打开隐藏目录,可以使用终端命令  defaults write com.apple.finder AppleShowAllFiles -bool TRUE;killall Finder  (关闭隐藏的终端命令 defaults delete com.apple.finder AppleShowAllFiles;killall Finder)

打开隐藏目录.cocoapods(这个目录在你的个人目录下,比如我电脑上是 /Users/yohunl/.cocoapods)

大家请注意上图, .cocoapods下的文件夹 repos,这里的repo是repository仓库的缩写.repos下存放的是仓库的集合.这里的master就是cocoapods官方建立的仓库,也就是我们所谓的公共库

specs目录下存放的就是所有的提交到cocoapods的开源库的podspec文件的集合.

其结构如下:

其组成方式是

specName  ——   版本version ——  specName.podspec

(master库里的现在是  specName.podspec.json,这个.json文件就是 podspec文件加了一个后缀而已,至于为什么官方库要这么做,我也没查到理由.可以采用命令pod ipc spec来将spec文件转换成json.)

当然了,你可能很奇怪这个文件夹是怎么来的,这个文件夹是当你安装了cocoapods后,第一次pod install的时候,cocoapods自己通过命令  pod setup 来建立的(这个pod setup命令是不需要你手动执行的).不过如果你想重建这个官方repos仓库集合的话,可以自己执行

1
2
pod repo remove master
pod setup

此两句是重建pod的repo文件夹

言归正传

这个是官方的参考 建立私有repo的文档 http://guides.cocoapods.org/making/private-cocoapods.html

我们在github上建立一个空的仓库,命名为yohunlSpecs,这个仓库是用来存放我们自己的所有的私有库的specs文件的,就如同官方的 https://github.com/CocoaPods/Specs 是用来存放所有官方的specs文件一样

建立一个本地的私有repos

官方参考的私有

http://guides.cocoapods.org/making/private-cocoapods.html  Private Pods  写的很详细,并且还给出了示例

1
$ pod repo add REPO_NAME SOURCE_URL

其中的 REPO_NAME是我们要添加的私有repo的名称,后面的是其地址,注意这个只是创建而已,也就是只是在~/.cocoapods/repos 目录下 目录下添加了一个文件夹而已,但是,并没有在其中添加 spec文件

在终端执行命令  pod repo add yohunlSpecs  git@github.com:yohunl/yohunlSpecs.git  或者  pod repo add yohunlSpecs  https://github.com/yohunl/yohunlSpecs.git  ,很多文章说,这里最好是采用http模式的git地址,不过我试了,两者都是可以的,执行命令后

在.cocoapods目录下

看到没,这里出现了一个我们自己的私有仓库  yohunlSpecs,这是一个空的仓库

二:添加我们在教程一中创建的工程 YohunlUtilsPod的spec文件到上面创建的yohunlSpec库中去

(PS:由于这个yohunlUtilsPod是采用pod lib create 创建的,本身已经建立了podspec文件了.当然,如果你的工程是已经建立好了的,可以采用命令  pod spec create specName来创建,官方创建spec文件的文档http://guides.cocoapods.org/making/specs-and-specs-repo.html,如果带有子库的化,podspec文件将会变得有些复杂, 可以参考 http://www.cocoachina.com/ios/20150228/11206.html).

打开工程 的spec文件

根据需要修改对应的项.这个文件本质上是一个ruby格式的文件. 修改完毕后,执行  pod spec lint或者pod lib lint修改完,此命令用来验证这个spec是不是合格的

进入工程目录 使用命令 pod spec lint,你会得到 [!] 2 out of 2 specs failed validation.,这个错很奇怪,不用管它!其它错误不能不管哦,要根据提示修改,直到没有其它错误为止!

采用命令  pod lib lint来验证就是正确的.

https://guides.cocoapods.org/terminal/commands.html#commands  pod的命令

查了一下这两个命令之间的区别

pod spec lint —用来验证本地使用pod spec create添加的podspec文件(但是,这个命令常常会出现 2 out of 2 specs failed validation.此类的错误,故推荐大家都使用 pod lib lint)

pod lib lint  这个是检验由pod lib create创建的lib工程的spec的合法性(经过检验,这个命令是也是可以适用于第一种情况的.)

经过命令的检验,我们的YohunlUtilsPod.podspec符合规范了.由于cocoapods的repo是基于git的tag的,所以我们需要给工程YohunlUtilsPod添加一个tag.注意,这里添加的tag需要和podspec文件中描述的一致,不然以后别人引用的时候,cocoapods就不知道该下载什么代码了.

给工程添加一个tag,可以用第三方工具,也可以采用命令行(xcode本身不支持设置tag).,此处我采用的是我熟悉的工具tower,你们也可以使用自己熟悉的工具或者命令行

如果用命令行的话

1
2
3
$ git tag '1.0.0'
$ git push --tags
$ git push origin master

创建一个tag 1.0.0(和podspec文件中描述的一致),push到github.进入github,可以看到,添加成功了.此处衍生一下,这里一般是类似1.0.2的版本号。版本号的规范参考 http://semver.org/lang/zh-CN/ 我们以后建立的工程的版本号最好都是符合规范的!

执行命令  pod repo push yohunlSpecs YohunlUtilsPod.podspec   [在YohunlUtilsPod.podspec所在的目录下哦]

执行完成后,可以看到.cocoapods发生了变化了

可以看到,我们的podspec文件已经添加到了yohunlSpecs这个repo下了,并且已经按照格式建立好了

执行pod search YohunlUtilsPod

可以看到,已经建立好了.

三:测试其是否可用

建立一个普通的工程命名为TestPodFrameworkDemo,在目录下添加podfile文件,添加pod 'YohunlUtilsPod'

$ pod init  建立podfile文件

修改文件podfile内容为下

1
2
3
4
5
target 'TestPodFrameworkDemo' do
pod 'YohunlUtilsPod'
end
target 'TestPodFrameworkDemoTests' do
end

执行

1
$ pod install

这个时候,得到提示

尼玛!!!!不科学啊,命名pod search有,为什么执行的时候就没有了????什么情况????

其实是这样的,如果你不指定的话,pod install只会在master下搜索有没有,而我们的spec文件在yohunlSpecs下面,当然找不到了!

解决方式

在podfile文件最上方添加

1
2
source 'https://github.com/yohunl/yohunlSpecs.git'  #我们自己的私有spec仓库的地址
source 'https://github.com/CocoaPods/Specs.git'  #官方仓库的地址

默认情况下,如果你不添加source的话,系统会默认使用 https://github.com/CocoaPods/Specs.git 官方源,但是当你添加了source后,系统就不再自动搜索 官方源,所以这两句都必须添加!!!!!

例如 当你的文件中   包含有 source 'https://github.com/yohunl/NetworkLibSpec.git',那么记得也要添加默认的官方的 source 'https://github.com/CocoaPods/Specs.git' 要不然,则其它基于官方的都不能pod了

例如:

1
2
3
4
5
6
7
8
9
platform :ios, '7.0'
target 'NetworkLibTest' do
pod 'NetworkLib'
pod 'SDWebImage'
#pod 'NetworkLib', :path => '../NetworkLib'
#pod 'NetworkLib', :path => '~/code/Cocoapods/podTest/PodTestLibrary'      
end
target 'NetworkLibTestTests' do
end

没有包含 source 'https://github.com/CocoaPods/Specs.git'的话,则会出现

1
2
3
4
5
lingyohunldeMBP:NetworkLibTest yohunl$ pod install
Updating local specs repositories
Cloning spec repo `yohunl` from `https://github.com/yohunl/NetworkLibSpec.git`
Analyzing dependencies
[!] Unable to find a specification for `SDWebImage`

再次执行  pod install,成功

以后,谁想使用我们这个私有库,需要做的是

在podfile文件中添加

还有

1
pod 'YohunlUtilsPod'

题外话:

1.怎么查看本地有多少个repos呢?

命令  pod repo可以知道本地有几个repo!!

SZ-lingdaiping:TestPodFrameworkDemo yohunl$ pod repo

master

- Type: git (master)

- URL:  https://github.com/CocoaPods/Specs.git

- Path: /Users/yohunl/.cocoapods/repos/master

1 repo

刚刚从中可以看出,其不仅列出了本地共有多少个repo,还包括每个repo的地址

2.对于一个repo下有很多个podspec,例如master下有成百上千个,那么我们怎么统一验证他们是否都符合规范呢?

例如我们可以用命令进入~/.cocoapods/repos/yohunlPodSpecs下执行的pod repo lint .(有一个点的)是验证这个repo下所有的

/Users/yohunl/.cocoapods/repos/yohunl

SZ-lingdaiping:yohunl yohunl$ pod repo lint .

Linting spec repo `yohunl`

.

Analyzed 1 podspecs files.

All the specs passed validation.

3.cocoapods的常用命令

pod list  列出所有可用的第三方库

pod search query 搜包含query的第三方库   注意:这两个命令只搜存在于本地 /Users/yohunl/.cocoapods/ 下的文件

如果搜索网络的,可以先更新本地  pod repo update master,然后再搜索

pod lib create frameworkName  创建一个framework工程

pod lib lint 验证一个podspec文件是否有错误

podinstall --no-repo-update错误 这里的参数—no-repo-update,是告诉cocoapods不要更新repo.有么有感觉每次pod install都很慢,那是因为每一次都会先更新本地的repo,加上此参数,就跳过了这个过程,将会很快

pod init 可以建立一个空的podfile

建立pod的spec文件   pod spec create spec名字  http://www.theonlylars.com/blog/2013/01/20/cocoapods-creating-a-pod-spec/

pod install 命令时会引发许多操作。要想深入了解这个命令执行的详细内容,可以在这个命令后面加上 --verbose

4.其它使用我们建立的framework的方式

当我们添加

并且执行pod install后

进入.cocoapods文件夹,可以看到  又多了一个repo:yohunl!!!

这说明什么问题呢?

这说明我么之前的

pod repo add yohunlSpecs  git@github.com:yohunl/yohunlSpecs.git

pod repo push yohunlSpecs YohunlUtilsPod.podspec

这两句话只是为了给 https://github.com/yohunl/yohunlSpecs 中添加spec文件啊.当添加完成后,其实我们可以删除添加到本地的repo了

删除repo的命令

pod repo remove yohunlSpecs     [pod repo remove  repo名称]

我们删除我们添加的私有库 [哈哈,其实你都显示了隐藏目录了,也可以直接进去直接删除文件夹的!]

pod repo remove yohunl

pod repo remove yohunlSpecs

删除后,可以看到

你再执行pod install

发现 系统会自己根据

去下载对应的repos

如果不加入repos(也就是不添加podspec文件到系统的.cocopods文件夹下).能不能使用cocoapods呢?也是可以的

1
2
3
4
5
target 'TestPodFrameworkDemo' do
pod 'YohunlUtilsPod' , :path => '/Users/yohunl/YohunlUtilsPod' 
end
target 'TestPodFrameworkDemoTests' do
end

当我们下载了一个含有podspec文件的代码后,如果想使用它,可以直接通过pod的path指定路径 (以前还可以使用 :local,不过现在已经被:path取代了)..cocopods文件夹下的 注意:此处:path后面的路径是指podspec文件所在目录的路径

执行 pod install

也是可以的

不过这种方式添加的,cocoapods会放在 Development Pods文件夹下

下面这种方式也是可以的 ,并不需要将podspec加入到私有仓库

1
2
3
4
5
6
7
8
target 'TestPodFrameworkDemo' do
#pod 'YohunlUtilsPod' , :path => '/Users/yohunl/YohunlUtilsPod' 
pod 'YohunlUtilsPod',:git => 'https://github.com/yohunl/YohunlUtilsPod.git'
end
target 'TestPodFrameworkDemoTests' do
end

还有以下的方式

1
2
3
4
5
#pod 'YohunlUtilsPod' , :path => '/Users/yohunl/YohunlUtilsPod'  #可以
#pod 'YohunlUtilsPod',:git => 'https://github.com/yohunl/YohunlUtilsPod.git'  #可以
#pod 'YohunlUtilsPod',:podspec => '/Users/yohunl/YohunlUtilsPod/YohunlUtilsPod.podspec'  #指定podspec文件,可以
#pod 'YohunlUtilsPod',:podspec => 'https://github.com/yohunl/YohunlUtilsPod/blob/master/YohunlUtilsPod.podspec'  #经过测试,这种方式不行
#pod 'YohunlUtilsPod',:podspec => 'https://github.com/yohunl/YohunlUtilsPod.git/YohunlUtilsPod/YohunlUtilsPod.podspec' #测试不行,提示找不到podspec文件

如果你能够确定你的podspec文件是正确可用的话,完全可以直接向https://github.com/yohunl/yohunlSpecs添加podspec文件(当然要符合格式要求哦)

5.打包framework的第三方插件命令

cocoapods的插件cocoapods-packager来完成类库的打包,安装命令sudo gem install cocoapods-packager  它的好处是,需要特别强调的是,该插件通过对引用的三方库进行重命名很好的解决了类库命名冲突的问题

参考文档

此三篇文章中有些已经不适用于新版的xcode和cocoapods了

Cocoapods 应用第二部分-私有库相关的更多相关文章

  1. Mac终端的Cocoapods创建自己的私有库和公有库

    一,前言 为什么要用Cocopods 通常在开发的过程中,大多时候,我们会处理一类相同的操作,比如对于字符串String的邮箱验证,是否为空,手机号验证,或者一些UIView的动画操作,我们为了避免写 ...

  2. 利用Cocoapods、SVN 创建私有库实现方案(yoowei)

    由于项目年后要进行组件化,考虑到如果公司内部实现一些私有的组件,不对外公开,而又想在不同项目中使用,该怎么办呢? 使用Cocoapods制作私有库就完美的解决了这个问题.下图就是使用私有库带给我们的好 ...

  3. 使用CocoaPods创建自己的私有库-iOS组件化第一步

    目前iOS组件化常用的解决方案是Pod+路由+持续集成,通常架构设计完成后第一步就是将原来工程里的模块按照架构图分解为一个个独立的pod工程(组件),今天我们就来看看如何创建一个Pod私有库. 新建: ...

  4. grails 私有库相关设置

    针对grails的私有库的设置,设置USER_HOME/settings.groovy如下: grails.dependency.cache.dir = "c:/m2_repositorie ...

  5. python、第二篇:库相关操作

    一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...

  6. 工具第二天 cocoaPods 私有库的创建

    之前介绍了cocoaPods的安装与使用,今天简单谈一下 自己的私有库运用cocoaPods依赖. cd到需要做库的工程目录下 创建一个podspec文件 创建:pod spec create 名称 ...

  7. 利用cocoapods创建基于git的私有库

    上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...

  8. 利用cocoapods创建基于git的私有库Spec Repo

    上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...

  9. 通过构建Cocoapods私有库进行组件化开发探索

    专题一 一.创建私有索引库 选Github或者码云都可以,本例以Github为例.创建私有索引库用来作为自己组件库的索引: 二.本地添加私有索引库 添加:pod repo add 索引库名称 索引库地 ...

随机推荐

  1. PHP加密解密数字

    <?php /** * 加密解密类,PHP加密解密数字,适用于URL加密 * 该算法仅支持加密数字.比较适用于数据库中id字段的加密解密,以及根据数字显示url的加密. * @version a ...

  2. for循环操作数组

    if(!empty($data)){ $arr_length=count($data); //数组的步长 $array_keys_list=array_values($data); //数组的键值 f ...

  3. PHP判断字符串中是否含有中文

    <?php $str = "测试中文"; echo $str; echo "<hr>"; //if (preg_match("/^[ ...

  4. [leetcode-516-Longest Palindromic Subsequence]

    Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...

  5. OpenCV学习1-----打开摄像头并在画面上添加水印

    一直对视频或者图像添加水印很感兴趣,查找资料后用OpenCV尝试了一下. 记录下来. 1.首先是打开摄像头. 找到OpenCV官方文档给出的例子. 例子中实现的是,打开摄像头,并对画面进行高斯滤波,使 ...

  6. 2.如何修改apache的默认端口

    打开apache的conf文件夹,找到server.xml,修改里面这段的port即可,重启apache,修改成功

  7. winform控件闪烁问题终极办法

    protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle ...

  8. LINQ TO SQL和Entity Framework 的关系 你了解多少?

    1. LINQ  TO SQL  和EF 特点:  LINQ TO SQL和Entity Framework都是一种包含LINQ功能的ORM 也就是所谓的关系对象的映射.其中包括的有DBFrist   ...

  9. ZooKeeper介绍,安装,配置文件解析

    什么是ZooKeeper? ZooKeeper是用于维护配置信息,命名,提供分布式同步和提供组服务的集中式服务. 所有这些类型的服务都以分布式应用程序以某种形式或另一种形式使用.每次实施时,都有很多工 ...

  10. Docker 的两类存储资源 - 每天5分钟玩转 Docker 容器技术(38)

    我们从本章开始讨论 Docker 存储. Docker 为容器提供了两种存放数据的资源: 由 storage driver 管理的镜像层和容器层. Data Volume. 我们会详细讨论它们的原理和 ...