Cocoapods使用私有库中遇到的坑

24 篇文章 0 订阅
144 
作者  雷侯塞利 
2017.01.14 10:12*  字数 1100  阅读 647 评论 9

以前使用Cocoapods时候就是简单的创建Podfile,然后执行pod install就完事。最近临近过年了空闲时间比较多就琢磨把项目中复用比较多的代码抽取出来然后用Cocoapods管理,算是迈开项目组件化的第一步。途中遇到若干坑,这里就总结下方便自己日后查看。

这里先给出简单使用私有库的教程链接:
Cocoapods 应用第二部分-私有库相关

1.pod lib lint 和 pod spec lint 命令的区别

pod lib lint是只从本地验证你的pod能否通过验证
pod spec lint是从本地和远程验证你的pod能否通过验证
我一般都是直接使用pod spec lint去验证pod有没有问题

2.私有pod的验证

使用pod spec lint去验证私有库能否通过验证时应该,应该要添加--sources选项,不然会出现找不到repo的错误

pod spec lint --sources='私有仓库repo地址,https://github.com/CocoaPods/Specs'

3.subspec

为了让自己的Pod被导入时显示出良好的文件层划分,subspec是必须的。
若subspec要依赖其它的subspec,则subspec的dependency后面接的不是目录路径,而是specA/specB这种spec关系

4.私有库引用私有库的问题

在私有库引用了私有库的情况下,在验证和推送私有库的情况下都要加上所有的资源地址,不然pod会默认从官方repo查询。

pod spec lint --sources='私有仓库repo地址,https://github.com/CocoaPods/Specs'
pod repo push 本地repo名 podspec名 --sources='私有仓库repo地址,https://github.com/CocoaPods/Specs'

5.引用自己或第三方的framework或.a文件时
在podsepc中应该这样写:

s.ios.vendored_frameworks = "xxx/**/*.framework"
s.ios.vendored_libraries = "xxx/**/*.a”

5.便捷地开发本地私有库

Cocoapods就提供了一个开发模式,其实操作起来也是非常简单的事情,就是将所谓的引用路径修改成本地路径即可。就是讲Podfile中的pod '库名', :path => '本地路径'即可。这样在通常的修改代码中是不需要执行pod update的,但是对于如果修改了目录结构(添加、删除或者移动文件文件)或者是修改了Podspec文件的配置的话,最好是运行一下pod update的命令。普通修改代码的情况下就不需要运行pod update命令和打tag了。
pod 'iOS-Test', :path => '../iOS-Test’

6.私有库中添加资源(图片、音视频等)

方法共有三种:

  • 第一种

    spec.resources = ["Images/*.png", "Sounds/*"]

    但是这些资源会在打包的时候直接拷贝的app的Bundle中,这样说不定会和其它资源产生命名冲突

  • 第二种

    spec.resource = "Resources/MYLibrary.bundle"

    把资源都放在bundle中,然后打包时候这个bundle会直接拷贝进app的mainBundle中。使用的时候在mainBundle中查找这个bundle然后再搜索具体资源

      NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"JZShare" withExtension:@"bundle"];
      NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
      UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];
  • 第三种
    spec.resource_bundles = {
    'MyLibrary' => ['Resources/*.png'],
    'OtherResources' => ['OtherResources/*.png']
    }
    这种方法利用 framework 的命名空间,有效防止了资源冲突。
    使用方法是先拿到最外面的 bundle,然后再去找下面指定名字 的 bundle 对象,再搜索具体资源
    NSBundle *bundle = [NSBundle bundleForClass:[MYSomeClass class]];
    NSURL *bundleURL = [bundle URLForResource:@"MyLibrary" withExtension:@"bundle"];
    NSBundle *resourceBundle = [NSBundle bundleWithURL: bundleURL];
    UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];

7.如果私有库添加了静态库或者dependency用了静态库

那么执行pod lib lint还有pod spec lint时候需要加上—user-libraries选项
否则会出现'The 'Pods' target has transitive dependencies错误

8.如果私有库只引用其他库的subspec

只需要依赖想依赖的subspec,不用管主spec(因为依赖subspec必然要依赖主spec)

9.私有库已经通过验证并传到私有repo也能通过pod search,但是就是pod install失败。

这时候只要执行pod update 然后去喝杯水就好了。。。(前提是你把官方源换成国内的,不然从github上更新官方repo的速度你懂的。 更换官方源

参考

 iOS技巧(原创)
登录  后发表评论
 
SnowCheng
2楼 · 2017.02.15 20:44

多谢, 解燃眉之急!

 
肆意二货_林霞
3楼 · 2017.03.01 10:45

spec.dependency依赖库,我在pod私有库的时候会不会下载下来?

雷侯塞利: 应该会下载下来吧 难道你的不会下载下来吗?

2017.03.09 16:34   回复
 
浅忆微凉iOS
4楼 · 2017.03.09 15:10

关于私有库的相互依赖有点问题想请教一下

雷侯塞利: @浅忆微凉iOS 什么问题? 看看能不能帮到你

2017.03.09 16:17   回复

雷侯塞利: https://github.com/CocoaPods/CocoaPods/issues/4921
How can i add the private dependency to podspec file?
在podspec中依赖私有repo

2017.03.09 16:35   回复

浅忆微凉iOS: 我是在podspec文件中添加私有库的依赖出现的问题,验证通不过,总是说找不到那个私有库的None of your spec sources contain a spec satisfying the dependency: `MYPlayerSDK (= 0.0.1) 
现在正在pod repo upde中,方便的话加一下qq吧

2017.03.10 10:47   回复
 
brownfeng
5楼 · 2017.03.14 10:44

资源那里很实用

 
brownfeng
6楼 · 2017.03.14 11:20

刚刚尝试了资源.那里的第三种方法,在pod的example中可行.但是如果使用pod package打包成x.framework,然后引入到工程项目中就不行. 将framework addtarget以后,可以看到只有Header文件夹引入了.而Resource文件夹并没有引入到工程,因此里面的bundle也没有引入.会导致crash.报错找不到bundle

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值