pod私有库的创建和使用

注:因为最近公司需求,本文为参考他人网上资源后进行的尝试,可能与多个网上资源重复

cocoapods的原理

  1. Pods 项目最终会编译成一个名为 libPods.a 的文件,主项目只需要依赖这个 .a 文件即可。
  2. 对于资源文件,CocoaPods 提供了一个名为 Pods-resources.sh 的 bash 脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。
  3. CocoaPods 通过一个名为 Pods.xcconfig 的文件来在编译时设置所有的依赖和参数。

工具依赖

➜  ~ nvm --version
0.31.3

➜  ~ ruby --version
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]

➜  ~ pod --version
1.2.1

➜  ~ git --version
git version 2.11.0 (Apple Git-81)

tip:本文跳过cocoapods安装

查看本地pod 仓库

本地已经有一个master库(安装pod后自动就会存在,官方的目录)
OFToolSpec是后来创建的一个私有库

Type:版本管理工具类型及分枝名
URL:git仓库地址
Path:本地仓库地址(在根目录下.cocoapods下)

➜  ~ pod repo

master
- Type: git (master)
- URL:  https://github.com/CocoaPods/Specs.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/master

OFToolSpec
- Type: git (master)
- URL:  https://git.coding.net/one_fools/OFToolRepo.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFToolSpec

2 repos

创建pod lib

在桌面创建PodPrivate文件,然后在终端进入PodPrivate文件并运行命令 pod lib create OFPublicTool创建私有库模版

➜  ~ cd Desktop 
➜  Desktop mkdir PodPrivate
➜  Desktop cd PodPrivate 
➜  PodPrivate ls
➜  PodPrivate pod lib create OFPublicTool

以下是配置选择,可以使用默认选项(带有下划线的选项,并且除了Prefix前缀设置,其他的不区分大小写)

  1. 工程语言
  1. 是否需要Demo
  2. 测试框架
  3. 是否需要view测试
  4. 工程前缀
//设置使用的语言
What language do you want to use?? [ Swift / ObjC ]
 > ObjC
//是否为library创建一个demo工程
Would you like to include a demo application with your library? [ Yes / No ]
 > 
yes
//使用的单元测试框架(具体请参看下方`单元测试`链接)
Which testing frameworks will you use? [ Specta / Kiwi / None ]
 > None
//使用UITest
Would you like to do view based testing? [ Yes / No ]
 > no
//你的项目中类的前缀
What is your class prefix?
 > OF

单元测试
然后会在当前目录生成 OFPublicTool 文件夹,并且会在Xcode中自动打开这个项目
注意可能会有一个警告提示

pod私有库的创建和使用_第1张图片
A86EECEC-4BF2-4789-BC58-558ADD701F17.png

打开 OFPublicTool/Example/OFPublicTool.xcworkspace 工程
删除此处的 ReplaceMe.m文件,在这里创建将要使用私有库管理的文件
pod私有库的创建和使用_第2张图片
C07AFF42-4781-4443-A45A-C4D1F016B948.png

如下:
pod私有库的创建和使用_第3张图片
F86C3A58-429A-4B39-9C7E-F05C8AAFB23B.png

然后修改此处的 OFPublicTool.podspec文件,下面标注必须修改的地方

pod私有库的创建和使用_第4张图片
05A1876C-4EE2-4B2B-B241-C39AD98AD3F4.png

创建git私有仓库(使用coding)

申请账号后创建Git私有仓库项目


pod私有库的创建和使用_第5张图片
BACDCF36-B34C-4F97-B7F2-86DFFB1ED4F2.png

之后需要在页面上获取的信息有


pod私有库的创建和使用_第6张图片
9C15D4BB-9BE8-4204-B8F2-559A344ACEEE.png

创建pod私有库

把相关的信息修改到 OFPublicTool.podspec
以下是我的修改

s.summary          = 'My PublicTool.'
s.homepage         = 'https://coding.net/u/one_fools/p/OFPublicTool'
s.source           = { :git => 'https://git.coding.net/one_fools/OFPublicTool.git', :tag => s.version.to_s }

之后进入 Example目录使用 pod update命令

➜  Example git:(master) ✗ pod update

发现有报错信息 The validator for Swift projects uses Swift 3.0 by default...

pod私有库的创建和使用_第7张图片
35FAF51B-C569-43C4-A7A4-32D56D281351.png

