CocoaPods - 搭建私有库

CocoaPods是非常好用的一个iOS依赖管理工具,使用它可以方便的管理和更新项目中所使用到的第三方库,以及将自己的项目中的公共组件做成私有库交由它去管理。其工作原理就是在GitHub上面有个Spec Repo,它里面包括成千上万的podspec文件索引目录。然后我们在项目集成的时候可以通过它去找到我们需要的开源代码。

本文通过三个部分介绍通过CocoaPods搭建私有库的流程。

一、创建私有索引库Spec Repo

什么是Spec Repo?它是所有的Pods的一个索引,实际是一个Git仓库,remote端在GitHub上,里面存放着所管理的所有Pods的.podspec文件,当你使用了CocoaPods后它会被clone到本地的~/.cocoapods/repos目录下,可以进入到这个目录看到cocoapods文件夹就是公用Spec Repo了,目录的结构如下:

├── Specs
└── [SPEC_NAME]
└── [VERSION]
└── [SPEC_NAME].podspec

1. 创建远端私有索引库

在GitHub、Gitlab或公司的git服务器上创建一个私有仓库,本文测试时所有库都搭建在腾讯云上,私有Spec Repo取名为TestSpec,切记要初始化该仓库。

2. 本地添加私有索引库

pod repo add [Private Repo Name] [Your GitHub HTTPS clone URL]
pod repo add TestSpec https://git.dev.tencent.com/hxl1010/TestSpec.git

完成后效果为:


本地repos.png

pod repo list命令查看如下:


RepoList.png

备注:

  • 可能会有不成功的情况,参考:http://blog.csdn.net/zhangphil/article/details/47981757 可以将SourceTree的Git换成系统内置的git 再执行此操作,就会提示输入用户名和密码了,这个时候输入gitlab的用户名和密码即可。
  • 如果有其他合作人员共同使用这个私有Spec Repo的话在他有对应Git仓库的权限的前提下执行相同的命令添加这个Spec Repo即可。

二、创建私有库

1. 创建本地私有库

pod lib create 私有库名字:创建私有库的标准格式,会使用git-template默认的模板创建私有库
pod lib create TestPod
还可以通过--template-url参数,指定我们自己的私有库模板地 址
pod lib create --verbose --template-url='https://git.dev.tencent.com/hxl1010/TestGitTemplate.git' TestPod

按照提示,输入对应配置:

➜  Project pod lib create TestPod
Cloning `https://github.com/CocoaPods/pod-template.git` into `TestPod`.
Configuring TestPod template.
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.

------------------------------

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: 
 - https://guides.cocoapods.org/making/using-pod-lib-create.html
 ( hold cmd and double click links to open in a browser. )


What platform do you want to use?? [ iOS / macOS ]
 > iOS

What language do you want to use?? [ Swift / ObjC ]
 > Swift

Would you like to include a demo application with your library? [ Yes / No ]
 > Yes

Which testing frameworks will you use? [ Quick / None ]
 > None

Would you like to do view based testing? [ Yes / No ]
 > No
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.

Running pod install on your new library.

Analyzing dependencies
Downloading dependencies
Installing TestPod (0.1.0)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `TestPod.xcworkspace` for this project from now on.
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

[!] Automatically assigning platform `iOS` with version `9.3` on target `TestPod_Example` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.

 Ace! you're ready to go!
 We will start you off by opening your project in Xcode
  open 'TestPod/Example/TestPod.xcworkspace'

To learn more about the template see `https://github.com/CocoaPods/pod-template.git`.
To learn more about creating a new pod, see `https://guides.cocoapods.org/making/making-a-cocoapod`.

2. 在GitHub或Gitlab等上创建远端仓库

3. 将本地私有库关联到远端库

在私有库主目录下执行如下命令:

git remote add origin https://git.dev.tencent.com/hxl1010/TestPod.git

4. 编写私有库代码并提交

4.1 修改TestPod.podspec文件

版本号(s.version)、简介(s.summary)、描述(s.description),如果依赖其他库则在s.dependency中添加依赖的第三方库或私有库,添加完依赖库以后需要在Example目录下执行pod update

Pod::Spec.new do |s|
  //名称,pod search 搜索的关键词,注意这里一定要和.podspec的名称一样
  s.name             = 'TestPod'
  //版本号,每一个版本对应一个tag
  s.version          = '0.1.0'
  s.summary          = '这里是私有库摘要'

  s.description      = <<-DESC
