创建私有pod spec的流程以及坑点

参考:http://www.cocoachina.com/ios/20150228/11206.html

一、创建私有Spec Repo

创建一个git仓库,完成后输入命令:pod repo add CMSpecs http://gitlab.365eche.com/Frame/CMSpecs.git, 成功后可以进入~/.cocoapods/repos目录查看,第一步完成。其他合作人员共同使用这个Spec Repo的话在有权限的前提下执行相同的命令来添加这个Repo就行了

二、创建pod项目

在要创建项目的目录下执行:pod lib create podTestlibrary(podTestlibrary是项目名字)。之后会有5个问题,1.用什么语言OC或者Swift。2.是否需要一个例子工程;3.选择一个测试框架;4.是否基于View测试;5.类的前缀,直接点回车就是选择默认值,完了后会自动执行pod install创建项目并生成依赖。

(坑点)有时候pod lib create生成的项目没有生成安装了cocopods的workspace,报错是pod file里边的错误,没错误的时候pod file里的样子是这样的

target 'JKAlertDialog_Example', :exclusive => true do

  pod 'JKAlertDialog', :path => '../'

end

target 'JKAlertDialog_Tests', :exclusive => true do

  pod 'JKAlertDialog', :path => '../'

  pod 'Specta'

  pod 'Expecta'

  pod 'FBSnapshotTestCase'

  pod 'Expecta+Snapshots'

end

如果报pod file错误的话就把pod file修改成上面这种结构的,然后intall pod就行了。

然后添加库文件和资源,并配置podspec。把代码文件放进pod/Classes文件夹中,把资源文件放进pod/Assert文件夹中(不需要放到一个bundle中再添加进来,pod会帮你放进bundle中),然后需要配置一下podspec文件,

Pod::Spec.new do |s|

  s.name             = "PodTestLibrary"    #名称

  s.version          = "0.1.0"             #版本号

  s.summary          = "Just Testing."     #简短介绍,下面是详细介绍

  s.description      = <<-DESC

                       Testing Private Podspec.

 
                       * Markdown format.

                       * Don't worry about the indent, we strip it!

                       DESC

  s.homepage         = "https://coding.net/u/wtlucky/p/podTestLibrary"                           #主页,这里要填写可以访问到的地址,不然验证不通过

  # s.screenshots     = "www.example.com/screenshots_1", "www.example.com/screenshots_2"           #截图

  s.license          = 'MIT'              #开源协议

  s.author           = { "wtlucky" => "wtlucky@foxmail.com" }                   #作者信息

  s.source           = { :git => "https://coding.net/wtlucky/podTestLibrary.git", :tag => "0.1.0" }      #项目地址,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS

  # s.social_media_url = 'https://twitter.com/<twitter_username>'                       #多媒体介绍地址
 
  s.platform     = :ios, '7.0'            #支持的平台及版本

  s.requires_arc = true                   #是否使用ARC,如果指定具体文件,则具体的问题使用ARC
 
  s.source_files = 'Pod/Classes/**/*'     #代码源文件地址,**/*表示Classes目录及其子目录下所有文件,如果有多个目录下则用逗号分开,如果需要在项目中分组显示,这里也要做相应的设置

  s.resource_bundles = {
    'PodTestLibrary' => ['Pod/Assets/*.png']
  }                                       #资源文件地址

  s.public_header_files = 'Pod/Classes/**/*.h'   #公开头文件地址

  s.frameworks = 'UIKit'                  #所需的framework,多个用逗号隔开

  s.dependency 'AFNetworking', '~> 2.3'   #依赖关系,该项目所依赖的其他库,如果有多个需要填写多个s.dependency
end</twitter_username>

上面命令自动生成的podspec中resource_bundles这一项是注释掉的,所以放入Assert中的文件读取不到,还有就是一定要注意标点符号。

