0%

创建自己的私有pod库

步骤一:创建私有的pod索引仓库:

  1. 在公司的git服务器上创建私有远程索引仓库。克隆地址。

如:http://gitlab.yuwantech.com/clientgroup/ioslibrarygroup/jhchainableanimationsspec

  1. 新建pod spec索引仓库(将私有的远程仓库copy到本地)。命令如下:

pod repo add LibraryPodSpecs http://gitlab.yuwantech.com/clientgroup/ioslibrarygroup/jhchainableanimationsspec

LibraryPodSpecs:为pod spec索引仓库名称

  1. 执行完毕后,在目录:/Users/admin/.cocoapods/repos 下会多出来一个TestPodSpecs文件夹,可使用pod repo命令查看。如下:
    至此,私有远程索引仓库LibraryPodSpecs生成完成

步骤二:创建私有组件库:

  1. 在公司的 git 服务器上面创建 组件 的 git 远程仓库,克隆地址是:http://gitlab.yuwantech.com/clientgroup/ioslibrarygroup/jhchainableanimations

  2. 创建私有的pod组件库(如JHChainableAnimations动画组件),执行如下命令:pod lib create JHChainableAnimations。过程中需要填一些选项,按需选择即可。如下:

1
2
3
4
5
6
1. 什么平台? iOS
2. 什么语言? ObjC
3. 是否集成Demo为自己的模块库? Yes
4. 是否集成测试框架? None
5. 是否基于View的做测试? No
6. 工程类前缀? YW
  1. 删除ReplaceMe文件,将需要封装的文件(如网络组件相关文件)复制到PrivatePermissionTools/PrivatePermissionTools/Classes中。如下:将LeelenNetworkManager复制到Classes中。(注意:需要cd到Example文件下 然后更新 pod update –no-repo-update)

  2. 修改 JHChainableAnimations.podspec 文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#
# Be sure to run `pod lib lint JHChainableAnimations.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
s.name = 'JHChainableAnimations'
s.version = '1.0.1'
s.summary = 'A short description of JHChainableAnimations.'

# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
# * Try to keep it short, snappy and to the point.
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!

s.description = <<-DESC
TODO: Add long description of the pod here.
DESC