这里是私有库描述说明
                       DESC

  //项目主页地址
  s.homepage         = 'https://git.dev.tencent.com/hxl1010/TestPod'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  //许可证
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  //作者
  s.author           = { 'HXL' => 'cquhxl@163.com' }
  //项目仓库地址
  s.source           = { :git => 'https://git.dev.tencent.com/hxl1010/TestPod.git', :tag => s.version.to_s }
  //社交网址
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '8.0'

  //源文件路径
  s.source_files = 'TestPod/Classes/**/*'
  
  //资源文件路径
  # s.resource_bundles = {
  #   'TestPod' => ['TestPod/Assets/*.png']
  # }

  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
  //依赖库
  # s.dependency 'AFNetworking', '~> 2.3'
end
“*” 表示匹配所有文件
“**” 表示匹配所有子目录

4.2 编写代码

私有库源码建议放在 TestPod/TestPod/Classes中

4.3 提交代码

方法1:可通过SourceTree等工具提交代码并设置tag;
方法2:在项目根目录下通过终端提交

git add .
git commit -s -m "初始化项目"
git remote add origin https://git.dev.tencent.com/hxl1010/TestPod.git
git push origin master
git tag -m "第一版" 0.1.0
git push --tags

备注:

  • tag要和在podspec中s.version保持一致,cocoapods内部会根据version去查找仓库中的tag进行匹配。

5. 校验私有库

在上传spec文件前我们可以做一个验证来节省时间。如果不先本地验证,直接远程验证,比较费时。在项目根目录下执行:

5.1 验证本地podspec文件

本地验证不会验证 s.source 中的tag
如果是公有库,只需要此命令即可
pod lib lint

如果该项目依赖其他私有库,需要添加私有仓库地址,通过--sources指定私有仓库地址
pod lib lint --sources='https://git.dev.tencent.com/hxl1010/TestSpec.git,https://github.com/CocoaPods/Specs'

5.2 验证远程podspec

远程验证会验证 s.source 中的tag,如果此时没有打上相应的标签则会报错
pod spec lint

如果依赖的库有私有库,需要加上私有库的地址
pod spec lint --sources=https://git.dev.tencent.com/hxl1010/TestSpec.git,https://github.com/CocoaPods/Specs.git

备注:

  • pod spec lint相对于pod lib lint会更为精确,后者相当于只验证一个本地仓库,前者会同时验证本地仓库和远程仓库。
  • 当代码里有警告时会验证失败,可通过参数--allow-warnings允许存在警告。

6. 发布私有库

如果私有库还依赖于其他的私有库,可以通过 --sources 来指定所有私有库的地址,这一点和"校验私有库"中的 --sources是一致的。
pod repo push TestSpec TestPod.podspec --sources='https://git.dev.tencent.com/hxl1010/TestSpec.git,https://github.com/CocoaPods/Specs'

终端中发布命令执行成功后:

➜  TestPod git:(master) pod repo push TestSpec TestPod.podspec --sources='https://git.dev.tencent.com/hxl1010/TestSpec.git,https://github.com/CocoaPods/Specs' --allow-warnings

Validating spec
 -> TestPod (0.1.0)
    - WARN  | [iOS] swift: The validator used Swift `4.0` by default because no Swift version was specified. To specify a Swift version during validation, add the `swift_versions` attribute in your podspec. Note that usage of a `.swift-version` file is now deprecated.
    - NOTE  | xcodebuild:  note: Using new build system
    - NOTE  | [iOS] xcodebuild:  note: Planning build
    - NOTE  | [iOS] xcodebuild:  note: Constructing build description
    - NOTE  | [iOS] xcodebuild:  warning: Skipping code signing because the target does not have an Info.plist file and one is not being generated automatically. (in target 'App' from project 'App')

Updating the `TestSpec' repo

Adding the spec to the `TestSpec' repo

 - [Add] TestPod (0.1.0)

Pushing the `TestSpec' repo

三、测试集成

在需要集成私有库的Podfile文件最顶部添加如下描述,然后执行pod install

platform :ios, '10.0'

source 'https://github.com/CocoaPods/Specs.git'
source 'https://git.dev.tencent.com/hxl1010/TestSpec.git' //增加该行是为了保证公有库的正常使用

use_frameworks!

target 'Test' do
    pod 'TestPod'
    pod 'DebugTool'
end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容