资源文件也可以用s.resources = '目录' #资源文件会编译到mainbundle,获取文件方式跟正常情况一样,cocopods希望用resource_bundle的方式,这样不会被读取到mainbundle,读取时会麻烦点,可参考http://blog.xianqu.org/2015/08/pod-resources/,但是一定注意他是先拿到一个bundle,然后又拿到这个bundle的path,然后通过这个path又生成一个bundle,经过很多尝试,只有这种办法可以正常读取。

然后进入Example文件中执行pod update,打开项目可以看到已经添加进Development Pods/PodTestLibrary,然后可以可以编辑demo测试一下组件,注意:每次添加新的文件或者更新podspec都要重新执行以下pod update命令,测试无误后就推送到远端仓库(在PodTestLibrary文件夹下)

$ git add .

$ git commit -s -m "Initial Commit of Library"

$ git remote add origin git@coding.net:wtlucky/podTestLibrary.git           #添加远端仓库

$ git push origin master     #提交到远端仓库

然后打上一个tag,跟podspec里设置的一样(注意)

git tag -m “0.1.0”

git push —-tags

三、验证一下pod spec

pod lib lint

本地测试pod spec文件

创建一个新的项目,在podfile文件中

pod 'PodTestLibrary', :path => '~/code/Cocoapods/podTest/PodTestLibrary'      #指定路径

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

四、podspec提交到spec repo

把podspec中的无用注释删除掉,然后用一个命令提交podspec

pod repo push CMSpecs PodTestLibrary.podspec  #前面是本地Repo名字 后面是pod spec名字

然后可以进入到~/.cocoapods/repos/CMSpecs中查看,spec repo远端仓库也有了一次提交

然后可以用pod search命令查看。

六、更新维护pod spec

添加/修改文件,修改podspec,pod update,然后push 到 远端,打tag,然后验证podspec,然后和第四步一样

七、subspace

给libriary建立子分支,在classes内建立不同的子分支的目录,并配置podspec文件配置不同的subspec,其他同上。

s.subspec 'NetWorkEngine' do |networkEngine|

  networkEngine.source_files = 'Pod/Classes/NetworkEngine/**/*'

  networkEngine.public_header_files = 'Pod/Classes/NetworkEngine/**/*.h'

  networkEngine.dependency 'AFNetworking', '~> 2.3'

end

s.subspec 'DataModel' do |dataModel|

  dataModel.source_files = 'Pod/Classes/DataModel/**/*'

  dataModel.public_header_files = 'Pod/Classes/DataModel/**/*.h'

end

s.subspec 'CommonTools' do |commonTools|

  commonTools.source_files = 'Pod/Classes/CommonTools/**/*'

  commonTools.public_header_files = 'Pod/Classes/CommonTools/**/*.h'

  commonTools.dependency 'OpenUDID', '~> 1.0.0'

end

s.subspec 'UIKitAddition' do |ui|

  ui.source_files = 'Pod/Classes/UIKitAddition/**/*'

  ui.public_header_files = 'Pod/Classes/UIKitAddition/**/*.h'

  ui.resource = "Pod/Assets/MLSUIKitResource.bundle"

  ui.dependency 'PodTestLibrary/CommonTools'

end

(坑点)关于私有pod库依赖私有pod库,这个需要在验证

pod lib lint --sources=https://github.com/CocoaPods/Specs.git,http://gitlab.365eche.com/Frame/CMSpecs.git

(如果同时依赖私有库和cocopods的master库,或者多个私有库,可以有多个链接,中间用逗号分隔),向私有库中提交也需要

pod repo push CMSpecs --sources=https://github.com/CocoaPods/Specs.git,http://gitlab.365eche.com/Frame/CMSpecs.git


最后一个问题点:cocopods0.3.9版本按上面步骤在制作私有库依赖私有库时候是没有问题的,但是目前cocopods1.0.0版本在pod lib lint 时不能通过验证,经过大量查阅,这应该是cocopods支持的问题,有待解决,所以在这种情况下可以退回到0.3.9版本制作私有库。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值