目前项目组件化已经告一段落,我把总结的相关文章列罗出来
创建cocoapod私有库详细步骤(基础组件组件化)
iOS组件化方案与实践:Target-Action
iOS组件化解决图片显示问题
xib文件如何组件化(cocoapod私有库)?
适合小白的iOS项目组件化完整详细流程,每步都有demo
pod trunk push使用
iOS项目组件化遇到的问题及解决(100%遇得到)
Cocoapods 更新索引库或者指定第三方
组件化demo
1、 新建一个组件时,如果依赖其他组件,例如:AFNetworking,自己建的组件的话,就需要在podspec最后加上依赖:
2、每次在验证索引文件时,podspec中的版本号必须和提交代码时候打的tag一致,不然验证不通过。
PS:注意,千万不要删除旧标签,然后再重新打这个旧标签,这样依然不行。
3、在主工程中pod 一个私有组件时,会报:
Unable to find a specification for 组件名
这是因为如果不指定,默认会从master的索引库查找,这样就会报找不到组件,因此需要在Podfile中指定组件远程索引库地址。
解决方案:
source '[https://github.com/wgModularization/WGModulSpecs.git](https://github.com/wgModularization/WGModulSpecs.git)’(这个是自己建立的索引库,你要用自己的索引库)
source '[https://github.com/CocoaPods/Specs.git](https://github.com/CocoaPods/Specs.git)’
4、通过pod spec lint --verbose --allow-warnings 命令验证podspec索引文件 时可能汇报下图错误:
报这个错的原因是校验podspec文件时默认只会到官方specs库(https://github.com/CocoaPods/Specs.git)去校验,需要同时指定自己创建的远程索引库地址库校验。
解决方案:(注意后面拼的还是要自己的索引库,不要直接粘贴我的)
pod spec lint --verbose --allow-warnings --sources='[https://github.com/CocoaPods/Specs.git,https://github.com/wgModularization/WGModulSpecs.git](https://github.com/CocoaPods/Specs.自己的索引库)'
5、如果私有cocoapods库中用到了CommonCrypto
验证的的时候会报错:
Include of non-modular header inside framework module
加上--use-libraries就可以了:
验证
pod spec lint --verbose --allow-warnings --use-libraries
上传
pod repo push HuModularizationSpecs xxx.podspec --verbose --allow-warnings --use-libraries
6、既有私有库依赖,还有CommonCrypto这种的依赖:
验证
pod spec lint --verbose --allow-warnings --use-libraries --sources='[https://github.com/CocoaPods/Specs.git,git@gitlab.317hu.com:HuModularizationLibrary/HuModularizationSpecs.git](https://github.com/CocoaPods/Specs.git,git@gitlab.317hu.com:HuModularizationLibrary/HuModularizationSpecs.git)’
提交:
pod repo push HuModularizationSpecs HuThirdKit.podspec --verbose --allow-warnings --use-libraries --sources='[https://github.com/CocoaPods/Specs.git,git@gitlab.317hu.com:HuModularizationLibrary/HuModularizationSpecs.git](https://github.com/CocoaPods/Specs.git,git@gitlab.317hu.com:HuModularizationLibrary/HuModularizationSpecs.git)'
7、私有库目录分层实现:
在pod进HuThirdKit组件后,我想实现上图这种目录效果:有个头文件(HuFileCJTest.h)里面导入该组件的头文件、四个文件夹,每个文件夹下包含对应的文件。
需要做的是修改podspec索引文件:
8、一个组件中如果存在一个文件夹文件需要依赖另一个文件夹下的文件
如图,HSDownloadManager文件夹下HSDownloadManager依赖MD5文件夹下NSString+MD5.h文件
在验证的时候会报错,NSString+MD5.h找不到。
解决:
注意:依赖的时候写的路径并不是真是的物理路径,而是层及路径:例如上图
ss.dependency 'HuThirdKit/MD5'
假如:MD5的真实物理路径是HuThirdKit/util/aaa/Md5,也要写成ss.dependency 'HuThirdKit/MD5'这种。
目前还在对项目做组件化,后面遇到问题再更新!!!
9、 如果组件中含有静态库.a 则需要添加下面代码:
s.vendored_libraries = 'HuSpecialThirtKit/Classes/BaiDuPush/*.a'
注意:等号右边要写你自己的路径:下图是我代码的路径
10、如果组件报如下错误
说明你本地的索引库并不是最新的,需要执行
先执行
pod repo update
再执行
pod install
如果你知道需要更新某个索引库,可以执行:
pod repo update 索引库名称
11、如下错误
这个错误是因为循环引用造成的,这个循环引用产生的情况是:A组件依赖B组件,然后B组件又依赖A组件。
这种错误的解决方案是:
. 如果是基础组件:则要是这两个组件不要产生耦合。
. 如果是业务组件:就需要通过target-action方案解决组件之间的相互调用,不要依赖。
目前还在对项目做组件化,后面遇到问题再更新!!!
12、组件化时,在同一个组件中报如下错误(其实是有的)
是因为:下图标红文件夹下是空的
解决:可以手动加入头文件
13、如下错误
原因:未找到protoc:命令
解决:执行下面代码:
$ brew install protobuf
14、拆分的时候,直接拉到每个组件里的时候,组件新建类似于主工程pch文件的方法:
这个是怎么来的呢?或者说为什么这么做?
我们在podspec文件中添加下面代码,然后执行pod install得到的
15、组件中遇到这个错误:明明在finder中是存在的,但是就是报下面错误
解决办法:
这是个包含该组件所有头文件的head文件,在制作这个head文件时,必须做分层,在podspec文件中修改如下:
s.source_files = 'HuCategoryKit/Classes/*'
s.public_header_files = 'HuCategoryKit/Classes/*.h'
s.subspec 'Category' do |ss|
ss.source_files = 'HuCategoryKit/Classes/Category/**/*'
end
这是我的spec文件,可参考,具体怎么做文件分层,在这篇文章第7条。
16、同一组件中,多及目录下,不同文件夹依赖问题
解决:(组件名/统一父文件件名字/依赖的文件所在文件夹名字)
17、同一组件中,做目录分级时遇到这两个错误:
- ERROR | [HuCommonUIKit/HuCommonUI,HuCommonUIKit/HuCommonUI/HuTableViewExtend] file patterns: The `source_files` pattern did not match any file.
- ERROR | [HuCommonUIKit/HuCommonUI/HuTableViewExtend, HuCommonUIKit/HuCommonUI/HuTableViewExtend/VIewBase, HuCommonUIKit/HuCommonUI/ViewControllers, and more...] xcodebuild: Returned an unsuccessful exit code.
原因:这是因为在不同文件夹中,存在依赖关系,在做目录分层的时候一定要写依赖关系,可参考(本文第8条和第16条)
解决:
这里我先给出做一层目录分层代码:
注意:
在做更深层次目录分层时,如果文件夹下只有子文件夹,没有文件,
例如实现如下图左边效果:
要实现上图效果,在更深层次分层时一定不要写这一句
ss.source_files = 'HuCommonUIKit/Classes/HuTableViewExtend/*'
不然还会报如下错误:
The source_files
pattern did not match any file.
正确的配置为:
18、Could not build module 'HuCategoryKit'
原因:
这句话虽然是在swift中用的,但是导致项目目录中Headers下为空,程序编译失败
解决:
删除 use_frameworks! 就好了。
19、- ERROR | [HuUtilsKit/HuUtils] xcodebuild: HuUtilsKit/HuUtilsKit/Classes/HuUtils/HuControllerId.m:196:44: error: too many arguments to function call, expected 0, have 2
原因:必须先定义原型才可以使用
20、一个组件在配置prefix_header_contents头文件时,是有顺序要求的,不然回报头文件找不到。
例如我下面配置,HuCommonUIKit是依赖MJExtension的,如果把两者顺调换的话,这个在配置的组件就会报mjvalue错误
s.prefix_header_contents = '#import <HuConfigsKit/HuConfigsHeader.h>','#import <HuCategoryKit/HuCategoryHead.h>','#import <HuUtilsKit/HuUtilsHeader.h>','#import <HuNetKit/HuNetHeader.h>','#import <MJExtension/MJExtension.h>','#import <HuCommonUIKit/HuCommonUIHeader.h>'
21、组件化之后,在主工程调试组件中的代码发现,断点显示变量全是nil
解决:
打开Xcode 的Build Setting 搜索 optimization
修改Debug的对应选项 None[-O0]
但是,如果主工程设置了多个环境,例如sit、uat、dev,这样的话,还需要做下面一步
22 xcrun: error: unable to find utility "simctl", not a developer tool or in PATH
) during validation.
解决办法:
更新一个网友发现的错误
23 [!] /usr/local/bin/git -C /Users/huanghaipo/.cocoapods/repos/testSpecs pull Your configuration specifies to merge with the ref 'refs/heads/master' from the remote, but no such ref was fetched.
解决:在第一次创建这个testSpecs远程索引库的时候,这个仓库要有内容,例如下图,勾选readme,即可解决这个问题