美文网首页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