我们在这里,使用的是 第一部分使用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/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
2
|
还有
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的方式
当我们添加
1
2
|
并且执行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
发现 系统会自己根据
1
2
|
去下载对应的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
|
#source 'https://github.com/CocoaPods/Specs.git' target 'TestPodFrameworkDemo' do #pod 'YohunlUtilsPod' , :path => '/Users/yohunl/YohunlUtilsPod' 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 它的好处是,需要特别强调的是,该插件通过对引用的三方库进行重命名很好的解决了类库命名冲突的问题
参考文档
-
http://www.cnblogs.com/brycezhang/p/4117180.html 使用CocoaPods开发并打包静态库
-
http://www.iwangke.me/2013/04/18/advanced-cocoapods/#jtss-tsina
-
http://eric-gao.iteye.com/blog/2128283 提交framework到cocoapods官方去
-
http://blog.sigmapoint.pl/automatic-build-of-static-library-for-ios-for-many-architectures/
此三篇文章中有些已经不适用于新版的xcode和cocoapods了