CocoaPods私有库

作者: rapunzelyeah | 来源:发表于2017-12-29 13:57 被阅读201次

    本文主要介绍CocoaPods私有库的创建,做这件事的主要起因是,公司接过来一个外包的项目,项目中用到了他们的私有库,pod中可以看到源码,虽然直接将源码添加到工程中也是可行的,但本着学一点是一点的思想,借此机会尝试一下自己做一个私有库。

    首先需要明确一个概念,私有仓库和私有库,类比CocoaPods的官方仓库,私有仓库就是整个库,其中会包含多个私有库以及同一个私有库的不同版本,在本机~/.cocoapods/repos/路径下,CocoaPods官方仓库位于master文件夹中,~/.cocoapods/repos/master/Specs文件夹下保存的就是各个开源库的podspec文件。在终端执行pod repo list可以查看本地仓库,名字为master的就是官方仓库。

    因此,在私有库创建之前,首先要创建一个私有的仓库:

    创建CocoaPods私有仓库

    创建私有仓库,可以在gitlab,github,coding等网站中直接创建即可,这里不详细描述。这里我用的是coding的git,创建后可以得到仓库的git地址,需要在本地添加仓库。

    # pod repo add REPO_NAME SOURCE_URL
    pod repo add TestRepository https://git.coding.net/rapunzel/TestRepository.git
    

    添加后可以在本地查看是否添加成功。

    pod repo list
    

    成功后可以看到输出:


    本地仓库列表

    或者也可以直接查看~/.cocoapods/repos/文件夹,如果有名字为刚才添加的REPO_NAME的文件夹,那就说明repo add成功。

    本地仓库可以做删除和更新等操作:

    pod repo remove REPO_NAME
    pod repo update
    

    添加私有库代码

    在私有仓库中添加源码,这里暂时先上传一个文件夹,后面会在podspec中引用这个文件夹。


    1609c8c53e691ad0.png

    给私有库打tag,这个tag表示后面podspec文件中的引用版本,因此,每次重新编辑后,要重新打tag,然后再更新podspec文件,生成新版本的pod库。

    git tag '0.0.1' 
    或者 git tag -a 0.0.1 -m 'version 0.0.1'
    git push --tags
    

    创建私有库

    在前面创建仓库,添加代码,打标签等操作都完成后,就可以真正开始创建私有库了,这里主要分为几个步骤:

    1. 创建podspec文件
    2. 编辑podspec文件
    3. 验证podspec文件
    4. 本地调用验证
    5. 将podspec文件推送到远程仓库
    

    创建podspec文件

    首先进入到库目录下:

    cd /Users/masaike/.cocoapods/repos/TestRepository/PodTestAlertView
    

    执行创建podspec文件语句:

    pod spec create SPEC_NAME
    

    在目录下会出现一个PodTestAlertView.podspec文件,可以使用sublime打开。可以看到里面有很多信息需要补充:

    Pod::Spec.new do |s|
    
      # ―――  Spec Metadata  ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
      #
      #  These will help people to find your library, and whilst it
      #  can feel like a chore to fill in it's definitely to your advantage. The
      #  summary should be tweet-length, and the description more in depth.
      #
    
      s.name         = "PodTestAlertView"
      s.version      = "0.0.1"
      s.summary      = "A short description of PodTestAlertView."
      #此处省略一万字
    end
    

    编辑podspec文件(大概介绍一下podspec文件中的每个字段的含义)

    字段 含义
    name 库名称,即pod search POD_NAME中的POD_NAME字段
    version 库版本,这里需要和上面的tag版本相同
    homepage 表示匹配所有子目录
    license 这个不是很了解,暂时使用MIT
    author 一般会根据本地的git账户自动填好
    platform / deployment_target 单平台用platform,多平台使用deployment_tartet
    source git字段填写仓库地址,后面可以使用tag指定标签,也可以使用commit指定某一次提交
    source_files 指定库源文件的位置,如果仓库中包含多个pod库,那么在引用pod库时,则需要指定是什么库的文件
    resource / resources 资源文件,和source_files格式类似
    framework / frameworks 去掉.framework后缀,多个framework以逗号分隔,例如使用UIKit.frameworkFoundation.framework,则为s.frameworks = "UIKit", "Foundation"
    library / libraries 去掉名字中的lib和.tbd等后缀,多个lib以逗号分隔,例如使用libsqlite3.0.tbdlibc++.tbd,则为s.libraries = "sqlite3.0", "c++"
    dependency 依赖的第三方库,可以指定版本,例如s.dependency "JSONKit", "~> 1.4",也可以不指定版本,例如s.dependency "JSONKit"将默认使用最新版本;这里也可以使用自己的私有库,使用私有库在验证podspec时需要进行私有库地址的搜索,添加--sources = 'SOURCE_URL1, SOURCE_URL2',否则只会在官方仓库搜索,导致依赖库找不到的问题

    source_files字段,表示在仓库中寻找并添加的文件类型,需要指定要添加的文件路径。例如我的目录中,这个字段就可以写成s.source_files = "PodTestAlertView/*.{h,m}"

    source_files字段 匹配文件类型
    * 表示匹配所有文件
    *.{h,m} 表示匹配所有以.h和.m的文件
    ** 表示匹配所有子目录

    编辑后的podspec文件大概如下:

    Pod::Spec.new do |s|
    
      s.name         = "PodTestAlertView"
      s.version      = "0.0.3"
      s.summary      = "A short description of PodTestAlertView."
      s.homepage     = "http://EXAMPLE/PodTestAlertView"
      s.license      = "MIT"
      s.author       = "zhangmj"
      s.platform     = :ios, "8.0"
      s.source       = { :git => "https://git.coding.net/rapunzel/TestRepository.git", :tag => "#{s.version}" }
      s.source_files = "PodTestAlertView/*.{h,m}"
      s.frameworks   = "UIKit"
      s.dependency "IQKeyboardManager"
    
    end
    

    验证podspec文件

    验证podspec文件命令:

    pod spec lint SPEC_NAME.podspec
    

    输出验证结果:


    验证结果

    可以看到输出中,会有很多WARN,警告的结果就是最后说The spec did not pass validation,不过它也给出了解决方案,就是you can use '--allow-warnings' to ignore them,修改验证指令:

    pod spec lint SPEC_NAME.podspec --allow-warnings
    

    忽略警告后,验证通过:


    验证通过

    验证过程中也可能由于代码问题,出现代码编译方面的error,可以添加--verbose来查看详细的log:

    pod spec lint SPEC_NAME.podspec --verbose
    

    根据其中提示的代码方面的错误,库引用方面的错误,修改代码,上传更新,重新打标签,修改podspec文件的引用版本,继续验证。

    这里如果在依赖时调用了自己的库,则需要在后面添加私有库地址的SOURCE_URL,因为验证时默认只搜索官方仓库,例:

    pod spec lint --allow-warnings SPEC_NAME.podspec --sources='YOUR_PRIVATE_SOURCE_URL, https://github.com/CocoaPods/Specs.git'
    

    本地调用验证

    验证podspec文件的正确性后,可以在本地先进行一次安装,没问题后再推送到仓库,修改podfile,指定podspec地址为本地的地址:

    pod 'PodTestAlertView', :podspec => '/Users/masaike/.cocoapods/repos/TestRepository/PodTestAlertView/PodTestAlertView.podspec'
    

    成功安装!在做这行之前,我心里是拒绝红色和绿色同时出现的,但在终端里,这个红配绿是夺么和谐!


    安装成功

    将podspec文件推送到远程仓库

    本地验证通过后就可以上传版本了,推送podspec文件使用指令:

    pod repo push REPO_NAME SPEC_NAME.podspec
    

    如果在上一步验证时使用了--allow-warnings来忽略警告,在推送podspec文件时也需要忽略警告:

    pod repo push REPO_NAME SPEC_NAME.podspec --allow-warnings
    

    开始推送后,一般会报一个错误[!] The repo 'TestRepository' at '..' is not clean,原因是podspec文件是直接在repo下生成的,本地的repo
    和远程仓库相比,多了一个podspec文件,所以可以选择将podspec文件移到别的位置,让本地的repo和远程保持同步,重新推送。

    Validating spec
     -> PodTestAlertView (0.0.3)
        - WARN  | homepage: The homepage has not been updated from default
        - WARN  | summary: The summary is not meaningful.
        Updating the 'TestRepository' repo
    
    From https://git.coding.net/rapunzel/TestRepository
     * [new tag]         0.0.1      -> 0.0.1
     * [new tag]         0.0.2      -> 0.0.2
     * [new tag]         0.0.3      -> 0.0.3
    Already up-to-date.
    
    Adding the spec to the 'TestRepository' repo
    
     - [Update] PodTestAlertView (0.0.3)
    
    Pushing the 'TestRepository' repo
    

    推送成功后,远程仓库和本地repo都可以看到一个名字和version相同的文件夹,里面包含刚才添加的podspec文件,代表这个版本的podspec文件,然后就可以试试使用私有库了~

    使用私有库

    在podfile中添加私有仓库地址,同时也要添加官方仓库地址,否则只会在私有仓库中搜索:

    source 'https://git.coding.net/rapunzel/TestRepository.git' #私有仓库地址
    source 'https://github.com/CocoaPods/Specs.git' #官方仓库地址
    
    platform:ios, '8.0'
    
    target 'test' do  #工程名称
    
        #三方开源
        pod 'IQKeyboardManager'
        #私有库
        pod 'PodTestAlertView'
        
    end
    
    

    如果可以成功安装,那就ok啦!

    一些问题

    引用的文件生成的framework,此处感谢此分享的提示

    在podspec文件中有一个字段是vendored_frameworks,可以使用自己生成的framework:

    s.vendored_frameworks = 'Pod/Assets/*.framework'
    

    然后在验证和push到远程仓库时需要添加--user-libraries

    git push origin master比较慢

    如果和我一样用的是Coding,那可能是它给你的圣诞节彩蛋= =

    这是一个彩蛋

    其实还有一个文件夹目录的问题,但是不知道为什么,没有办法复现了,所以先不记录这一条了。

    感谢资源分享

    创建Podspec描述文件

    使用CocoaPods创建私有库

    使用Cocoapods创建私有podspec

    iOS CocoaPods 私有库 steps and tips

    相关文章

      网友评论

        本文标题:CocoaPods私有库

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