s.homepage = 'http://58.132.214.153:10088/clientgroup/ioslibrarygroup/jhchainableanimations'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'ysc' => '15238280098@163.com' }
s.source = { :git => 'http://gitlab.yuwantech.com/clientgroup/ioslibrarygroup/jhchainableanimations.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

s.ios.deployment_target = '9.0'

s.source_files = 'JHChainableAnimations/Classes/**/*'

# s.resource_bundles = {
# 'JHChainableAnimations' => ['JHChainableAnimations/Assets/*.png']
# }

# s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 2.3'
end
  1. 校验本地索引文件 JHChainableAnimations.podspec

cd到PrivatePermissionTools.podspec所在文件夹下,执行pod lib lint –allow-warnings,该命令是检查本地索引文件是否符合推送规则。成功了会打印PrivatePermissionTools.podspec passed validation。如下:

10000

pod lib lint参数解析:

–sources:需要引⽤的spec,默认只依赖master,如果当前pod依赖了私有库,需要将其对应的spec包含进来,不然会报找不到对应库的问题。参数可以是本地spec的名称,也可以是git地址。

–allow-warnings:有警告会通过不了,如果警告是⽆关紧要的,可以加上,让检测通过。

–verbose:打印详细的检验过程

–use-libraries:⼯程或者依赖⾥⾯了静态库(*.a⽂件)或者是framework

备注:

pod lib lint 表示在本地校验索引文件

pod spec lint 表示在本地和远程都校验索引文件

6、将JHChainableAnimations本地组件库与远程的仓库git关联起来

10001

  1. 上传 JHChainableAnimations.podspec 索引文件到我们的私有远程索引仓库 LibraryPodSpecs,命令如下:(进入到JHChainableAnimations.podspec目录)

pod repo push LibraryPodSpecs JHChainableAnimations.podspec --allow-warnings

上面命令对 JHChainableAnimations.podspec 文件做了两个操作:一个是将其推送到私有的远程索引仓库,可以去公司的 git 上面 LibraryPodSpecs 索引仓库中查看;另一个是将其 copy 到私有的本地索引仓库,这个可以去目录:/Users/admin/.cocoapods/repos/TestPodSpecs 下查看到。

至此私有的组件库JHChainableAnimations就创建完成了,可以在终端执行 pod search JHChainableAnimations来查询它。

使用:

pod 'JHChainableAnimations', :git => "http://gitlab.yuwantech.com/clientgroup/ioslibrarygroup/jhchainableanimations.git", :tag => '1.0.1'

注意事项

  • 操作的时候,先cd到对应的文件夹下

  • 注意操作顺序

    • 在develop分支开发、修改JHChainableAnimations代码,修改 JHChainableAnimations.podspec版本号,提交。
    • 将develop分支合并到master。
    • 在master打tag(如:1.0.1),注意这边的tag应与 JHChainableAnimations.podspec中的s.version 版本号一致。
    • 远程私有库的更新:(cd 到本地仓库的位置,执行以下操作)

一、更新远程仓库

  1. 代码更新

10002

  1. 版本更新(版本更新 这一步非常重要,为更新索引库做准备)

10003

版本升级

查看远程仓库,标签数已经有2个了,点进去就可以看到0.2.0,这里我们就不去看了

10004

二、修改描述文件并更新索引库

  1. 修改Sepc

10005

2.验证远程Spec

cd到xxxx.podspec所在文件夹下,执行pod lib lint –allow-warnings

3.更新索引库

pod repo push 索引库名称 xxx.podspec –allow-warnings

10006

依赖第三方库:

当我们的私有库需要依赖其它第三方才可以正常使用时,我们就需要在spec文件中开启依赖,例如下面所示代码,表明当前仓库需要依赖AFN和SDWebImage

s.dependency ‘AFNetworking’, ‘~> 3.2.0’

s.dependency ‘SDWebImage’, ‘~> 4.3.3’

问题:但是这里存在一个问题,如果来了一位新的小伙伴,他所负责的部分只需要LXFBase下的Category,而LXFBase下的Cache才需要依赖SDWebImage,此时他若是pod一整个LXFBase岂不是平白无故安装了第三方依赖库,那应该怎么做呢?

答案:方案就是可以通过子库Subspecs来解决因需要一个小小的工具而依赖整个基础组件的问题

子库Subspecs:

什么是Subspecs?这里我们可以搜索一下SDWebImage。

10007

Subspecs:

可以看到,如果我们只需要用到SDWebImage中的GIF功能,那么并不需要将整个SDWebImage都下载下来,在Podfile中将pod ‘SDWebImage’ 改为 pod SDWebImage/GIF即可单独使用这一功能

那接下来我们就来看看怎么描述一个子库吧

子库格式:

10008

因为这里已经分离出子库了,所以s.source_files和s.dependency就不能这么使用了,需要我们在子库里分别指定,所以我们直接把原来的s.source_files和s.dependency都注释掉。写法参考如下:

10009

修改后再按之前的步骤更新索引库和组件库就可以了。

ps: 在添加第三方依赖描述后做验证或者上传操作可能会很慢,因为它在克隆第三方库如SDWebImage,有兴趣的可以在命令后面加入–verbose来查看详情情况

10010

使用子库:

10011

组件库中带有图片资源:

  1. 将LoginImage文件夹放入/LeelenNetwork/Assets中,其中LoginImage文件夹内有login_logo@2x.png图片;

  2. 修改LeelenNetwork.podspec索引文件

10012

  1. 修改完spec索引文件之后,执行pod lib lint –allow-warnings检查本地索引文件是否符合推送规则。校验没问题后,SourceTree提交代码,打tag(tag注意与LeelenNetwork.podspec文件内的s.version一致)。执行pod repo push LeelenIotPodSpecs LeelenNetwork.podspec –allow-warnings操作,上传 LeelenNetwork.podspec 索引文件到我们的私有远程索引仓库 LeelenIotPodSpecs。

  2. 修改工程中的Podfile文件,cd到工程Podfile文件所在位置,执行pod install

  3. pod install成功后,可以看到工程中多了一个Resources文件夹,里面有login_logo@2x.png图片,路径如下:Pods/LeelenNetwork/LeelenNetwork/Assets/LoginImage/login_logo@2x.png。以及Products文件夹下多了一个NetworkLog.bundle,查看包内容,发现里面也有login_logo@2x.png图片。

  4. 使用时,先拿到最外面的bundle,然后再去找下面指定名字的bundle对象,再搜索具体资源。如下:

1
2
3
4
5
6
7
NSBundle * currentBundle = [NSBundle bundleForClass:self.class];

NSURL * bundleURL = [currentBundle URLForResource:@"NetworkLog" withExtension:@"bundle"];

NSBundle * resourceBundle = [NSBundle bundleWithURL:bundleURL];

UIImage * logoIcon = [UIImage imageNamed:@"login_logo" inBundle:resourceBundle compatibleWithTraitCollection:nil];
叶世昌 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!