CocoaPods入门(下)
上一篇文章主要是CocoaPods的安装及入门使用,以及一些注意事项,是日常工作中最常用的。CocoaPods不但能让我们使用GitHub上面的公共库,还能够很方便的帮我们自己抽取的功能组件做成私有库,一方面出于公司隐私能够保证源码不被泄露,另一方面能够按照CocoaPods的一些用法快速集成使用,对于自己或兄弟团队项目的快速集成开发能够起到事半功倍的作用。
废话不多说,我们切入正题。
1、创建私有库和Spec文件
1.1 Spec Repo
Spec Repo是所有Pods的一个索引仓库,实际上也是一个GitHub仓库,只不过里边不是放的代码,而是我们想要集成依赖库的索引。CocoaPods在本地使用后,~/.cocoapods/repos
目录下会存在我们使用的索引仓库,包括公共库索引和私有库索引,当然前提是你用了。目录结构如下:
.
├── Specs
└── [SPEC_NAME]
└── [VERSION]
└── [SPEC_NAME].podspec
1.2 创建Spec Repo
本篇文章将以创建一个私有库来讲解整个过程,公司一般都是用GitLab作为代码仓库,和在其他代码仓库网站一样,我们首先创建一个名为iosSpecs
的spec仓库,然后执行下面命令,会在~/.cocoapods/repos
目录下创建对应的文件夹。
// xxcode@xxcode.be.xxxx.com:xxxx-ios/iosSpecs.git是你自己创建的spec仓库的地址
$ pod repo add iosSpecs xxxx@xxxx.be.xxxx.com:xxxx-ios/iosSpecs.git
1.3 创建Pod项目
首先使用下边的命令创建一个名为DWDemo
的Pod项目:
$ pod lib create DWDemo
之后会弹出一些问题,根据提示我们输入回车就好:
What platform do you want to use?? [ iOS / macOS ]
> iOS
What language do you want to use?? [ Swift / ObjC ]
> Objc
Would you like to include a demo application with your library? [ Yes / No ]
> Yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
Would you like to do view based testing? [ Yes / No ]
> No
What is your class prefix?
> XX
最后一个是要确定项目工程文件的类前缀,一般是公司名的简写,比如小米就是MI。这些做完后,项目工程自动创建完成。
1.4 编辑Pod项目
pod项目文件说明.png1.4.1 podspec文件
项目创建好之后,存在一个名为DWDemo.podspec
的文件,部分格式和配置说明如下,如果想要更详细的配置,请参考官方文档。
Pod::Spec.new do |s|
s.name = 'DWDemo' // 私有库项目名
s.version = '0.1.0' // 私有库项目版本号
s.summary = 'A short description of DWDemo.' // 项目简洁描述
s.description = <<-DESC // 项目详细描述
s.homepage = 'https://github.com/zhudawei/DWDemo' // 私有库主页
// 许可证/授权
s.license = { :type => 'MIT', :file => 'LICENSE' }
// 私有库项目所有者
s.author = { 'zhudawei' => 'zhudawei@xiaomi.com' }
// 私有库远端仓库地址
s.source = { :git => 'https://github.com/zhudawei/DWDemo.git', :tag => s.version.to_s }
// 最低支持的iOS版本
s.ios.deployment_target = '8.0'
// pod项目会根据这个路径拉取代码文件,这个地方容易出错
s.source_files = 'DWDemo/Classes/**/*'
// 如果私有库需要加载资源文件的话需要把这个加上,去掉'#'号,配置下资源路径
# s.resource_bundles = {
# 'DWDemo' => ['DWDemo/Assets/*.png']
# }
// 私有库对外公开的头文件,没有这行的话默认所有文件都是公开的
# s.public_header_files = 'Pod/Classes/**/*.h'
// 私有库依赖的框架
# s.frameworks = 'UIKit', 'MapKit'
// 私有库依赖的第三方库
# s.dependency 'AFNetworking', '~> 2.3'
end
1.4.2 Classes目录
私有库的功能代码都要放在Classes目录下面,并且去podspec文件中配置s.source_files = 'DWDemo/Classes/**/*'
。这个地方路径非常容易出错,因为DWDemo下边的Classes在上面图片中是没有出现的,最好是删掉ReplaceMe.m
文件,然后打开文件目录,将相关代码拷贝到本地目录的Classes文件夹下,然后通过Add Files to “Pods”...
将文件添加到项目中。
1.4.3 Resource目录
需要往工程中添加资源的话,配置podspec文件中有关资源的片段,去掉注释,如下:
s.resource_bundles = {
'DWDemo' => ['DWDemo/Assets/**/*']
}
1.4.4 头文件
在Classes目录下的Header文件,我们尽可能少的暴露给用户,所以header文件就需要分别配置成public和private两种,这个需要在podspec文件中配置,如下:
s.public_header_files = 'DWDemo/Classes/**/*.h'
s.private_header_files = 'DWDemo/Classes/Internal/*.h'
其中Internal目录是在Classes文件夹下,用于存在private的头文件
1.4.5 私有库子分支
库可以根据不同的模块创建不同的子分支,使用时Podfile文件中可以指定只需要加载哪些模块,具体操作步骤如下:
-
在Classes目录下创建对应模块的子目录
-
在podspec文件中使用subsepc特性,以SDWebimage的podspec文件为例:
s.subspec 'GIF' do |gif| gif.ios.deployment_target = '7.0' gif.source_files = 'SDWebImage/FLAnimatedImage/*.{h,m}' gif.dependency 'SDWebImage/Core' gif.dependency 'FLAnimatedImage', '~> 1.0' gif.xcconfig = { 'USER_HEADER_SEARCH_PATHS' => '$(inherited) $(SRCROOT)/FLAnimatedImage/FLAnimatedImage' } end
-
在Podfile文件中指定要加载哪些模块,如下:
pod 'YOUR_SPEC', :subspecs => ['IDFA', 'IDFB']
1.4.6 项目Demo
为了方便测试和别的同学方便上手使用,我们可以在Example for DWDemo
中根据测试用例写一些demo。此时需要编辑项目的Podfile文件,然后pod install
一下。
需要注意的是,当项目创建后,每次向Pod中添加了新文件,或者更新了podspec文件、Podfile文件,都需要重新执行下pod update
命令来使改动生效。
2、提交私有库和Spec文件
2.1 提交项目代码
将功能代码添加到私有库项目中编译运行成功后,我们需要将它提交到远端仓库,进入到Example
文件加下,执行如下命令:
$ git add .
$ git commit -m "项目初始化"
$ git remote add origin xxxx@xxxx.be.xxxx.com:xxxx-ios/xxxx.git
$ git push origin master
2.2 添加tag
为私有库的远端仓库代码添加tag,pod会根据Podfile文件中指定的版本号去远端仓库中查找对应的tag来拉取代码。命令如下:
$ git tag -a 1.0.0 -m "Release 1.0.0"
$ git push origin 1.0.0
2.3 配置podspec文件
根据上面对podspec文件的配置描述来进行文件配置,podspec文件一般在项目工程的主目录下,不需要我们自行创建。如果想自己创建的话,执行如下命令:
$ pod spec create DWDemo xxxx@xxxx.be.xxxx.com:xxxx-ios/xxxx.git
配置完不要忘记pod update
一下哦~
2.4 验证podspec文件
上面步骤完成后,需要验证podspec文件是否可用,如果有Error存在是不可用的。执行如下命令:
$ pod lib lint --allow-warnings --use-libraries
出现下面文字,验证通过。
-> DWDemo (1.0.0)
DWDemo passed validation.
2.5 提交podspec文件
podspec文件验证通过后,我们通过下边的命令将podspec文件提交到Spec Repo,执行如下命令:
$ pod repo push iosSpecs DWDemo.podspec --allow-warnings --use-libraries --sources=xxxx@xxxx.be.xxxx.com:xxxx-ios/iosSpecs.git,https://github.com/CocoaPods/Specs
出现下面的信息,说明spec文件添加成功。
Updating the `iosSpecs' repo
Adding the spec to the `iosSpecs' repo
- [Add] DWDemo (1.0.0)
Pushing the `iosSpecs' repo
添加成功后,我们进到~/.cocoapods/repos
目录下,执行pod repo update iosSpecs
命令,更新本地的iosSpecs文件,就可以看到本地的iosSpecs文件夹下已经包含DWDemo的spec文件了。然后执行pod search DWDemo
,是不是已经可以搜索到我们的私有库了~
nice,大功告成!