如何发布自己的开源框架到CocoaPods

作者: 45f4597bece5 | 来源:发表于2016-02-26 16:52 被阅读5231次

    在开发过程中,经常会使用到第三框架,我们通过一个pod install命令,很方便的就将第三方框架加到我们自己的项目中。
    如果我们也想将自己写的组件或库开源出去,让别人也可以通过pod install命令安装自己的框架该怎么做呢?下面,我就教大家一步一步的将自己的pods发布到CocoaPods 中。如果你现在对CocoaPods还不太了解,推荐你看一看这篇文章:用CocoaPods做iOS程序的依赖管理

    创建自己项目的Podspec描述文件

    下面我会通过一个名为HUPhotoBrowser的项目来讲解一下整个过程。
    项目发布到github后,需要打上tag。之后我们在工程根目录中初始化一个Podspec文件:

    pod spec create HUPhotoBrowser
    

    该命令将在本目录产生一个名为HUPhotoBrowser.podspec文件。用编辑器打开该文件,里面已经有非常丰富的说明文档。下面介绍如何声明第三方库的代码目录和资源目录,还有该第三方库所依赖ios核心框架和第三方库。这是我的podspec文件:

    Pod::Spec.new do |s|
      s.name         = "HUPhotoBrowser"
      s.version      = "0.0.2"
      s.summary      = "photo browser for ios."
      s.homepage     = "https://github.com/hujewelz/HUPhotoBrowser"
      s.license      = "MIT"
      s.author             = { "Jewelz Hu" => "hujewelz@163.com" }
      s.platform     = :ios, "7.0"
      s.source       = { :git => "https://github.com/hujewelz/HUPhotoBrowser.git", :tag => "0.0.2" }
      s.source_files  = "HUPhotoBrowser", "HUPhotoBrowser/**/*.{h,m}"
       s.framework  = "UIKit"
      # s.frameworks = "SomeFramework", "AnotherFramework"
    

    s.name是我们库的名称,s.version是库原代码版本号,s.summary是对我们库的一个简单的介绍,s.homepage声明库的主页,s.license是所采用的授权版本,s.author是库的作者。s.platform是我们库所支持的软件平台,这在我们最后提交进行编译 时有用。s.source声明原代码的地址。我这里是托管在github上,所以这里将地址copy过来就行了。

    屏幕快照 2016-02-26 下午3.02.58.png
    对于很多第三方库而言,在发布的时候都会打上一个tag,如版本0.0.1就会打上一个名为0.0.1tag,你也可以选择一个最新的commit来作为该库0.0.1版的代码, 那么最终source就是这样了:
    {:git => "https://github.com/hujewelz/HUPhotoBrowser.git", :commit => '65584b0e0b08e01f83e66d487180c164b5182409'}
    

    我这里还是使用的tag,所以我这里就是这样的:

     { :git => "https://github.com/hujewelz/HUPhotoBrowser.git", :tag => "0.0.2" }
    

    以后我们的库有新版本时,我们可以修改相应的versionsource
    s.source_files声明了我们库的源代码的位置,所以这个地方不能填错了。
    先看一下我的目录结构:

    屏幕快照 2016-02-26 下午3.15.07.png
    所以工程根目录下的HUPhotoBrowse文件夹才是库的原代码目录。
    s.source_files  = "HUPhotoBrowser", "HUPhotoBrowser/**/*.{h,m}"
    

    目录的层级关系一定要跟代码库的保持一致。这里前一部分可以不用的,因为我这里后一部分的HUPhotoBrowser/**与前面是一致的,这个指定的目录下的文件都会进行编译。如果该目录下还有一些资源文件(如图片等),这些文件并不需要进行编译。可以使用s.resourcs声明。*.{h,m}是一个类似正则表达式的字符串,表示匹配所有以.h.m为扩展名的文件。
    s.framework声明了所依赖的核心库,我这里只用到了UIKit,所以是这样的:

    s.framework  = "UIKit"
    

    如果你的项目中依赖多个库,可以使用

    s.frameworks = "SomeFramework", "AnotherFramework"
    

    当然,我们开发的库中也可能还依赖第三方库,例如JSONKit,那么,就可以做如下声明:

     s.dependency "JSONKit", "~> 1.4"
    

    如果有多个需要填写多个s.dependency
    编辑完podspec文件后,需要验证一下这个文件是否可用,如果有任何WARNING或者ERROR都是不可以的,它就不能被添加到Spec Repo中,不过xcode的WARNING是可以存在的,验证需要执行命令:

    pod spec lint PodName.podspec
    

    当看到HUPhotoBrowser passed validation.时,说明验证通过了。在检测你的podspec时候,如果直接用pod spec lint xxx.podspec的话,出现错误它只会直接一句红色的话The spec did not pass validation, due to 1 error.告诉你的有多少个error和warning,而不会具体的指出你的错误出在哪里,这时候你可以在这句指令后面加上参数--verbose 这样就会告诉你具体的错误信息。这样根据它提示你的错误信息去解决就可以了。

    编辑好podspec文件后就可以将该podspec文件保存到本机的~/.cocoapods/repos/master/Specs目录中仅供自己使用,也可以将其提交到CocoaPods/Specs代码库中。下面我们先将其保存到本机中:

    屏幕快照 2016-02-26 下午3.44.31.png

    下面可以看一下是否可以通过搜索找到该库:

    屏幕快照 2016-02-26 下午3.48.06.png
    同样在需要依赖于HUPhotoBrowser这个库的项目,可以将下列添加到项目的Podfile文件中
    pod 'HUPhotoBrowser', '~0.0.2'
    

    保存文件,并用pod install安装HUPhotoBrowser库。

    通过以上步骤创建Pod库还只能供自己使用,下面会继续讲解如何将其提交到CocoaPods/Specs代码库中,让其他人也可以通过pod install安装我们的开源库。

    CocoaPods Trunk发布自己的Pods

    在cocoapods使用了trunk之后,CocoaPods 需要0.33以上版本,用 pod --version查看版本,如果版本低,需要更新。

    注册Trunk

    $ pod trunk register orta@cocoapods.org 'Orta Therox' --description='macbook air'
    

    大家在注册时需要替换成自己的邮箱和用户名,一切顺利的话就会受到一份邮件,点击邮件中的链接后验证一下:

    pod trunk me
    
    屏幕快照 2016-02-26 下午4.05.42.png

    当然,如果你的pod是由多人维护的,你也可以添加其他维护者:

    $ pod trunk add-owner ARAnalytics kyle@cocoapods.org
    

    上面的工作完成之后,我们就可以开始 trunk push了。

    Trunk push

    pod trunk push 命令会首先验证你本地的podspec文件(是否有错误),之后会上传spec文件到trunk,最后会将你上传的podspec文件转换为需要的json文件。在工程根目录(包含有.podspec)下执行命令:

    pod trunk push
    

    如果在trunk push过程中报错了,仔细查看一下错误信息。我当初就是使用了podspec文件中描述的版本所没有的API,之后修改podspec文件中s.platform = :ios, "7.0"就可以了。

    屏幕快照 2016-02-26 下午4.12.59.png
    如果你能看的上面的结果说明上传成功了。我们也可以在本地的~/.cocoapods/repos/master/Specs目录下看到转换之后的json文件, 屏幕快照 2016-02-26 下午4.16.56.png
    至此我们整个制作自己的开源库的过程就完成了,以后有新版本只需要修改工程根目录下的podspec文件就行了,然后重新执行pod trunk push命令。

    最后

    最后对这个过程做个总结:

    1. 开源库发布之后,需要打上tag
    2. 进入到项目根目录下,创建podspec文件
    pod spec create PodName
    
    1. 编辑podspec文件中的相关信息,有两个比较重要的地方s.sources.source_files,可以验证是否有误:
    pod spec lint PodName.podspec
    
    1. 注册pod trunk
    $ pod trunk register orta@cocoapods.org 'Orta Therox' --description='macbook air'
    
    1. 发布到pod trunk
    pod trunk push [NAME.podspec]
    

    该命令在包含有.podspec文件的目录下执行

    1. 更新pod库
    pod setup
    

    如果pod trunk push成功后无法pod search到自己的库,可执行该命令。

    最后的最后

    哈哈。好吧,我承认其实我是来打广告的。例子中的HUPhotoBrowser是我开源的一个图片浏览器的库,使用起来非常简单,一行代码就以实现图片浏览功能,支持本地和网络图片。希望大家可以支持一下,欢迎大家star。如果有什么问题的话可以直接issue我。最后,希望能跟大家共同进步。项目地址:HUPhotoBrowser

    相关文章

      网友评论

      • AgoniNemo:pod下来后,为什么import会提示找不到这个库?
      • mysteryemm:需要将xxx.spec文件 push 到官方的Specs仓库中吧, 不然search 不到
        45f4597bece5:@心董儿 是的
      • 老骚鹅:好
        奥卡姆剃须刀:@努力的iOSDeveloper 这个是在执行pod spec lint LLKit.podspec 这个操作后出现的

        奥卡姆剃须刀: -> LLKit (0.0.1)
        - ERROR | [OSX] unknown: Encountered an unknown error ([!] /usr/bin/git clone https://github.com/liuniuliuniu/LLKit.git /var/folders/pq/_w6970v92799zsg7yh21mncr0000gn/T/d20170428-21961-m6642l --template= --single-branch --depth 1 --branch 0.0.1

        Cloning into '/var/folders/pq/_w6970v92799zsg7yh21mncr0000gn/T/d20170428-21961-m6642l'...
        warning: Could not find remote branch 0.0.1 to clone.
        fatal: Remote branch 0.0.1 not found in upstream origin
        ) during validation.

        Analyzed 1 podspec.

        [!] The spec did not pass validation, due to 1 error.
        [!] The validator for Swift projects uses Swift 3.0 by default, if you are using a different version of swift you can use a `.swift-version` file to set the version for your Pod. For example to use Swift 2.3, run:
        `echo "2.3" > .swift-version`.
        localhost:LLKit dayingxiangkeji$

        请问 这个问题怎么解决呢 搞了一晚上都没搞出来
        45f4597bece5:@ttc天 :grin:
      • SDBridge:“编辑好podspec文件后就可以将该podspec文件保存到本机的~/.cocoapods/repos/master/Specs目录中仅供自己使用,也可以将其提交到CocoaPods/Specs代码库中。下面我们先将其保存到本机中:”
        你好,我按照您的流程,保存到本地,pod search 找不到???
        AgoniNemo:@会飞的代码 我也遇到了这个问题,你解决了吗?
        会飞的代码:@Coder_Hou 问一下我提交到cocoapods的代码,检验没问题,也提示提交成功了了,但是搜索不到结果,为什么,不是说cocoa审核非常快吗一两天了没结果
        45f4597bece5:@Coder_Hou 过一段时间就好了
      • GodLoveNan:您好, 我问一下HUPhotoBrowser 加载网络图片的时候,网络不好情况下 点击图片显示黑屏 然后再显示加载的图片 这个怎么处理?
        45f4597bece5:@GodLoveNan 给个placeholder
      • 孤独感爆棚:ERROR | [iOS] unknown: Encountered an unknown error (undefined method `gsub' for true:TrueClass 报这个错是什么意思啊,在pod lib lint --verbose --no-clean的时候
        45f4597bece5:是代码的问题,看看报错具体在哪行
      • afishhhhh:继续楼上,我是按照你的方法执行完命令后,项目里文件发生了变化,然后我push出现了上面的情况
        45f4597bece5:@afishhhhh 不要使用git push到cocoapods,用trunk push
      • afishhhhh:博主我用SourceTree来push我的项目出现下面的问题是怎么回事:
        Pushing to https://github.com/CocoaPods/Specs.git
        remote: Permission to CocoaPods/Specs.git denied to username.
        fatal: unable to access 'https://github.com/CocoaPods/Specs.git/': The requested URL returned error: 403
      • nevsee:关于trunk注册的问题
        比如 我在A电脑上注册了trunk 在B电脑上还需要在注册吗?
        45f4597bece5:@什么什么哒 不用重新注册的
        nevsee:B电脑上 pod trunk me 不能知道我的注册信息吧?

        换了电脑是不是需要重新注册啊
      • 我把今生当成了来世:博主你好,我这边自己发布swift开发的库,pod install 是成功的,但是找不到文件。import 能有,但是就是说没定义,请问博主有遇到么
        我把今生当成了来世:@AgoniNemo 把需要给使用者使用的给open了哦。
        AgoniNemo:我也遇到了这个问题,请问你解决了吗?
        45f4597bece5:podfile 需要use framework
      • 7a946bf5d2ca:还有个坑
        $ pod trunk register orta@cocoapods.org 'Orta Therox' --description='macbook air'
        这句不好使

        换下面的
        pod trunk Dabo_iOS@163.com 'lianxingbo' --verbose
        用户名我用的github用户名
        --verbose参数是为了便于输出注册过程中的调试信息
        AgoniNemo:问个问题,在上传成功后,pod install下来后,import导入不了,这是什么问题?
      • 7a946bf5d2ca:给项目打上tag
        git tag -a 0.0.1 -m "Tag release 0.0.1"
        git push -—tags
      • 海浪萌物: -> text-pod.podspec
        - ERROR | spec: The specification defined in `text-pod.podspec` could not be loaded.


        [!] Invalid `text-pod.podspec` file: syntax error, unexpected end-of-input, expecting keyword_end.

        # from text-pod.podspec:11
        # -------------------------------------------
        # s.source_files = "Masonry/**/*.{h,m}"
        > s.framework = "UIKit"
        # -------------------------------------------


        Analyzed 1 podspec.

        [!] The spec did not pass validation, due to 1 error.

        一直提示有一个错误是怎么回事啊
        45f4597bece5:@海浪萌物 第11行有错误
      • Jason_Wong:大概步骤都说到了,但是步骤描述的不够清晰,可以改进下。
      • Fluent:我验证成功后,在push时一直是Updating spec repo `master`状态,就可在这儿了,是怎么回事???
        45f4597bece5:@FlyChang 等了多久,耐心等等吧,按着步骤来会成功的😁
      • 75afc06dcc73:为什么我上传之后只有我自己的电脑可以搜索到呢,其它的电脑都搜索不到,pod setup也没用
        东方_未明:@随_ 我也是这种情况, 等了多长时间别的电脑才可以search到的?, 如果审核通过的话会给你的邮箱发邮件么?
        75afc06dcc73:@huluobobo 好了。现在 应该是审核问题吧
        45f4597bece5:@随_ 同事的电脑setup下
      • Lision:正在找相关资料!回去试一下
      • LeonLei:我在本地能search到我的库,我同事的电脑search不到,我完全按照你的步骤操作的,知道怎么回事吗?PS:我已经执行pod setup了
        45f4597bece5:@大博哥 如果是按我的一步一步来,是没问题的。你可以先等一会儿,需要一点时间,就可以搜到了
        7a946bf5d2ca:@huluobobo 同样同事电脑,也执行了pod setup ,也是搜不到
        45f4597bece5:@perezlei 让你同事执行一下pod setup
      • Laughingg:框架 demo 不显示啊
        Laughingg:@huluobobo 我看你框架代码的时候,你那个photobrowser 的 layou 的itemsize没有指定,你是怎么让它全屏显示的
        Laughingg:@huluobobo j加载网络图片失败
        45f4597bece5:是仓库中没找到demo吗
      • Laughingg:你要,我的仓库依赖第三方库的时候报错,说是第三方库的变量找不到。
        Laughingg:@huluobobo 我的问题搞定了
        45f4597bece5:能看一下具体报错信息吗
      • MrFire_:谢谢分享!
        45f4597bece5:@hungryBoy 😄

      本文标题:如何发布自己的开源框架到CocoaPods

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