组件化过程中遇到的问题

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的速度你懂的。 更换官方源



作者:雷侯塞利
链接:https://www.jianshu.com/p/1e5927eeb341
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
 

补充

组件化---命令行报错[!] The repo `XXX` at `../../../../.cocoapods/repos/XXX` is not clean

在提交本地podspec到远程私有索引库YHTestOneSpecGroup时,执行pod repo push YHTestOneSpecGroup YHTestBaseFive.podspec --allow-warnings命令时报错:

[!] The repo `YHTestOneSpecGroup` at `../../../../.cocoapods/repos/YHTestOneSpecGroup` is not clean

解决方法:

1》移除本地私有索引库:pod repo remove YHTestOneSpecGroup

2》添加本地私有索引库:pod repo add YHTestOneSpecGroup https://gitee.com/denggun/YHTestOneSpecGroup.git

3》添加本地podspec文件到远程私有索引库即可:pod repo push YHTestOneSpecGroup YHTestBaseFive.podspec --allow-warnings

 

已经提交私有库,但是本地pod search 报错

Unable to find a pod with name, author, summary, or description matching `ZYBUIKit`
删除~/Library/Caches/CocoaPods目录下的search_index.json文件
  • pod setup成功后,依然不能pod search,是因为之前你执行pod search生成了search_index.json,此时需要删掉。
  • 终端输入:rm ~/Library/Caches/CocoaPods/search_index.json
  • 删除成功后,再执行pod search
 

件化---为私有库添加依赖库

场景描述:创建一个私有远程库名为YHTestFive,这个库依赖于两个远程仓库,一个是我自己创建的码云上的私有仓库YHTestBaseFive;另一个是SDWebImage;

按正常的顺序https://blog.csdn.net/denggun12345/article/details/84989492将YHTestFive设置为远程私有库,需要注意以下几点:

1》podspec文件要加一项s.dependency,因为是两个依赖,所以:

    s.dependency 'SDWebImage'

    s.dependency 'YHTestBaseFive', '~> 0.0.1'

2》在进行验证时(这里省略了本地验证,直接进行远程验证,一定保证远程库与本地库一致即使最新的)

    2.1》 pod spec lint 命令报错:

  unknown: Encountered an unknown error (Unable to find a specification for `YHTestBaseFive (~> 0.0.1)` depended upon by `YHTestFive`) during validation.

 即找不到YHTestBaseFive依赖,加上sources源:

    2.2》pod spec lint --sources=https://gitee.com/denggun/YHTestOneSpecGroup再进行远程验证报错如下:

    unknown: Encountered an unknown error (Unable to find a specification for `SDWebImage` depended upon by `YHTestFive`)  during validation.

即找不到SDWebImage依赖。

    2.3》因此当用到除github上的库依赖时,在进行远程验证的时候要把所有的索引源都带上:

pod spec lint --sources=https://gitee.com/denggun/YHTestOneSpecGroup,https://github.com/CocoaPods/Specs

依旧报错:

 - ERROR | [iOS] xcodebuild:  /Users/yangyangzi/Library/Developer/Xcode/DerivedData/App-arojmcwuuhggqpbgfwsrthkrhcuy/Build/Products/Release-iphonesimulator/YHTestFive/YHTestFive.framework/Headers/YHTestFiveTableViewController.h:9:9: error: include of non-modular header inside framework module 'YHTestFive.YHTestFiveTableViewController': '/Users/yangyangzi/Library/Developer/Xcode/DerivedData/App-arojmcwuuhggqpbgfwsrthkrhcuy/Build/Products/Release-iphonesimulator/YHTestBaseFive/YHTestBaseFive.framework/Headers/YHTestFiveBaseViewController.h' [-Werror,-Wnon-modular-include-in-framework-module]

- NOTE  | [iOS] xcodebuild:  /var/folders/q3/ws9tz6jd1zxg1_vfprx8tvnh0000gn/T/CocoaPods-Lint-20181219-15486-1ezxmyl-YHTestFive/App/main.m:3:9: fatal error: could not build module 'YHTestFive'

大意是:不能在在.h文件中#import了其他私有库文件(YHTestFiveTableViewController.h引入了#import "YHTestFiveBaseViewController.h”,而YHTestFiveBaseViewController是YHTestFiveTableViewController的父类)

有的文章也提到在.h文件中不能import引入依赖库的文件,可以通过@class的方式引入,但是由于这里进入的是父类,@class实现不了故

修改podspec文件加上一句修改配置:

s.user_target_xcconfig = { 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES' }

   2.4》pod spec lint --sources=https://gitee.com/denggun/YHTestOneSpecGroup,https://github.com/CocoaPods/Specs  执行此命令后发现只剩下警告了

3》在建立关联将YHTestFive.podspec提交到远程索引库时也需要加上索引源--sources

pod repo push YHTestOneSpecGroup YHTestFive.podspec --sources=https://gitee.com/denggun/YHTestOneSpecGroup,https://github.com/CocoaPods/Specs --allow-warnings

 
 
 
posted @ 2019-03-31 12:45  yuhui.Mr  阅读(806)  评论(0)    收藏  举报