不过上面有写到 echo "2.3" > .swift-version
继续使用此命令,然后再来一次

➜  Example git:(master) ✗ echo "2.3" > .swift-version
➜  Example git:(master) ✗ pod update

安装成功后发现下面的警告并没有消失(暂时不管)
对项目进行 command + B构建一次应该会成功,然后在项目中 OFViewController.m 中引入

#import "OFPublicTool.h"

并对项目再次进行 command + B构建,若成功,说明 OFPublicTool.podspec 中的source_files路径是正确的

若是报错无法找到文件:

接下来用pod的命令检查一下此文件下的lib。
后退到podspec文件存在的目录下

➜  OFPublicTool git:(master) ✗ pod lib lint

 -> OFPublicTool (0.1.0)

OFPublicTool passed validation.

如果出现此处提示说明检查通过

pod spec lint命令检查一下远程的lib,现在没有提交到git私有仓库,一定会报错的

➜  OFPublicTool git:(master) ✗ pod spec lint

 -> OFPublicTool (0.1.0)
    - ERROR | [iOS] unknown: Encountered an unknown error ([!] /usr/bin/git clone https://git.coding.net/one_fools/OFPublicTool.git /var/folders/dr/688z508n1fb2m9bh9kqs5_ch0000gn/T/d20170520-7169-ee52z2 --template= --single-branch --depth 1 --branch 0.1.0

Cloning into '/var/folders/dr/688z508n1fb2m9bh9kqs5_ch0000gn/T/d20170520-7169-ee52z2'...
fatal: Remote branch 0.1.0 not found in upstream origin
) during validation.

Analyzed 1 podspec.

[!] The spec did not pass validation, due to 1 error.

发现报了一个错误,需要一个tag 0.1.0,下面将本地文件提交到git私有仓库并打一个0.1.0的tag

➜  OFPublicTool git:(master) ✗ git add .
➜  OFPublicTool git:(master) ✗ git commit -m"first commit"
➜  OFPublicTool git:(master) git remote add origin https://git.coding.net/one_fools/OFPublicTool.git
➜  OFPublicTool git:(master) git push origin master
➜  OFPublicTool git:(master) git tag -m"tag 0.1.0" 0.1.0
➜  OFPublicTool git:(master) git push --tags

git操作不再细述
上传成功之后再次用 pod spec lint命令检查一下远程的lib

➜  OFPublicTool git:(master) pod spec lint

 -> OFPublicTool (0.1.0)

Analyzed 1 podspec.

OFPublicTool.podspec passed validation.

➜  OFPublicTool git:(master) 

发现通过检查,这时候可以去私有仓库看一下会发现已经上传成功了

本地测试podspec文件

我们可以创建一个新的项目,在这个项目的Podfile文件中直接指定刚才创建编辑好的podspec文件,看是否可用。 在Podfile中我们可以这样编辑,有两种方式

platform :ios, '8.0'
 
target 'XDTestPod' do
  pod 'OFPublicTool', :path => '~/.cocoapods/repos/OFPublicToolSpec'      #指定路径
  pod 'OFPublicTool', :podspec => '~/.cocoapods/repos/OFPublicToolSpec/OFPublicTool.podspec'  #指定podspec文件
end

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

向Spec Repo提交podspec

但是现在还没完,接下来我们把podspec文件上传的我们自己的spec仓库里,而不是cocoapods的仓库。
下面我们创建本地仓库并把这个podspec文件上传进去

➜  OFPublicTool git:(master) pod repo
➜  OFPublicTool git:(master) pod repo add OFPublicToolSpec https://git.coding.net/one_fools/OFPublicTool.git
➜  OFPublicTool git:(master) pod repo

master
- Type: git (master)
- URL:  https://github.com/CocoaPods/Specs.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/master

OFPublicToolSpec
- Type: git (tags/0.1.0^0)
- URL:  https://git.coding.net/one_fools/OFPublicTool.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFPublicToolSpec

OFToolSpec
- Type: git (master)
- URL:  https://git.coding.net/one_fools/OFToolRepo.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFToolSpec

3 repos

然后上传

➜  OFPublicTool git:(master) pod repo push OFPublicToolSpec OFPublicTool.podspec 

Validating spec
 -> OFPublicTool (0.1.0)

Updating the `OFPublicToolSpec' repo

Already up-to-date.

Adding the spec to the `OFPublicToolSpec' repo

 - [Update] OFPublicTool (0.1.0)

