美文网首页iOS开发
iOS pod组件化采坑记录

iOS pod组件化采坑记录

作者: BlackStar暗星 | 来源:发表于2019-03-12 17:54 被阅读3次

最近在做利用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           = { 'blackstar_lang@163.com' => 'langzq@sqbj.com' }
  s.source           = { :git => 'https://xxx/ios-common-kit.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  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不起作用,我们需要设置组件的调试编译策略

image.png
有关编译策略 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的问题,但是因为开发组件时遇到的,就也记下来了)

相关文章

  • iOS pod组件化采坑记录

    最近在做利用pod进行组件化重构,哇塞,那叫一个难受,一个小问题可能就卡很久,光靠自己琢磨是真费事,没办法。。。只...

  • iOS pod组件化踩坑记录

    1、pod repo push的时候可能报错,说找不到分支,这个问题挺有意思的,我们自己搭建的gitlab服务器,...

  • 组件化

    iOS组件化避坑心得[https://juejin.cn/post/7056780884925480967]iOS...

  • iOS pod组件化

    众所周知 当一个app项目足够大时 每个功能点细分出来 可以分成多个子app 例如美团 则是由 美团外卖 猫眼电影...

  • ios pod组件化

    众所周知 当一个app项目足够大时 每个功能点细分出来 可以分成多个子app 例如美团 则是由 美团外卖 猫眼电影...

  • 掌上链家iOS组件化(总结)

    掌上链家iOS组件化 组件化目标 我们组件化的目标就是每一个组件都是一个私有的仓库,都是一个pod,壳工程用的时候...

  • 如何制作一个CocoaPods私有库

    最近在学习组件化相关的知识,也准备写个项目练练手。iOS组件化的实现是利用CocoaPods制作Pod库,主工程分...

  • iOS采坑记录

    采坑记录 iOS 通过 Webview点击下载链接问题 Webview点击下载链接,需要通过文件名下载文件,需要通...

  • iOS组件化

    iOS组件化 iOS组件化

  • iOS组件化

    iOS组件化 安装git和cocoapods 1、创建一个组健库,也就是要编写的组件,用下面的命令: pod ...

网友评论

    本文标题:iOS pod组件化采坑记录

    本文链接:https://www.haomeiwen.com/subject/vmwnpqtx.html