美文网首页iOS技术专题SetSwift初体验
如何创建私有 CocoaPods 仓库

如何创建私有 CocoaPods 仓库

作者: MarkLin | 来源:发表于2015-12-30 16:44 被阅读9990次

    公共 CocoaPods

    打开隐藏目录,可以使用命令:

    //打开隐藏的命令:
    defaults write com.apple.finder AppleShowAllFiles -bool true
    //关闭隐藏的命令:
    defaults write com.apple.finder AppleShowAllFiles -bool false
    
    

    接着需要重启一下 Finder, 可以按住 option + 右键 Finder 图标选择重启。然后打开隐藏目录 .cocoapods (这个目录在你的个人目录底下, ~/.cocoapods/Users/[username]/.cocoapods)

    p1

    可以看到上图, .cocoapods 目录下的 repos 其实是 repository (仓库)的缩写。 repos 中存放的时仓库的集合。这里的 master 就是 CocoaPods 官方建立的仓库,也就是我们所谓的公共库。

    specs 目录下存放的就是所有提交到 CocoaPods 的开源库的 podspec 文件的集合。
    其结构如下图所示:

    p2

    其组成方式:

    specName -- version -- specName.podspec

    ( master 里现在是 specName.podspec.json,这个 .json 文件就是 podspec 文件加了个后缀。我们可以采用 pod ipc spec 这个命令来将 spec 文件转换成 .json)

    那这个文件夹是如何来得呢?其实,这个文件夹是在你安装了 CocoaPods 后,第一次执行 pod install 时, CocoaPods 通过命令 pod setup 来建立的(这条命令会自动执行)。

    上述是官方的 repo ,私有库的话可以看下我们前面的翻译或者查看官方文档,但是官方文档有一些过程写的不是特别详细,自己实现的时候遇到了一些坑,特此梳理一下过程,按照官方文档内容实现一个私有的 spec repo 。根据官方的原理,我们只需要创建一个和 master 相类似结构的目录就可以实现私有的 spec repo,当然你可以 fork 一个官方的 repo,但是它包含了太多没有必要地库在里面,这在编译仓库的时候需要浪费大量的时间,所以我们只要自己重新创建一个就可以了。

    1.创建一个私有的 Spec Repo

    在你的 git 服务器上创建一个 repo。这里你可以在 github 或者你自己的 git 服务器上实现。公司内部使用的话这里推荐大家使用私有的仓库,但是 github 的私有仓库是要收费的 $7/month (壕请无视 - -!)。大部分公司都是有自己的git服务器,不过一般只能在公司内网使用,或者可以选择Gitlab,Coding, Bitbucket任意一种。我们以在 github 上创建为例:

    p3

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

    然后我们就可以执行:

    pod repo add REPO_NAME SOURCE_URL
    

    其中的 REPO_NAME 是我们要添加的私有 repo 的名称(这里我们待会填的是: O2Specs),后面是仓库的 git 地址。这里做的其实是创建的工作,也就是在 ~/.cocoapods/repo 目录下添加了一个以你的私有 repo 为名的文件夹,但是并没有添加 spec 文件。

    在终端执行命令:

    pod repo add O2Specs https://github.com/marklin2012/O2Specs.git
    

    这里用的是 https 地址,当然你也可以用 git 地址,不过这样有可能失败。如果失败,很大因素是你 githubssh 在本地没有配置好,配置方法可以看这里:Generating SSH keys,成功后可以看得到 .cocoapods 目录如下图所示:

    p4

    至此,我们已经在本地得到我们自己的私有仓库 O2Specs ,这是一个空的仓库。

    2.添加私有的 Repo 安装到你的 CocoaPods

    这个步骤需要我们事先完成 CocoaPods 依赖库的搭建,具体可以查看我们另外一篇教程:制作 CocoaPods 依赖库。如果这里你想先看看效果,也可以直接从 github 上 clone 示例工程继续下面的操作。

    让我们进入到上面 clone 的示例工程目录中(或者你自己搭建的依赖库目录中):

    p5

    打开工程的 podspec 文件:

    Pod::Spec.new do |s|
      s.name         = "O2View"             #名称
      s.version      = "0.0.1"              #版本号
      s.summary      = "Just testing"       #简短介绍
      s.description  = <<-DESC
                        私有Pods测试
                        * Markdown 格式
                       DESC
    
      s.homepage     = "http://aotu.io/"
      # s.screenshots  = "www.example.com/screenshots_1.gif"
      s.license      = "MIT"                #开源协议
      s.author             = { "linyi31" => "linyi@jd.com" }
    
      s.source       = { :git => "https://github.com/marklin2012/O2View.git" }
      ## 这里不支持ssh的地址,只支持HTTP和HTTPS,最好使用HTTPS
      ## 正常情况下我们会使用稳定的tag版本来访问,如果是在开发测试的时候,不需要发布release版本,直接指向git地址使用
      ## 待测试通过完成后我们再发布指定release版本,使用如下方式
      #s.source       = { :git => "http://EXAMPLE/O2View.git", :tag => s.version }
      
      s.platform     = :ios, "9.0"          #支持的平台及版本,这里我们呢用swift,直接上9.0
      s.requires_arc = true                 #是否使用ARC
    
      s.source_files  = "O2View/*.swift"    #OC可以使用类似这样"Classes/**/*.{h,m}"
    
      s.frameworks = 'UIKit', 'QuartzCore', 'Foundation'    #所需的framework,多个用逗号隔开
      s.module_name = 'O2View'              #模块名称
    
      # s.dependency "JSONKit", "~> 1.4"    #依赖关系,该项目所依赖的其他库,如果有多个可以写多个 s.dependency
    
    end
    

    这个文件本质上是一个 ruby 文件,这是我们事先已经实现好的依赖库的 podspec 文件,如果前面步骤都正常的话,也就是说我们认为这个 podspec 是合法的话,就可以直接将这些内容 push 到我们本地的 repo 中。为了避免错误,我们可以再验证一下,命令行输入:

    pod lib lint
    

    运行之后可能会得到下面的警告:

     -> O2View (0.0.1)
        - WARN  | source: Git sources should specify a tag.
    
    [!] O2View did not pass validation, due to 1 warning (but you can use `--allow-warnings` to ignore it) and All results apply only to public specs, but you can use `--private` to ignore them if linting the specification for a private pod..
    You can use the `--no-clean` option to inspect any issue.
    

    由于我们的示例工程还没有生成正式的 release 版本, github 上并没有任何 tag,所以我们刚才填写 .podspec 文件填写 git 地址的时候没有填写指定 tag (上面文件的注释中有提到),解决方法我们可以先执行忽略警告的命令:

    pod lib lint --allow-warnings
    

    如果成功会出现如下输出:

     -> O2View (0.0.1)
        - WARN  | source: Git sources should specify a tag.
    
    O2View passed validation.
    

    到此,我们的 O2View.podspec 就符合规范了。

    3.添加你的 Podspec 到你的 repo

    在前面验证通过的基础上,我们接着执行命令:

    pod repo push O2Specs O2View.podspec
    

    执行完,如果失败会有相对应的警告和错误提示,只要按照警告和错误的详细信息进行修改和完善即可。成功的情况应该可以在终端看到类似的输出:

    Validating spec
     -> O2View (0.0.1)
        - WARN  | source: Git sources should specify a tag.
    
    Updating the `O2Specs' repo
    
    Already up-to-date.
    
    Adding the spec to the `O2Specs' repo
    
     - [Add] O2View (0.0.1)
    
    Pushing the `O2Specs' repo
    
    To https://github.com/marklin2012/O2Specs.git
       9f32092..8d0ced5  master -> master
    

    再进入到 .cocoapods 的目录中,可以看到已经发生了变化:

    p6

    同时,我们还发现 O2Specsgithub 仓库也已经发生了变化:

    p7

    按照平时使用 CocoaPods 的习惯,我们添加依赖库之前会先搜索一下库,让我们执行一下命令:

    pod search O2View
    

    哈哈,可以看到已经建立成功了!

    -> O2View (0.0.1)
       Just testing
       pod 'O2View', '~> 0.0.1'
       - Homepage: http://aotu.io/
       - Source:   https://github.com/marklin2012/O2View.git
       - Versions: 0.0.1 [O2Specs repo]
    

    4.测试私有 pod

    看到前面的搜索结果,小伙伴们是不是开始有点激动了?让我们建立一个普通的工程,命名为 TestPodDemo,然后在终端 cd 到其目录路径下,添加一个 Podfile 文件:

    pod init
    

    建立后修改 Podfile 文件内容如下:

    use_frameworks!
    
    target 'TestPodDemo' do
    
    pod ‘O2View’
    
    end
    

    执行:

    pod install
    

    我们得到如下提示:

    Updating local specs repositories
    Analyzing dependencies
    [!] Unable to find a specification for `O2View`
    
    [!] Your Podfile has had smart quotes sanitised. To avoid issues in the future, you should not use TextEdit for editing it. If you are not using TextEdit, you should turn off smart quotes in your editor of choice.
    

    找不到 O2View ? 额- -!。。。刚才 search 明明可以找到这个依赖库的,为什么现在找不到了呢?

    别着急!其实原因是你在 Podfile 中没有指定路径,当你执行 pod install 的时候,CocoaPods 默认只会在 master 下搜索,而我们的 spec 是存在我们私有的 O2Specs 目录下的。所以解决方式很简单,就是引入搜索地址即可,在 Podfile 的顶部添加如下两行代码:

    source 'https://github.com/CocoaPods/Specs.git'     #官方仓库地址
    source ‘https://github.com/marklin2012/O2Specs.git’     #私有仓库地址
    

    这里必须添加两个地址,默认情况下,你如果不添加 source ,系统会默认使用官方仓库地址,但是当你添加了 source 之后,系统就不会自动搜索官方地址,所以这两句都必须添加,否则其他基于官方的依赖库都不能使用了。

    再次执行 pod install ,我们就可以看到很顺利的安装成功了:

    Updating local specs repositories
    Analyzing dependencies
    Downloading dependencies
    Using O2View (0.0.1)
    Generating Pods project
    Integrating client project
    Sending stats
    Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
    

    恭喜!这样一来我们就可以使用这个私有库了!

    发布稳定的依赖库版本

    前面我们提到过,我们的这个实例依赖库 O2View 没有生成稳定的 release 版本。当我们调试完内容之后,一般都是要发布稳定版本的,更新之后再继续发布新版本。我们可以使用命令行或者在 github 页面手动生成,这里为了方便我们使用命令行,首先在终端中 cd 到之前的依赖库 O2View 的目录中,然后输入如下命令:

    git tag '0.0.1'
    git push --tags
    git push origin master
    

    这样我们就得到了一个稳定的 release 版本 0.0.1

    p8

    这里我用的版本号是 0.0.1 基于研发版本,关于版本号的一些规范可以参考:语义化版本 2.0.0

    对于我们的 podspec 文件,我们也需要将 s.source 做一下小小的改动:

    s.source       = { :git => "https://github.com/marklin2012/O2View.git", :tag => version }
    
    

    这样我们使用这个依赖库的时候就能对应上版本号,并且知道在 github 中使用稳定的 release 版本代码。太棒了!

    最后只需要再重复 push 一下我们的 Podfile 就可以!

    接下来做什么?

    好了,到这里我们已经完全掌握如何创建一个本地私有的 CocoaPods 了!我们完全可以把我们项目中得代码拆出来好好的封装一些 pods, 好好使用这个黑魔法!

    祝大家玩得愉快!

    相关文章

      网友评论

      • LV大树:pod repo push GHSpecs test.podspec

        Validating spec
        -> test (0.1.2)

        [!] The repo `GHSpecs` at `../../../../.cocoapods/repos/GHSpecs` is not clean
        kongyoufudeMacBook-Pro:test kongyoufu$
        MarkLin:@FiredPeter 解决步骤:
        1.cd到repo目录
        2.git status
        3.git clean -f
        之后push就成功了,希望对你有帮助
        LV大树:为何会报这个错呢
      • LV大树:搞了好几天,都快蒙比了。
      • d25ee0e45b44:赞。有一个疑问想请教一下楼主,官方repo的spec路径是~/.cocoapods/repos/master/Specs/ 而自建的私有repo的路径是~/.cocoapods/repos/私有repo/ 少了一层Specs文件夹, 有什么办法加上这层目录吗
      • 着魔的毛豆:如何提高pod repo push的速度,每次提交都特别的慢,特别当私有库大了之后。
      • 叁號選手:这是一片非常好的文章。多谢大神博主。在这里 pod repo push O2Specs O2View.podspec 之前。是不是应该要 push 一下自己的tags。我少了一个这个步骤 这里老走不下去!
        如果有人也在这里卡住了 。可以试试加上tage
      • ericguo:@MarkLin 咨询个问题,pod push的时候返回如下错误:
        pod repo push IRSpecs IRMonitor.podspec

        Validating spec
        Cloning spec repo `-1` from ``
        [!] Unable to add a source with url `` named `-1`.
        You can try adding it manually in `~/.cocoapods/repos` or via `pod repo add`.

        repo是已经加了的:
        IRSpecs
        - Type: git (master)
        - URL: https://github.com/iOSRunner/IRSpecs.git
        - Path: /Users/Wanlei/.cocoapods/repos/IRSpecs
        ericguo:@好乐悦我 好的,加上--source 参数就好了。像这样:pod repo push IRSpecs IRMonitor.podspec --source='https://github.com/iOSRunner/IRSpecs.git'。
        好乐悦我:你好, 请问你是怎么解决的, 我也遇到了同样的提示, 一直卡在这里过不去, 还望告知下.
        MarkLin:@ericguo 可能是你装了多个Xcode导致的
      • e9c2100644b5:楼主为什么 按步骤完成了之后 pod search 不到啊?
        Rathen:我也是 现在还是找不到
      • 小黄人写代码:涨姿势,感谢
      • 0200a9609930:楼主好,我按照你的方法搭建了,最后在我的项目里,只有
        public var YYPageViewVersionNumber: Double
        这一个方法可以使用,其他的类都使用不了,请问下有什么解决办法?
      • Hwangkop:楼主您好,想请教一个问题,我在更新的时候出现错误:[!] The repo `MyRepo` at `../.cocoapods/repos/MyRepo` is not clean
        然后使用:$ pod repo update MyRepo
        然后再:pod repo push MyRepo xxx.podspec 的时候还是出现以上错误
        然后我进入 ~/.cocoapods/repos 删除这个MyRepo仓库 再pod repo add REPO_NAME SOURCE_URL ,之后在push 会发现有两个版本,接着我在修改再push还是出现了以上的错误,可否帮忙分析分析
        Hwangkop: @csqingyang 哈哈,应该是缓存问题,后面试了几次又可以了
        csqingyang:缓存的问题可能, 看 11 楼的答案能不能帮你解决
      • 小四:push到pods是成功的,为啥search不到,pod install也是没用;
        [!] Unable to find a specification for `MYPodsDemo`
        0200a9609930:去Library/Caches/CocoaPods 里 把search_index.json删除掉 然后再search一下试试
      • BigLuckyHaha:请问文件目录怎么设定,私有库制作时,文件目录是对的,制作完成后pod到项目里,就是最深层级的文件,目录结构缺失
        csqingyang:可以看看 SDWebImage, AFNetworking 等库的 podSpec 怎么写的
      • redye:在 push 私有库的时候有没有遇到过 [!] The repo `MySpecs` at `../../../.cocoapods/repos/MySpecs` is not clean 这种错误呢
        redye:@Remantou 成功了,跪谢
        Remantou:我的解决步骤是:
        1.cd到repo目录
        2.git status
        3.git clean -f
        之后push就成功了,希望对你有帮助
      • 偏偏就是祢:我可以用自己的gitlab服务器(内网的)来制作 CocoaPods 依赖库和创建自己私有的 CocoaPods 仓库?
        MarkLin:@一颗浮躁的心想静下来 可以的
      • 司马如是:执行完pod lib lint 命令后
        -> O2View (0.0.1)
        - ERROR | [iOS] unknown: Encountered an unknown error (Simulator iPhone 4s is not available.) during validation.

        你好,一直出现这个错误 该怎么解决呢
        MarkLin:@司马如是 你应该是使用的xcode8吧?问题是我的库没更新导致的,我没有把iPhone4s 编译选项去掉。。可能需要你xcode下个iOS9的模拟器,这样你的模拟器就带有iPhone4s了,或者等我把库更新一下
      • End_枫:你好,请教下,按照教程,成功的搞出了一个私有库,谢谢!
        现在有个问题,在私有库中设置依赖,pod install的时候并没有把依赖库一起下下来,这个是什么原因。
        s.dependency "AFNetworking", "~> 3.1.0"
        End_枫:@这个App不错 下载下来了,用update
      • Mitchell: 您好,pod spec lint spec 时候遇到这样的错误,请问遇到过么?
        - ERROR | [iOS] unknown: Encountered an unknown error (An unexpected version directory `Assets` was encountered for the `/Users/william/.cocoapods/repos/365jiating-pudding_rbbuskit/RBBusKit` Pod in the `RBBusKit` repository.
        MarkLin:@53d138aa024e 应该是你私有仓库还没更新导致的
        53d138aa024e: @MarkLin
        53d138aa024e:@Mitchell 请问这个问题你最后解决了吗?
        前面流程都很顺畅,就是最后弄了个Demo准备测试使用 pod Install命令就出现了
        “[!] An unexpected version directory `Assets` was encountered for the `/Users/apple/.cocoapods/repos/MoudlePod2/MoudlePod2` Pod in the `MoudlePod2` repository.”这个错误

        我这个MoudlePod2的工程是使用Cocoapods自带的模板命令生成的
        “pod lib create MoudlePod2”

        这个工程创建完了后,会自带podsepc文件,example工程,另外有一个Classes目录和一个Assets目录
        我在Classes目录里面随便放了一个.h和.m 用于测试。

        前面流程都ok。 最后在Demo工程里pod install就出现这个错误了。。。

        @MakrLin 你碰到过这个问题么? 要么你使用pod lib create创建私有pod工程试下。
      • 620b2582d4ef:写的简直太详细了,感谢
      • a09d5257a76d:spec和source可以共用同一个仓库吗?
        csqingyang:不可以. 作者文章没有讲到的一点就是: podSpec 是一个仓库索引文件, 他并不实际存储仓库, 他记录的是指向仓库的索引地址. 包括自己定义的在 ~/.cocoapods/repo 下面的也只是索引.
      • 257af5867152:文章写的很好,赞一个,今天按照你的教程尝试了下,很好,准备把库弄到我们公司的git服务器上。
        b96acac40a08:@MarkLin 本地仓库,远端仓库都有 把缓存目录删了 还是这样
        b96acac40a08:@MarkLin 都是按步骤来的 为什么我pod search的时候是[!] Unable to find a pod with name, author, summary, or descriptionmatching
        MarkLin:@一一爱小一 哈哈,希望对你有帮助
      • yehot:请教下,如果 s.dependency 依赖的也是私有的库,该如何实行呢?
        不知道作者有遇到过没有
        MarkLin:@yehot :smile:
        yehot:@MarkLin 恩,基本是这样。已搞定
        MarkLin:@yehot 貌似是这样:
        pods --sources='#你私有pod的git仓库#,https://github.com/CocoaPods/Specs'
      • chatwyn: :smile: 我自己试了试 导入之后

        ```
        import UIKit
        import WBRefresh
        import WBRefresh.Swift


        public var WBRefreshVersionNumber: Double
        ```
        只有这些东西 不能用其中的方法
        请问一下该怎么办
        chatwyn:@MarkLin 好的好的 谢谢了 :relaxed:
        MarkLin:另外,类也要记得 public 一下
        MarkLin:@chatwyn swift里面的方法如果不声明 public 的话,默认是 internal ,它表示在整个框架内部都可以访问,但是框架由外部代码所引用时不可以访问。
        所以只要给你想在外部访问的方法加 public 声明就可以了!

      本文标题:如何创建私有 CocoaPods 仓库

      本文链接:https://www.haomeiwen.com/subject/btmihttx.html