Pushing the `OFPublicToolSpec' repo

To https://git.coding.net/one_fools/OFPublicTool.git
   8632a92..98f3d44  master -> master

上传成功

最后检验

➜  OFPublicTool git:(master) pod search OFPublicTool
Creating search index for spec repo 'OFPublicToolSpec'.. Done!
[!] Unable to find a pod with name, author, summary, or description matching `OFPublicTool`

发现报错,这是因为search index中缓存没有清理,再次搜索会等待一段时间

➜  OFPublicTool git:(master) rm ~/Library/Caches/CocoaPods/search_index.json
➜  OFPublicTool git:(master) pod search OFPublicTool

添加到Cocoapods的官方库

添加到Cocoapods的官方库,可以使用trunk工具,具体可以查看官方文档。

pod trunk register [email protected] 'Ec631292' ---verbose  #注册trunk,邮箱以及用户名请使用大家自己的。执行这个语句后,你的邮箱将会受到一封带有验证链接的邮件,如果没有请去垃圾箱找找,有可能被屏蔽了。点击邮件的链接就完成了trunk注册流程。
pod trunk me #如果终端显示了你的用户名和昵称,则说明注册成功。
pod trunk push OFPublicTool.podspec #通过trunk上传你的podspec文件,要cd到podspec文件所在目录执行

最后在一个新项目里引入使用,测试是否ok,只需要在项目的Podfile里增加以下一行代码即可

pod 'OFPublicTool', '~> 0.1.0'

注:每当你向Pod中添加了新的文件或者以后更新了podspec的版本都需要重新执行一遍pod update命令。

更新维护podspec

Pod::Spec.new do |s|
  s.name             = 'OFPublicTool'
  s.version          = '0.1.3'
  s.summary          = 'My PublicTool.'
  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'https://coding.net/u/one_fools/p/OFPublicTool'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'ECwlf' => '[email protected]' }
  s.source           = { :git => 'https://git.coding.net/one_fools/OFPublicTool.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/'

  s.ios.deployment_target = '8.0'

  s.subspec 'iCarousel' do |iCarousel|
    iCarousel.source_files = 'XDLibrary/Classes/iCarousel/**/*'
    iCarousel.public_header_files = 'XDLibrary/Classes/iCarousel/**/*.h'
  end

  s.subspec 'XDProgress' do |progress|
    progress.source_files = 'XDLibrary/Classes/XDProgress/**/*'
    progress.public_header_files = 'XDLibrary/Classes/XDProgress/**/*.h'
    progress.dependency 'MBProgressHUD', '~> 1.0.0'
  end

  # s.source_files = 'XDLibrary/Classes/**/*'
  
  # s.resource_bundles = {
  #   'XDLibrary' => ['XDLibrary/Assets/*.png']
  # }

  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
  # s.dependency 'AFNetworking', '~> 2.3'
end

因为我们创建了subspec所以项目整体的依赖dependency,源文件source_files,头文件public_header_files,资源文件resource等都移动到了各自的subspec中,每个subspec之间也可以有相互的依赖关系,比如XDProgress依赖于MBProgressHUD。不同的子模块之间还能互相依赖。

编辑完成之后,在测试项目里pod update一下,几个子项目都被加进项目工程了,写代码验证无误之后,就可以将这个工程push到远端仓库,并打上新的tag->1.0.0。
最后再次使用pod lib lint验证编辑好的podsepc文件,没有自身的WARNING或者ERROR之后,就可以再次提交到Spec Repo中了,命令跟之前是一样的

pod repo push OFPublicToolSpec OFPublicTool.podspec 

之后再次到~/.cocoapods/repos/OFPublicToolSpec目录下查看已经有两个版本了。

最后介绍一下如何删除一个私有Spec Repo,只需要执行一条命令即可

pod repo remove OFPublicToolSpec

这样这个Spec Repo就在本地删除了,我们还可以通过

 pod repo add OFPublicToolSpec https://git.coding.net/one_fools/OFPublicTool.git

再把它给加回来。
如果我们要删除私有Spec Repo下的某一个podspec怎么操作呢,此时无需借助Cocoapods,只需要cd到~/.cocoapods/repos/OFPublicToolSpec目录下,删掉库目录,然后在将Git的变动push到远端仓库即可.

你可能感兴趣的:(pod私有库的创建和使用)