随着项目和业务的发展,项目中会有很多基础功能模块和通用业务模块可以抽象出来独立成组件,这样可以为我们以后在开发新项目的时候提供共用基础组件,进行组件化编程,不需要重新造轮子,节约人力物力,节约生命,提高开发效率。因此我们就需要一个方案来合理的管理公共的组件。
Git脚本 VS CocoaPods私有仓库
1、Git脚本:就是把我们的公共组件代码单独创建一个工程仓库,然后把代码放在里面,然后在我们需要用到的地方通过Git脚本命令将代码拉取下来,最后我们手动创建一个workplace把项目关联起来。这种方法简单粗暴,但是问题很多,比如版本不好控制,并且需要很多手动操作。操作一多就容易出问题,所以不推荐使用这种方式。
2、CocoaPods私有仓库:几乎全自动化,还可以对公共组件代码进行版本控制。我们在集成的时候可以按需获取指定版本。
Spec Repo的概念理解
CocoaPods对于一名iOS开发来说再熟悉不过了,它的工作原理就是在GitHub上面有个Spec Repo,它里面包括成千上万的podspec文件索引目录。然后我们在项目集成的时候可以通过它去找到我们需要的开源代码。其实CocoaPods的Spec Repo就是一个中介。
The Specs Repo is the repository on GitHub that contains the list of all available pods. Every library has an individual folder, which contains sub folders of the available versions of that pod.
一、创建私有 Spec Repo
按照上面的理解,我们如果能自己创建一个类似CocoaPods的Spec Repo,然后把我们公共组件的podspec文件放在里面,然后集成的时候让CocoaPods帮我们集成那我们就能达到目的。
- 1、进入./cocoapods/repos 查看已经存在的spec repo,这个时候我们能看到一个master文件夹。
cd ~/.cocoapods/repos
ls
- 2、在私有git服务器上创建自己的spec repo,
这一步如果大家要创建私有仓库的话,应该在自己公司的git服务器上创建;我这里为了测试方便在GitHub上面创建的一个公有仓库。创建完成后在终端执行以下命令:
# pod repo add [Private Repo Name] [Your GitHub HTTPS clone URL]
$ pod repo add HJSpecs https://github.com/OldGhost366/HJSpecs.git
- 3、使用第1步中的命令进入目录我们发现多了一个HJSpecs文件夹,到这里我们的私有spec repo就创建好了。
或者我们还可以使用pod repo list命令查看,
HJSpecs
Type: git (master)
URL: https://github.com/OldGhost366/HJSpecs.git
Path: /Users/j/.cocoapods/repos/HJSpecs
master
Type: git (master)
URL: https://github.com/CocoaPods/Specs.git
Path: /Users/j/.cocoapods/repos/master
二、创建pods公共组件库
这一步最简单的办法就是直接创建一个文件夹然后里面创建一个.podspec结尾的文件,这样我们的公共组件库就创建成功了。
- 1、在这里我使用的是pod命令来创建:pod lib create HJPodTestLib 这里会询问几个问题,最好都选NO
jdeMacBook-Pro:PodSpecRepo j$ pod lib create HJPodTestLib
Cloning `https://github.com/CocoaPods/pod-template.git` into `HJPodTestLib`.
Configuring HJPodTestLib template.
To get you started we need to ask a few questions, this should only take a minute.
If this is your first time we recommend running through with the guide:
- http://guides.cocoapods.org/making/using-pod-lib-create.html
( hold cmd and double click links to open in a browser. )
What language do you want to use?? [ Swift / ObjC ]
> ObjC
Would you like to include a demo application with your library? [ Yes / No ]
> No
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?
> HJ
- 2、在远程git服务器创建组件仓库,并且和本地关联
git add .
git commit -s -m "Initial Commit of Library"
git remote add origin https://github.com/OldGhost366/HJPodTestLib.git
git push origin master
- 3、创建tag,因为podspec文件中获取Git版本控制的项目还需要tag号,所以我们要打上一个tag,这一步一定不要忘记 不然第5步就会说找不到版本。
git tag -m "第一版" 0.1.0
git push --tags
- 4、编写podspec文件,
我里面标注要修改的地方一定要修改下不要用默认的,不然第5不会出警告。
Pod::Spec.new do |s|
s.name = 'HJPodTestLib'
s.version = '0.1.0'
s.summary = 'HJPodTestLib.' #这里要修改下
s.description = <<-DESC
description of the pod here. #这里也要修改下
DESC
s.homepage = 'https://github.com/OldGhost366/HJPodTestLib'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'OldGhost366' => 'oldghost007@163.com' }
s.source = { :git => 'https://github.com/OldGhost366/HJPodTestLib.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '8.0'
s.source_files = 'HJPodTestLib/Classes/**/*'
end
- 5、验证 pod lib lint,
ERROR和WARMING都不能有,不然不能提交。
jdeMacBook-Pro:HJPodTestLib j$ pod lib lint
-> HJPodTestLib (0.1.0)
HJPodTestLib passed validation.
- 6、提交podspec到私有spec repo
这个时候需要,必须前面验证通过,不然提交会失败,因为提交过程先会进行验证。
执行下面命令后CocoasPod自动会将podspec到本地和远程spec repo Git仓库。我们这时候可以在Git远程仓库可以看到这个podspec文件了。
pod repo push HJSpecs HJPodTestLib.podspec
三、集成测试
- 1、搜索私有库看是否存在
pod search HJPodTestLib
-> HJPodTestLib (0.1.0)
HJPodTestLib.
pod 'HJPodTestLib', '~> 0.1.0'
- Homepage: https://github.com/OldGhost366/HJSpecs.git
- Source: https://github.com/OldGhost366/HJPodTestLib.git
- Versions: 0.1.0 [HJSpecs repo]
(END)
- 2、创建项目测试
pod init
然后我们编辑Podfile文件
target 'PodTest' do
platform :ios, '8.0'
pod 'HJPodTestLib', '~> 0.1.0'
pod 'AFNetworking'
end
执行pod install
[!] Unable to find a specification for `HJPodTestLib`
这个命令之后可能会产生上面的错误,如果你没遇到最好,因为这个可能和我的Xcode(8.1)和CocoaPods(1.2.1)版本有关。网上查了下好像和Xcode8有关,但是我按里面的解决办法没有解决,因为我输入下面命令后根本没有反应。
pod spec lint --sources='https://github.com/OldGhost366/HJSpecs.git,https://github.com/CocoaPods/Specs'
最终解决办法在Podfile里面增加source指定,两个都要添加
#增加下面两个source这样pod install就不会出问题了
source 'https://github.com/OldGhost366/HJSpecs.git'
source 'https://github.com/CocoaPods/Specs.git'
target 'PodTest' do
platform :ios, '8.0'
pod 'HJPodTestLib', '~> 0.1.0'
pod 'AFNetworking'
end
通过上面的步骤我们实现了一个我们自己的CocoaPods私有spec repo。这样我们就可以通过CocoaPods来管理我们的公共组件了。
我的另外一篇-创建subspec
参考:
http://blog.wtlucky.com/blog/2015/02/26/create-private-podspec/