zoukankan      html  css  js  c++  java
  • Cocoapods 应用第二部分-私有库相关

    我们在这里,使用的是 第一部分使用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)

    blob.png

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

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

    其结构如下:

    blob.png

    其组成方式是  

    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文件一样

    blob.png

    建立一个本地的私有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目录下

    blob.png

    看到没,这里出现了一个我们自己的私有仓库  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文件

    blob.png

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

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

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

    blob.png

    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

    blob.png

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

    blob.png

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

    blob.png

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

    blob.png

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

    blob.png

    执行pod search YohunlUtilsPod

    blob.png

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

    三:测试其是否可用

    建立一个普通的工程命名为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

    这个时候,得到提示

    blob.png

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

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

    blob.png

    解决方式

    在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,成功

    blob.png

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

    在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后

    blob.png

    进入.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名称]

    blob.png

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

    pod repo remove yohunl

    pod repo remove yohunlSpecs

    删除后,可以看到

    blob.png

    你再执行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

    也是可以的

    blob.png

    不过这种方式添加的,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了

  • 相关阅读:
    数据结构与算法_20 _ 散列表(下):为什么散列表和链表经常会一起使用?
    数据结构与算法_19 _ 散列表(中):如何打造一个工业级水平的散列表?
    数据结构与算法_17 _ 跳表:为什么Redis一定要用跳表来实现有序集合?
    数据结构与算法_18 _ 散列表(上):Word文档中的单词拼写检查功能是如何实现的?
    数据结构与算法_16 _ 二分查找(下):如何快速定位IP对应的省份地址
    数据结构与算法_15 _ 二分查找(上):如何用最省内存的方式实现快速查找功能
    线程池ThreadPoolExecutor源码详解
    用信鸽来解释 HTTPS
    并发集合类之图解CopyOnWriteArrayList
    认识RabbitMQ从这篇文章开始
  • 原文地址:https://www.cnblogs.com/wntd/p/5895301.html
Copyright © 2011-2022 走看看