美文网首页iOS之开发配置征服iOSiOS Cocoapods相关
cocoapods系列教程---让自己的开源框架支持cocoap

cocoapods系列教程---让自己的开源框架支持cocoap

作者: youngyunxing | 来源:发表于2016-09-18 18:48 被阅读1078次

    cocoapods系列教程---安装与使用
    cocoapods系列教程---Podfile文件
    cocoapods系列教程---Podfile.lock文件 和 Spec Repo
    cocoapods系列教程---spec文件
    cocoapods系列教程---原理篇
    cocoapods系列教程---让自己的开源框架支持cocoapods
    cocoapods系列教程---模块化设计
    cocoapods系列教程---创建私有pods

    参考:http://studentdeng.github.io/blog/2013/09/13/cocoapods-tutorial/

    提交代码到代码托管平台

    既然是开源,要求代码任何人都能够访问,这里选择github,当然也可以用其他平台如oschina等,项目必须是公开项目.比如我的这个:https://github.com/iOSSinger/SGExtension.git

    创建spec文件

    • 将代码克隆到本地,如果本地已经存在,直接跳过这一步.

    • 创建.podspec文件,切换到项目根目录,创建spec文件:

      //切换到项目根目录
      cd SGExtenion
      
      //创建spec文件
      pod spec create SGExtension
      
      
    • 用xcode打开 SGExtension.podspec,里面有英文注释,我这里直接给简单模板,其实就是去掉了注释,详细的设置看这里

    Pod::Spec.new do |spec|
    
    spec.name                  = 'SGExtension'
    
    spec.version               = '1.0.2'
    
    spec.ios.deployment_target = '8.0'
    
    spec.license               = 'MIT'
    
    spec.homepage              = 'https://github.com/iOSSinger'
    
    spec.author                = { "iOSSinger" => "747616044@qq.com" }
    
    spec.summary               = '各种工具的合集'
    
    spec.source                = { :git => 'https://github.com/iOSSinger/SGExtension.git', :tag => spec.version }
    
    spec.source_files          = "SGExtension/**/{*.h,*.m}"
    
    spec.resources             = "SGExtension/source.bundle"
    
    spec.frameworks            = 'UIKit'
    
    spec.library               = 'z'
    
    spec.requires_arc          = true
    
    end
    
    

    解释下每行的意思:

    • spec.name
      名字,pod search 搜索的关键词,注意这里一定要和.podspec的名称一样,否则报错

    • spec.version
      版本号

    • spec.ios.deployment_target
      支持的ios最低版本

    • spec.license
      许可证,一般MIT,这里提醒一下,根目录下必须要有LICENSE这个文件,可以直接把我项目中的copy一份,改下作者名字即可.一般github创建仓库的时候可以选择许可为MIT,会自动帮你生成该文件.

    • spec.homepage
      项目主页地址,要求必须能访问

    • spec.author
      作者信息

    • spec.summary
      项目简介

    • spec.source
      项目的地址,填上项目的github地址,tag => spec.version表示git项目的tag值与上面的spec的版本一致,这里是 1.0.2 .

    • spec.source_files
      项目源文件,主要是.h和.m文件,

      • *表示匹配所有文件
      • {.h,.m} 表示匹配所有以.h和.m结尾的文件
      • ** 表示匹配所有子目录,以及递归子目录
    • spec.resources
      项目所需的资源文件,比如图片

    • spec.frameworks
      项目的依赖框架,比如UIKit,不需要后缀名

    • spec.library
      项目依赖的库文件(这个是系统的库文件),不需要后缀名,比如sqlite,libz等.以lib开头的需要省略掉lib这三个字母.例如:libz需要简写为z否则报错.

    • spec.requires_arc
      是否是arc,一般true

    如果你的项目依赖了别的pod项目,可以这样写:

    spec.dependency = 'AFNetworking'
    
    
    提交代码,并打上tag
    //提交代码
    git push
    
    //打tag
    git tag 1.0.2
    
    //将tag推送到远端
    git push origin --tags
    
    

    附上目录:

    Paste_Image.png
    验证podspec文件
    pod spec lint SGExtemnsion.podspec
    
    

    这一步如果报错,根据错误自行修改,根据大致意思能看出来个大概,终端会给出哪一行出错了.一般就是语法错误,资源找不到,git地址不对或者不能访问.指定的文件如{.h,.m}找不到,一般再检查检查基本没问题.

    2018.1更新: 有时候明明代码没问题(很确定),但是还是不通过,可以尝试清理下缓存:

    //获取已经缓存的列表
    pod cache list
    
    //清除指定的缓存
    pod cache clean xxx(缓存的名字,上一步可获取)
    
    注册trunk,并提交spec文件cocoapods仓库
    • 注册chunk,查看是否注册过

      pod trunk me
      
      
    • 如果没有注册,那么注册:

      pod trunk register 747616044@qq.com "iOSSinger"
        
      

      填上邮箱用户名就可以了.注册完成之后会给你的邮箱发个邮件,进入邮箱邮件里面有个链接,需要点击确认一下.然后再查看下是否注册成功:

      pod trunk me
      
      
    • 提交spec文件到 CocoaPods 中心仓库

      pod trunk push SGExtension.podspec 
      
      

      如果前面都没问题,这一步基本也没啥问题.不过网速比较慢可能要等很久,这一步建议翻墙,不然有可能真的很慢.

    • 然后验证一下,是否可以查到

      pod search SGExtension
      
      

    如果能够查到,恭喜你 !,如果查不到,往下看

    • 解决方案:

      • 查看上一步(提交到代码仓库)是否成功,再次执行提交:
      pod trunk push SGExtension.podspec
      
      

      如果出现如下信息:

      [!] Unable to accept duplicate entry for: SGExtension (1.0.2)
      
      

      那么说明已经提交到cocoapods仓库成功,那么有可能就是本地仓库没有更新.更新本地仓库:

      pod repo update
      
      
      • 再次执行 pod search SGExtension 命令,如果还搜索不到,继续往下看:
      rm ~/Library/Caches/CocoaPods/search_index.json  
       
      

      这句话是移除已经生成的搜索目录缓存文件,移除之后,执行pod search会重新生成一份最新的缓存列表,基本到这里就差不多了.

      • 如果还有问题,那就需要终极大招,但是不推荐用,时间很长,除非翻墙.

        pod repo remove master  
        pod setup
        
        

        或者

        sudo rm -fr ~/.cocoapods/repos/master
        pod setup
        
        

        这两种写法的意思都是移除本地cocoapods仓库,重新从官网拉取一遍.可能时间比较长,所以不建议用,如果网速度快可以考虑使用,也可以翻墙.整个仓库打下大约500M+(截止当前时间).

    集成到项目中试试
      target '项目名' do
      pod 'SGExtension'
      end
    
    
    多人共同维护你的开源项目

    如果需要多个人维护一个库,每个人都应该有权限push提交spec文件;第一个push的人可以被认为是管理员,可以再添加子管理员,这样子管理员就有权限push了

    pod trunk add-owner 邮箱地址
    
    

    移除某个管理员

    pod trunk remove-owner 邮箱地址
    
    
    * pod lib lintpod spec lint 有什么区别
    • pod lib lint 不需要联网
    • pod spec lint 会联网检查sepc repo,并且关联tag
      大功告成,喝杯12年的拉菲睡一觉~.

    相关文章

      网友评论

      • eb3ff47429db:Hi 楼主,我最近也在组件化改造项目工程,用的是cocoapods的localPods的形式,引用相对项目路径下组件repo源码。

        我发现执行pod install后,在pod.xcproject中, 每个repo的header search paths 都会含有各个repo的头文件,无法在项目编译时检查出各个组件的依赖。

        想问问楼主,有什么idea可以帮助我一下吗?😄
        youngyunxing:@ChenYim 不明白你的初衷是什么,问题是什么
      • 白水灬煮一切:感谢楼主分享!
      • 母猪撞火山:感谢博主分享,受益良多,最近在把项目中的一个垂直业务做成pod组件,这个组件跟主项目一样依赖了一些第三方,有些第三方是重复的,遇到共同依赖的第三方版本不一致,会报错,想请教下博主这种集成要注意什么?
        母猪撞火山:@iOSSinger 对,现在在spec文件中就各自写了对第三方的依赖,比如afn这些
        youngyunxing:@CS_森 没研究过这么复杂的,不过既然第三方都重复了,是不是也可以抽取出来,作为依赖?。。
      • 77aca928026c:怎样删除自己的开源库在cocopods上的某个版本
        youngyunxing:_UdeskManager看这个变量有没有问题
        77aca928026c:@iOSSinger 请教个问题,我编译一个sdk静态库,提供头文件。我上传到cocoapods上成功了,pod download下来可以编译成功,但使用头文件调用API时就编译失败了
        Undefined symbols for architecture x86_64:
        "_OBJC_CLASS_$_UdeskManager", referenced from:
        objc-class-ref in ViewController.o
        ld: symbol(s) not found for architecture x86_64
        clang: error: linker command failed with exit code 1 (use -v to see invocation)
        这是错误信息。

        Pod::Spec.new do |spec|
        spec.name = 'XuchenSDKTest'
        spec.version = '0.0.7'
        spec.license = 'MIT'
        spec.summary = 'test sdk'
        spec.homepage = 'https://github.com/xushichen/XuchenSDKTest'
        spec.author = {'xuchen ' => 'xuc@udesk.cn'}
        spec.source = {:git => 'https://github.com/xushichen/XuchenSDKTest.git', :tag => spec.version.to_s }
        spec.source_files = 'UdeskSDK/**/*.{h,m}'
        spec.platform = :ios, '6.0'
        spec.requires_arc = true
        spec.frameworks = 'AVFoundation', 'CoreTelephony', 'SystemConfiguration', 'MobileCoreServices'
        spec.libraries = 'z', 'xml2', 'resolv', 'sqlite3'
        spec.resource = 'UdeskSDK/Resource/UdeskBundle.bundle'
        spec.vendored_libraries = 'UdeskSDK/Lib/libUdesk.a'
        spec.xcconfig = {'OTHER_LDFLAGS' => '-ObjC',
        'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2'}
        end

        这是我的podspec。
        youngyunxing:@6点见 pod trunk delete 名字 版本

      本文标题:cocoapods系列教程---让自己的开源框架支持cocoap

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