美文网首页知识总结CocoaPods
使用Cocoapods创建公共podspec

使用Cocoapods创建公共podspec

作者: 暗物质 | 来源:发表于2016-11-15 17:32 被阅读462次

    一、创建Pod项目工程文件并推送到远端仓库

    如果有现有的组件项目,并且在Git的版本管理下,那么这一步就算完成了,可以直接进行下一步了。
    如果你的组件还在冗余庞大的项目中,需要拆分出来或者需要自己从零开始创建一个组件库,那么建议使用Cocoapods提供的一个工具来做。

    1.1、Using Pod Lib Create 的使用:

    这里使用ZSMenuView为例子具体讲一下过程,

    • 1、创建项目
      先cd到要创建项目的目录然后执行
      $ pod lib create ZSMenuView
      之后他会问你几个问题,
      1. What is your name? 
      2. What is your email? 
      3. What language do you want to use?? [ Swift / ObjC ]
      4. Would you like to include a demo application with your library? [ Yes / No ]
      5. Which testing frameworks will you use? [ Specta / Kiwi / None ]
     6. Would you like to do view based testing? [ Yes / No ]
     7. What is your class prefix?
    问题的具体介绍可以去看官方文档
    依次回答完这些问题后会自动执行pod install命令创建项目并生成依赖。
    
    • 2、 向Pod文件夹中添加库文件和资源

      ZSMenuView组件所有的代码文件放入到"ZSMenuView/Classes"中,然后进入"ZSMenuView /Example"文件夹执行pod update命令,再打开项目工程可以看到,刚刚添加的组件已经在Pods子工程下"Development Pods/ZSMenuView"中了,然后编辑调试demo工程,测试组件。

      注意1:如果引入不了头文件,需要在"Build Settings -> User Header Search Paths"中添加$(PODS_ROOT)设置为recursive
      注意2:这里需要注意的是每当你向Pod中添加了新的文件或者以后更新了podspec的版本都需要重新执行一遍pod update命令。

    • 3、将该项目添加并推送到远端仓库

      $ git add .
      $ git commit -m "init commit of ZSMenuView" 
      $ git remote add origin git@github.com:safiriGitHub/ZSMenuView.git
      $ git push -u origin master
      
      #因为podspec文件中获取Git版本控制的项目还需要tag号,所以我们要打上一个tag
      $ git tag -m "first release" "0.1.0"
      $ git push --tags
    
    • 4、编辑podspec文件,没有涉及到的字段可以去官方文档查阅
      #
    # Be sure to run `pod lib lint ZSMenuView.podspec' to ensure this is a
    # valid spec before submitting.
    #
    # Any lines starting with a # are optional, but their use is encouraged
    # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
    #
    
    Pod::Spec.new do |s|
      s.name             = 'ZSMenuView' #名称
      s.version          = '0.1.0' #版本号
      s.summary          = 'a simple menuView,every menu can be clicked' #简短介绍
    
    # This description is used to generate tags and improve search results.
    #   * Think: What does it do? Why did you write it? What is the focus?
    #   * Try to keep it short, snappy and to the point.
    #   * Write the description between the DESC delimiters below.
    #   * Finally, don't worry about the indent, CocoaPods strips it!
    
    #下面是详细介绍
      s.description      = <<-DESC
    TODO: Add long description of the pod here.
    小功能:菜单栏。+ 练习使用Cocoapods创建公有podspec
                           DESC
    
      s.homepage         = 'https://github.com/safiriGitHub/ZSMenuView' #主页,这里要填写可以访问到的地址,不然验证不通过
      # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'  #截图
      s.license          = { :type => 'MIT', :file => 'LICENSE' } #开源协议
      s.author           = { 'safiri' => 'safiri@163.com' } #作者信息
      s.source           = { :git => 'https://github.com/safiriGitHub/ZSMenuView.git', :tag => '0.1.0' } #项目地址,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
      s.social_media_url = 'http://www.jianshu.com/users/2809c84474f6/latest_articles' #多媒体介绍地址 
    
      s.ios.deployment_target = '8.0' #支持的平台及版本
    
      s.source_files = 'ZSMenuView/Classes/**/*'   #代码源文件地址,**/*表示Classes目录及其子目录下所有文件,如果有多个目录下则用逗号分开,如果需要在项目中分组显示,这里也要做相应的设置
      
      # s.resource_bundles = {
      #   'ZSMenuView' => ['ZSMenuView/Assets/*.png']
      # }   #资源文件地址
    
      # s.public_header_files = 'Pod/Classes/**/*.h' #公开头文件地址
      # s.frameworks = 'UIKit', 'MapKit' #所需的framework,多个用逗号隔开
      # s.dependency 'AFNetworking', '~> 2.3' #依赖关系,该项目所依赖的其他库,如果有多个需要填写多个s.dependency
    end
    
    

    编辑完podspec文件后,需要验证一下这个文件是否可用,如果有任何WARNING或者ERROR都是不可以的,它就不能被添加到Spec Repo中。

    $ pod lib lint
    
    当你看到
    
    -> ZSMenuView (0.1.0)
     
    ZSMenuView passed validation.
    
    说明验证通过了
    

    1.2、创建podspec文件

    如果已经有了现成的项目,那么就需要给这个项目创建一个podspec文件。创建它需要执行Cocoapods的另外一个命令,官方文档

    $ pod spec create [NAME|https://github.com/USER/REPO]
    #Creates a PodSpec, in the current working dir, called NAME.podspec. 
    

    编辑完成之后使用验证命令验证一下

    $ pod lib lint 本地验证
    $ pod spec lint  建议使用远程验证 
    

    在远程验证前要将本地所有改动提交到远程仓库,并打好tag标记,在podspec文件中将tag标记改正确。

    验证无误就可以进入下一步了。

    二、本地测试podspec文件

    创建一个新的项目,在这个项目的Podfile文件中直接指定刚才创建编辑好的podspec文件,看是否可用。

      //在新项目目录下创建Podfile
      $ pod init
    
      //在Podfile中我们可以这样编辑,有两种方式,任选其一:
      platform :ios, ‘8.0’
      target 'podsoecTest' do
      # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
      # use_frameworks!
      # Pods for podsoecTest
      pod ‘ZSMenuView’, :path => ‘/Users/safiri/Downloads/github/ZSMenuView’ #指定路径
    
      pod ‘ZSMenuView’, :podspec => ‘/Users/safiri/Downloads/github/ZSMenuView/ZSMenuView.podspec’#指定podspec文件
    end
    
    

    执行pod install命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了,不过它们并没有在Pods目录下,而是跟测试项目一样存在于"Development Pods/ZSMenuView"中,这是因为我们是在本地测试,而没有把podspec文件添加到Spec Repo中的缘故。

    三、向Spec Repo提交podspec,公共或私有(CocoaPods Trunk

    问题:什么是Spec Repo?
    它是所有的Pods的一个索引,就是一个容器,所有公开的Pods都在这个里面,是一个Git仓库,remote端在GitHub上。
    条件
    podspec必须通过验证无误
    删掉无用的注释(这个不是必须的,为了规范还是删掉吧)
    步骤

      //Getting  started 第一次使用时注册一个邮箱账号
      $ pod trunk register safiri@163.com 'safiri' --description='first 
    trunk'
      访问邮箱中的链接,注册成功。
     
     //Deploying a library
      $pod trunk push [NAME.podspec] #部署公共的Podspec
      $pod repo push REPO [NAME.podspec] #部署私有的Podspec
      #例子,pod trunk push ZSMenuView.podspec --allow-warnings (--allow-warnings忽略Xcode的警告)
    
      //Adding other people as contributors
      $ pod trunk add-owner ARAnalytics kyle@cocoapods.org 
      #For example, to add kyle@cocoapods.org to the library ARAnalytics
    

    四、使用制作好的Pod

    在项目中

      $ pod 'ZSMenuView', '~> 0.1.0'
    

    然后执行pod update,更新库依赖,然后打卡项目可以看到,我们自己的库文件已经出现在Pods子项目中的Pods子目录下了,而不再是Development Pods。

    五、更新维护podspec

    升级代码 -> 根据具体改动,编辑name.podspec -> pod lib lint验证 -> 将项目推送到远端仓库,打上新的tag(git tag '0.2.0' git push --tags) -> 提交到Spec Repo中,$pod trunk push [NAME.podspec] (pod trunk push ZSMenuView.podspec)

    遇到的问题:

    sudo gem update --system升级gem ->sudo gem install -n /usr/local/bin cocoapods --pre升级cocoapods ->pod setup安装cocoapods->pod lib lint验证

    history查看终端历史记录

    pod search查询不到最新版本 ---> pod repo update更新本地缓存

    如果还是不行:
    尝试删除本地缓存,重新setup,
    $rm -fr ~/.cocoapods/repos/master
    $pod setup

    二、pod lib lint 执行时报错

      - ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information.
     - ERROR | xcodebuild:  aaa.h:10:9: error: include of non-modular header inside framework module 'xx': 'bbb.h' [-Werror,-Wnon-modular-include-in-framework-module]
    

    原因:某个头文件(aaa.h)中直接import了依赖的第三方库的头文件(bbb.h),采用了向前声明@Class解决。

    三、删除提交到cocoapods上的框架?

    查看CocoaPods上的个人信息:
    pod trunk me
    有时候如果提交有问题,可以执行一下命令删除:

    // 直接废去这个pod
    pod trunk deprecate xxx

    // 废去这个pod的某个版本
    pod trunk delete xxx 1.0.0

    经测试,两个命令使用完都没返回成功,且pod search是可以找到的,可能是本地库的原因。然后更新本地库pod repo update后,版本会删除成功。

    参考文章
    使用Cocoapods创建私有podspec
    cocoapods.org

    相关文章

      网友评论

        本文标题:使用Cocoapods创建公共podspec

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