美文网首页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组件化采坑记录

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