参考: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" => "[email protected]" } #作者信息
s.source = { :git => "https://coding.net/wtlucky/podTestLibrary.git", :tag => "0.1.0" } #项目地址,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
# s.social_media_url = 'https://twitter.com/' #多媒体介绍地址
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
上面命令自动生成的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 [email protected]: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版本制作私有库。