最近在做利用pod进行组件化重构,因为没什么经验,也是一边学着,一边做着,然后这里将我遇到的问题整理了下来
基础:如何发布一个pod组件
踩坑点 持续更新。。。
1、利用pod lib create 开发,添加podspec 的 resources,写法都对但是pod install后,图片资源在,就是不显示(不使用bundle方式调用图片)
解决:pod lib create 的 自动生成的 podfile 带有 use_frameworks!
删除即可 (使用bundle方式不需要删除use_frameworks!)
关于 use_frameworks! 点击传送门
s.resources = 'sqbj-common-kit/Assets/**/*.{png}'
若是不使用use_frameworks! 但是运行时发现报错,xxx.framework找不到,直接删除DerivedData或者Xcode->Product->clean
原因:use_frameworks\!打的是 lib.framework,不使用打的是 lib.a ,不使用use_frameworks也就是用.a,那么自然是需要清除framework缓存,来处理缓存给我们带来的系列问题
我们在使用和不使用use_frameworks!的两种情况下可以看Pods下的Products 文件夹,他里边就是依赖库经过pod自动生成的framework或者 lib.a 文件,我们在使用 use_frameworks! 的时候,这个文件夹下是 framework,反之是 lib.a
2、关于 subspec ,每一个 spec或subspec 都需要有一个 end 对应,并且 subspec 之间的相互引用需要做依赖,否则会报找不到文件,示例代码
Pod::Spec.new do |s|
s.name = 'sqbj-common-kit'
s.version = '0.0.1'
s.summary = '公共库'
s.description = <<-DESC
社区半径公共库
DESC
s.homepage = 'https://xxxt/ios-common-kit'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { '[email protected]' => '[email protected]' }
s.source = { :git => 'https://xxx/ios-common-kit.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/'
s.ios.deployment_target = '8.0'
s.resources = 'sqbj-common-kit/Assets/**/*.{png}'
s.subspec 'SQSystem' do |sss|
sss.source_files = 'sqbj-common-kit/Classes/SQSystem/*.{h,m}'
sss.public_header_files = 'sqbj-common-kit/Classes/SQSystem/*.h'
sss.dependency 'sqbj-common-kit/SQBaseObject'
end
s.subspec 'SQBaseUI' do |sss|
sss.source_files = 'sqbj-common-kit/Classes/SQBaseUI/*.{h,m}'
sss.public_header_files = 'sqbj-common-kit/Classes/SQBaseUI/*.h'
sss.dependency 'Masonry'
sss.dependency 'sqbj-common-kit/SQCategory'
sss.dependency 'sqbj-common-kit/SQBaseObject'
end
s.subspec 'SQBaseObject' do |sss|
sss.source_files = 'sqbj-common-kit/Classes/SQBaseObject/*.{h,m}'
sss.public_header_files = 'sqbj-common-kit/Classes/SQBaseObject/*.h'
sss.dependency 'YYModel'
end
s.subspec 'SQCategory' do |sss|
sss.source_files = 'sqbj-common-kit/Classes/SQCategory/*.{h,m}'
sss.public_header_files = 'sqbj-common-kit/Classes/SQCategory/*.h'
end
s.frameworks = 'UIKit', 'Foundation'
end
3、我们在pod install 后可能会出现 找不到文件的报错,退出此工程,重新打开即可(Xcode或者Cocoapods的 Bug,执行pod install 后不刷新 pod 库)
4、s.license 设置后,发布pod库报找不到LICENSE的警告,对于LICENSE可以使用 pod lib create 自动生成或者 我们在新建一个网络代码仓库可以直接创建LICENSE,这两个LICENSE是不会报警告的(我之前自己创建的LICENSE)
5、私有库和公共库 发布的组件一个名字,但是找组件的时候会优先找master的仓库,办法就是干掉master(不想用的仓库)上发的组件,可以delete 或者 deprecate(废弃) 某一版本(所有版本都干掉),千万别 移除自己仓库权限(remove-owner),找不回来,我命令弄错了,公共库组件一直占用我的名字,因为我命名都是规范-强制,就很难受,我就把本地master仓库中的组件podspec删了,这样就只能找我需要用的repo了
可能用到的命令
pod trunk me //查看我自己发布的公共库组件
pod repo //查看本地repo库
pod trunk delete 组件名称 版本号
pod trunk deprecate 组件名称 版本号
pod trunk info 组件名称 查看组件信息(发布时间,组件拥有人)
6、我们使用pod lib create 创建的项目,发现在pod下的组件断点debug不起作用,我们需要设置组件的调试编译策略
有关编译策略 Optimization Level 介绍点击 编译策略
7、pod spec lint common-kit.podspec 或者push发布组件库的时候报错找不到依赖库:
- ERROR | [iOS] unknown: Encountered an unknown error (Unable to find a specification for ` common-kit` depended upon by `login-kit`
原因:我的 login-kit 依赖于 common-kit ,但是 common-kit 是私有库组件,我们在podfile里可以声明source,但是podspec文件是不能声明依赖组件的代码地址库的,所以需要我们在lint或者push的时候加入source 声明
pod spec lint login-kit.podspec --sources='自己的私有库地址,https://github.com/CocoaPods/Specs' --allow-warnings
8、pod spec lint 的时候报错
[-Werror,-Wnon-modular-include-in-framework-module]
原因:没搞懂,大概就是组件引用相关问题
解决办法:在 pod spec lint 的时候加入参数 --use-libraries
pod spec lint sqbj-login-kit.podspec --sources='私有库地址,https://github.com/CocoaPods/Specs' --allow-warnings --use-libraries
9、在使用pod repo push 仓库地址 xxx.podspec 发布私有库的时候,为了方便,我们可以将repo远程仓库地址改成repo仓库名称,比如说,我的仓库地址是https://jlkdfjlasdjkdaejf.com 你能记得住吗,用起来多不方便,所以我们就可以这样做:
pod repo add 自定义仓库名称 仓库地址
然后我们发布私有库
pod repo push 自定义仓库名称 xxx.podspec
示例
pod repo push sqbj-ios login-kit.podspec --allow-warnings --use-libraries
10、pod repo push的时候可能报错,说找不到分支,这个问题挺有意思的,我们自己搭建的gitlab服务器,代码都在这托管,我创建了管理 podspec 的仓库(即创建一个project),然后我执行 pod repo add sqbj-ios 仓库地址,显示clone xxx。。。。,也就是说仓库已经克隆下来了,cd到这个repo仓库,显示分支master ,但是执行pod repo push 非说没分支,不能push 。我们在远端新建一个project 什么都不能看,是没有分支、提交信息的,我没办法,按理来说是有个默认的master分支的,但是非说我没有,很无奈,我就在远端直接创建了一个README,然后回到repo仓库,pull了一下,README下载下来了,然后回到代码工程目录,执行pod repo push 发现好了,很奇葩。
11、文件或图片导入后,发现后边显示 ?并且无法使用
解决办法:选中带问号的文件或文件夹,右键 -> Source Control -> add selected files (此问题跟pod没啥关系,应该是Xcode的问题,但是因为开发组件时遇到的,就也记下来了)