如何发布自己的开源框架到CocoaPods---持续更新中

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

——在项目所在目录下执行* pod init * , 生成Podfile文件, 我们需要对其进行相应的配置。

在开发过程中,经常会使用到第三框架,我们通过一个pod install命令,很方便的就将第三方框架加到我们自己的项目中。
用CocoaPods做iOS程序的依赖管理

1. 在github创建仓库完成,需要将仓库检出到本地(截取网上的例子)

注意:LICENSE(许可证)文件不可缺少,否则检测spec文件时,会有警告

2. 将写好开源框架/库的Demo或者Example放到Git仓库下,还要将要开源的文件夹也放入到git仓库中(该文件夹在后面会被用到)(截取网上的例子)

3. 项目发布到github后,我们在工程根目录中初始化一个Podspec文件:创建自己项目的Podspec描述文件:

pod spec create ECGCustomAlertView

  1. 该命令将在本目录产生一个名为ECGCustomAlertView.podspec文件。用编辑器(命令行:vim ECGCustomAlertView.podspec)打开该文件,里面已经有非常丰富的说明文档。下面介绍如何声明第三方库的代码目录和资源目录,还有该第三方库所依赖ios核心框架和第三方库。这是我的podspec文件:
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    s.name:名称,pod search 搜索的关键词,注意这里一定要和.podspec的名称一样,否则报错 s.version:版本号 s.ios.deployment_target:支持的pod最低版本 s.summary: 简介 s.homepage:项目主页地址 s.license:许可证 s.author:作者 s.social_media_url:社交网址,这里我写的微博默认是Twitter,如果你写Twitter的话,你的podspec发布成功后会@你 s.source:项目的地址 s.source_files:需要包含的源文件 s.resources: 资源文件 s.requires_arc: 是否支持ARC s.dependency:依赖库,不能依赖未发布的库,如 s.dependency = ‘AFNetworking’ s.dependency:依赖库,如有多个可以这样写。我这里是托管在github上,所以这里将地址copy过来就行了。

    source_files: 核心代码的文件地址。注意:这里是经常出错的地方!—如果使用的是这种方式来显示核心代码地址而不是下面的模块化的话,注意:需要将代码文件必须以仓库名命名(也就意味着最多只有两个文件.h和.m文件了,可以有一个.h文件,把它作为头文件就行),这种方式检验podspec文件有点严格,否则就会报错。
    写法及含义建议大家写第一种或者第二种。
    这里写图片描述
    “ECGCustomAlertView/*”
    “ECGCustomAlertView/ECGCustomAlertView/*.{h,m}”
    “ECGCustomAlertView/*/.h”

    “*” 表示匹配所有文件
    “*.{h,m}” 表示匹配所有以.h和.m结尾的文件
    “**” 表示匹配所有子目录

4. 模块化

  1. 通过PodSpec的subspec 可以使一个项目能模块化输出功能 ,一个例子:
Pod::Spec.new do |s|
  s.name         = "iOS_Util"
  s.version      = "0.10.0"
  s.summary      = "Some iOS Util"

  s.license      = 'MIT'

  s.author       = { "文通" => "wentong@taobao.com" }


  s.platform     = :ios, '6.1'

  s.ios.deployment_target = '4.3'

  s.subspec 'Common' do |cos|
    cos.source_files = 'iOS_Util/Common/*.{h,m}'
    cos.public_header_files = 'iOS_Util/Common/*.h'
  end

  s.subspec 'Core' do |cs|
    cs.source_files = 'iOS_Util/Core/*.{h,m}'
    cs.public_header_files = 'iOS_Util/Core/*.h'
    cs.dependency 'libextobjc', '0.2.5'
  end

  s.subspec 'Json' do |js|
    js.source_files = 'iOS_Util/Json/*.{h,m}'
    js.public_header_files = 'iOS_Util/Json/*.h'
    js.dependency 'iOS_Util/Core'
  end

  s.subspec 'Bean' do |bs|
    bs.source_files = 'iOS_Util/Bean/*.{h,m}'
    bs.public_header_files = 'iOS_Util/Bean/*.h'
    bs.dependency 'iOS_Util/Core'
  end

  s.subspec 'DB' do |ds|
    ds.source_files = 'iOS_Util/DB/*.{h,m}'
    ds.public_header_files = 'iOS_Util/DB/*.h'
    ds.dependency 'FMDB/standard' ,'~> 2.1'
    ds.dependency 'iOS_Util/Common'
    ds.dependency 'iOS_Util/Core'
  end

  s.subspec 'WebP' do |ws|
    ws.source_files = 'iOS_Util/WebP/*.{h,m}'
    ws.public_header_files = 'iOS_Util/WebP/*.h'
    ws.dependency 'libwebp' ,'~> 0.3.0-rc7'
    ws.frameworks = 'CoreGraphics'
  end

  s.subspec 'Location' do |ls|
    ls.source_files = 'iOS_Util/Location/*.{h,m}'
    ls.public_header_files = 'iOS_Util/Location/*.h'
    ls.dependency 'iOS_Util/Common'
    ls.dependency 'iOS_Util/DB'
    ls.frameworks = 'CoreLocation' ,'MapKit'
    ls.resource = 'iOS_Util/Location/chinaDivision.sqlite'
  end

  s.subspec 'AMR' do |as|
    as.source_files = 'iOS_Util/AMR/**/*.{h,m,mm}'
    as.public_header_files = 'iOS_Util/AMR/**/*.h'
    as.preserve_paths = "iOS_Util/AMR/**"
    as.library   = 'opencore-amrnb','opencore-amrwb'
    as.xcconfig  = { 'LIBRARY_SEARCH_PATHS' => '"$(PODS_ROOT)/iOS_Util/iOS_Util/AMR/lib"' }
  end

  s.subspec 'Cache' do |cas|
    cas.source_files = 'iOS_Util/Cache/*.{h,m,mm}'
    cas.public_header_files = 'iOS_Util/Cache/*.h'
    cas.dependency 'iOS_Util/Common'
  end

  s.subspec 'Preference' do |ps|
    ps.source_files = 'iOS_Util/Preference/*.{h,m,mm}'
    ps.public_header_files = 'iOS_Util/Preference/*.h'
    ps.dependency 'iOS_Util/Json'
  end

  s.requires_arc = true



