组件化过程及遇到的那些问题

先放两张在其他文章里看到的图片,清晰明了


屏幕快照 2018-06-05 上午10.46.22.png
屏幕快照 2018-06-06 上午11.20.01.png
1.创建远程索引库

什么是远程索引库?

每创建一个组件都会带有一个 xxx.podspec 的索引文件。专门用来存放这些索引文件的库就叫做索引库。
我们需要将这些索引文件上传到远程索引库才能保证其他的同事能够拿来用。

podspec:描述自己组件工程的代码目录和资源目录在哪,还有自己组件工程所依赖其他框架,到时候就会根据podspec的指引去引入自己的仓库代码

pod spec create spec文件名
这行命令我们知道即可,在使用pod管理的这个过程中,并不需要我们自己去创建podspec文件

2.创建本地索引库并关联远程索引库(本地添加私有索引库,如果是公有则不需要1和2这两步)

pod repo
解释: 查看当前有哪些本地索引库
pod repo add name url
解释:创建本地索引库,并和远程索引库做关联,name为本地索引库的名字,url为远程索引库的地址

本地索引库的物理地址为 ~/user/mxth/.cocoapods/repos/本地索引库名字

  • ???如何更改关联的远程索引库地址

???如何删除本地索引库:

cd .cocoapods
ls -a
sudo rm -r -f AnyKit  (删除AnyKit repo)

这个删除方式经测试不对,用下面的方式

pod repo list
pod repo remove PZResources
3.创建远程代码仓库
4.创建组件的本地代码库

pod lib create Name
解释:Name为组件名

5. 在Example目录下执行pod install 之后 build一下看看有无编译问题
6. 修改podspec中的相关信息
7.提交组件到远程代码库并打tag
//git add
git commit -m “xxx"
git remote add origin 远程代码仓库地址 //第一次操作即可
git push origin master
git tag 版本号 (注:这里的版本号必须和podspec里写的版本号一致)
git push --tags
  • 下面的2步,要cd到podspec目录下才可以,并且tag的版本号要和podspec文件中的s.version一致
8.验证podspec索引文件

pod spec lint --verbose --allow-warnings

若遇到错误,需要解决具体问题’pod spec lint’,则按照提示解决后,再继续验证

9.提交索引文件到远程索引库(私有)

pod repo push 本地索引库的名字 索引文件名 --verbose --allow-warnings

解释:索引文件名 后缀为.podspec 例如GJ-My.podspec

  • 公用组件则采用下面的方式:
    1)注册trunk
    pod trunk register EMAIL NAME
    之后去邮箱验证,验证之后,回到终端继续
    2)pod trunk push HttpManager.podspec --allow-warnings

这一过程中我遇到的那些问题:

  1. pod install后查看文件,发现HHCategory在工程文件导航目录中不存在,直接查看文件,实际存在,但细看文件,发现不是自己的库中的文件,串库了呢。 问题在哪里呢?

猜测1:分类重名 。
细看不是的,pod安装的这些文件名和我的文件名是不一致的

猜测2:pod 中组件名与他人一致。
于是删除本地HHCategory的repo库,然后pod search HHCategory,果然如此!重名啦!

  1. 多个组件可以共用同一个 本地索引库和远程索引库

  2. pod install 时, Unable to find a specification for HannahCategory depended upon by GJ-My

网上说需要清理当前pod目录
1 pod repo remove master
2 pod setup
尝试过后问题依旧。

若该组件可以公开使用,则可以使用trunk推送到共有库;
不然,可以在podfile文件中添加该库的远程索引库地址,顺带将公有的索引库地址也添加上。
因为pod install 默认是在公有的索引库中查找的

source 'https://github.com/HannahZheng/HannahRepo.git'
source 'https://github.com/CocoaPods/Specs.git'

此外还有一个警告,是因为当前模块适配的是iOS 8.0 ,而Podfile文件未指明系统平台版本
,因此在Podfile文件中添加

platform :ios, '8.0'
  1. pod search 自己的组件时,搜索不到?

~/Library/Caches/CocoaPods/search_index.json

删除该路径下的search_index.json文件后,重新search,就可以更新索引

  1. 自己创建的私有库组件给其他人使用时,要先在终端进行这个命令后,再pod install
    pod repo add name url

  2. 另一私有库B已经更新,但当前库 pod install后B仍是旧版本?

使用pod update就好。
也可以针对某一个模块更新

pod cache clean ServiceModule --all
pod update  PayModule —no-repo-update
  1. ERROR | [iOS] unknown: Encountered an unknown error (Unable to find a specification for HannahConfig depended upon by GJ-My) during validation.

终端校验时 添加source

pod lib lint --verbose --allow-warnings --sources='https://github.com/CocoaPods/Specs.git,https://gitlab.mxth-inc.com/zhenghan/MxthRepo.git'
    • ERROR | [iOS] file patterns: The resources pattern did not match any file.

最初我将图片资源放在新建的xcassets中,同时xcassets文件与Classes平级,路径是这么写的

s.resource = 'GJ-My/GJ-My.xcassets'

一直以为是自己的路径有问题,各种修改,各种尝试,验证依然通不过;还尝试了bundle,以及图片直接放在Assets文件夹中,路径各种修改,各种通不过,抓狂不?

最后在这里找到解决办法
https://stackoverflow.com/questions/43073261/error-ios-file-patterns-the-source-files-pattern-did-not-match-any-file

简单到我不敢相信,修改version就可以了。
因为在验证podspec这一步,会先从远程仓库下载最新代码,然后与文件中的设置项比对,一致则通过。

9.加载xib与加载图片

xib 字体文件等都属于resources 在podspec的resources中需要指明

xib加载,非组件化项目时,使用的是

[[NSBundle mainBundle] loadNibNamed:@“” owner:self options:nil].lasObject]

组件化中这样就加载不到了,需要略作调整

[[NSBundle bundleForClass:[self class]] loadNibNamed:@“” owner:self options:nil].lasObject]

图片加载 [UIImage imageNamed:@“图片名"] 默认是从mainBundle中去加载图片.

有以下两种方式:

NSBundle *bundle = [NSBundle  bundleForClass:[self class]];

方式一:

 [UIImage  imageNamed:@“图片名”  inBundle:bundle compatibleWithTraitCollection:nil];

方式二:

NSInteger scale = [UIScreen  mainScreen].scale;

  NSString *path = [bundle pathForResource:[NSString  stringWithFormat:@"图片名@%ldx.png",scale] ofType:nil inDirectory:@"bundle的包名"];

 [UIImage imageWithContentsOfFile:path]

10.subspec目录结构问题

当我们的库中文件较多时,希望有一个清晰的目录结构,这个时候subspec就上场了。

例如AFN这样的目录结构

屏幕快照 2018-06-08 下午3.11.17.png

写法也很简单,类似于


Pod::Spec.new do |s|

 s.name = 'RestKit'

 subspec 'Pinboard'  do |sp|

 sp.source_files = 'Classes/Pinboard'

end

end

这里有一个小的注意点,spec的source_files路径尽量不要包含subspec的文件路径,这样在其他人使用我们的库,查看时才会有清晰的目录结构,类似于AFN这样。同时subspec的文件夹的名字和subspec子模块的名字保持一致。

后续待更新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容