end

5. 设置tag号,提交修改(注:只要spec文件被修改,就必须重新执行如下命令)

git commit -m "Release 1.0.1"  (先提交当前修改)
git tag 1.0.1            (添加tag)
git push --tags         (推送tag到远程)
git push origin master  (推送到远程到代码仓库)

6. 提交之前先验证.podspec文件是否合法

pod spec lint ECGCustomAlertView.podspec  
pod spec lint ECGCustomAlertView.podspec --allow-warnings     (忽略警告)
  • 错误列表
    这里写图片描述
    从错误信息中得到:我的项目编译不通过:ECGLoadsAlertViewController.h 类文件找不到,需要将项目错误的地方修改掉,如果显示这样的提示信息:

  • 验证通过
    这里写图片描述
    那么就是已经配置成功,可以提交到cocoapods了,否则要将所有提示的error和warn修改掉。

7. 验证.podspec文件报错,解决方法

  • 先删除tag
// 删除本地tag
git tag -d 1.0.0
// 删除远程tag
git push origin -d tag 1.0.0
  • 修改spec文件(必须修改相应的version和source)
  • 重新执行–>设置tag号,提交修改的步骤

8. podspec文件验证成功,通过trunk推送podspec文件

pod trunk push ECGCustomAlertView.podspec
  • 如果有如下提示,需要你用邮箱注册一个trunk
    这里写图片描述

  • 用邮箱注册trunk(建议:用github注册的邮箱地址为好,外加用户名–>gitub的用户名(我用邮箱用户名也通过了))

pod trunk register 邮箱地址 "用户名" --description="macbook pro"
  • 之后会有一封带有验证链接的邮件发送到你输入的邮箱,点击验证后就可以回来终端继续提交操作了。

9. 提交到cocoapods

pod trunk push ECGCustomAlertView.podspec
pod trunk push ECGCustomAlertView.podspec --allow-warnings
  • 我碰到了个错误提示1:
    这里写图片描述
  • 网上查的解决方法:解决方案
    实质:If you get this error message:(如果你获得这个错误信息:)
    这里写图片描述
    You need to set and unset that rename limit:
    这里写图片描述
git config merge.renameLimit 999999
git config --unset merge.renameLimit
  • 我碰到的错误信息2:
    这里写图片描述

  • 该错误为:无法打开TCP连接到trunk.cocoapods.org:
    具体原因我没有找出来,我的解决办法是重新修改spec配置文件(vim),需要修改版本号,然后继续提交就成功了!

  • 然后继续提交到cocoapods,如果成功会出现:
    这里写图片描述

10. Cocoapods: pod search无法搜索到类库的解决办法

  • 删除~/Library/Caches/CocoaPods目录下的search_index.json文件
 pod setup成功后会生成~/Library/Caches/CocoaPods/search_index.json文件。
 终端输入rm ~/Library/Caches/CocoaPods/search_index.json
 删除成功后再执行pod search

稍等片刻就会出现你所要搜的类库了。

11. podspec文件更新方法

  • 以后我们的库有新版本时,我们可以修改相应的version和source。

  • 有时你可能会遇到这种情况:执行pod trunk push操作后发现podspec文件的某个地方写错了,想更新一下。对于这种情况,我们可能会先尝试着在把podspec文件push一次。但是如果你的代码版本号没变(podspec里的version自然也没变)就会提示push失败,即使你更改了podspec的其他地方,pod也会认为这两个文件是同一个。 我目前为止找不到trunk的相关update接口,所以只能顺水推舟,更新源代码版本号(如:1.1.1->1.1.2),重新push version tag,然后再执行pod trunk push操作。

  • 后来遇到的坑:


    • 1.通过代码创建的podspec文件里面都是双引号,博主用的都是单引号,经测试,无影响,还有UIKIT等库和第三方库的引入,以及版本升级,这一部分已经放在这里;

    • 2.发现一个问题,如果你在某个库中用了NSInteger,会报警告,原因是:typedef long NSInteger;类似这种情况的还有别的,如果遇到你可以替换成像这里应该是long,也可以选择忽略警告,比如:pod trunk push ScrollSliderView.podspec –allow-warnings;

    • 3.有时候在push时会遇到这样的报错:[!] There was an error pushing a new version to trunk: Net::OpenTimeout 不要惊慌,仅仅是因为网络不好没有push成功,不妨再试一次。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值