Cocoapods流程及pod库的制作

作者: 强子ly | 来源:发表于2022-02-06 21:36 被阅读0次

    序:

    对于 Cocoapods,你是否还只知道 pod installpod update,有时候还会掺杂上 pod searchpod setup等,对于它的工作流程都不是很熟悉,又或许你在搞组件化,但是对于pod库的制作流程有些记不清,可以浏览浏览

    说来惭愧,2015年底参加工作的时候,我的小组长告诉我有一个管理第三方的工具,啥配置都不用管,拉下来就用,升级一个命令就行...

    离职之后在另外两家公司都没有使用,我对 Cocoapods 的感觉,好像什么都知道,又好像什么都不知道,跳槽到58后发现这边在搞组件化用到了,重新整理一下

    目录

    • 一、Cocopods流程及使用
    • 二、pod库的制作
    • 三、pod私有库的制作(一般用于组件化)

    一、Cocopods流程及使用

    Cocoapods工作流程

    作用:管理Xcode依赖的第三方框架

    手动管理:
    1、有可能会添加很多配置及系统依赖框架,繁琐易错;
    2、如果框架升级了,需要替换本地工程里面的框架,再重新配置。

    Cocopods管理:
    快速、自动集成第三方框架,并编译成一个libPod.a的静态库在项目中使用。

    • 1.1、快速集成+简单使用
    // 1、初始化pod(会自动生成Podfile等文件)
    - pod init
    
    // 2、修改Podfile文件,添加需要的第三方
    platform :ios, '9.0'
    target 'PodUsageDemo' do
      use_frameworks!
      pod 'AFNetworking'
    end
    
    // 3、下载安装
    - pod install
    
    pod init;生成Podfile文件 修改Podfile文件,添加需要的第三方 下载安装完成后的结构

    Podfile 是一种规范,描述了一个或多个 Xcode 项目的目标的依赖关系

    // 1、根据不同的target下载不同的第三方代码
    target 'ProjectName' do
      pod 'AFNetworking'
      pod 'SDWebImage'
    end
    
    target 'NotificationService' do
      pod 'GTExtensionSDK', '2.2.4'
    end
    
    
    // 2、版本控制
    pod 'AFNetworking'           # 使用最新版本
    pod 'AFNetworking', '3.0.0'  # 只使用3.0.0版本
    
    除了没有版本或特定版本之外,还可以使用逻辑运算符:
    pod 'AFNetworking', '> 0.1'  # 任何高于 0.1 的版本
    pod 'AFNetworking', '>= 0.1' # 0.1 版及更高版本
    pod 'AFNetworking', '< 0.1'  # 任何低于 0.1 的版本
    pod 'AFNetworking', '<= 0.1' # 版本 0.1 和任何更低版本
    
    除了逻辑运算符之外,CocoaPods 还有一个乐观运算符~>:
    pod 'AFNetworking', '~> 0.1.2 ' # 0.1.2 及 0.2 及以下版本,不包括 0.2 及更高版本
    pod 'AFNetworking', '~> 0.1'    # 0.1 及 1.0 以下的版本,不包括 1.0 及更高版本
    pod 'AFNetworking', '~> 0'      # 版本 0 和 1.0 之前的版本,不包括 1.0 及更高版本
    
    
    // 3、使用本地文件夹路径(通常用于本地库,一般建议采用相对路径,避免重新配置)
    pod 'AFNetworking', :path => '~/Documents/AFNetworking' # 绝对路径
    pod 'AFNetworking', :path => '../AFNetworking'          # 相对路径
    
    
    // 4、使用远程索引库的地址
    # 使用远程地址
    pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git'
    # 使用远程地址 + 'dev'分支
    pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :branch => 'dev'
    # 使用远程地址 + 'tag'标签
    pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => '3.1.1'
    # 使用远程地址 + 'commit'提交记录
    pod 'AFNetworking', :git => ''https://github.com/AFNetworking/AFNetworking.git', :commit => '0f506b1c45'
    
    何时使用

    pod install :添加、删除pod的时候(即使工程中已经存在Podfile或者已经执行过pod install)
    pod update [#PODNAME] :仅在要将pod 更新到较新版本时使用

    主要区别场景

    在Podfile文件内的框架版本描述中,有没有制定具体版本

    pod --help
    + install   Install project dependencies according to versions from a Podfile.lock
    + update    Update outdated project dependencies and create new Podfile.lock
    
    
    1、pod install
    - 第一次在工程中使用pods时、每次编辑Podfile文件(新增、移除、更新)时使用;
    - 每次执行pod install时,除了下载安装,还会在Podfile.lock文件夹中生成版本信息,用于跟踪和锁定该版本;
    - Podfile.lock,在第一次运行pod install后生成的,记录每个安装库的版本号,并且锁定了这些版本;
    - 对于在Podfile.lock中记录的版本,该命令会直接下载安装,不会去检查是否有新的版本;
    - 对于不在Podfile.lock里面的库,执行该命令后会从Podfile文件的信息中查找对应版本。
    
    
    2、pod update
    - pod update参照Podfile安装,如果Podfile中没有做版本限制,会直接将第三方库升级为最新的
    - 只关心Podfile中的版本限制,不考虑Podfile.lock里面的限制
    - 如果只运行pod update,后面没有跟库的名字,CocoaPods就会更新Podfile里面所有的库到最新版本
    
    
    3、pod outdated
    - 会列出所有较Podfile.lock里面有新版本的库(一般用于更新前检查)
    
    
    4、提升安装速度
    输入pod install或者pod update之后,
    - CocoaPods首先会去匹配本地spec库;
    - 在确认spec库不需要更新之后,才会下载相应的库文件;
    - 这样比较耗时,可使用以下命令,跳过spec版本库更新匹配
    
    pod update --verbose --no-repo-update
    pod install --verbose --no-repo-update
    
    
    5、约定俗称的规则
    - 提交代码时,省略Pod文件,其他人克隆源码后直接执行pod install,可节省远程仓库存储空间
    - 一般添加pod的时候都会指明版本(防止其他人误更新)
    - 关于升级:除非组内一起升级,保持版本同步才会执行pod update,否则只执行pod install
    
    • 1.4、pod search xxxx
    - 检索第三方框架
    - 内部做的事情:从本地缓存的‘第三方框架描述信息’(.json)生成的检索文件中检索到相关框架信息
    - 常见问题:检索不到,删除cocopods索引文件,rm ~/Library/Cache/...search_index.json
    
    • 搜索失败及解决
      [!] Unable to find a pod with name, author, summary, or description matching LeeButtonLayout
      1、删除search_index.json
      2、执行如下代码
    pod repo remove master
    cd ~/.cocoapods/repos
    git clone --depth 1 https://github.com/CocoaPods/Specs.git master
    rm ~/Library/Caches/CocoaPods/search_index.json
    pod search LeeButtonLayout
    
    • 1.5、pod setup
    将远程索引库克隆到本地索引库
    
    • 1.6、名词解释
    - 远程索引库:https://github.com/CocoaPods/Specs
    - 本地索引库:/Users/qiangzhi/.cocoapods/repos/master/Specs
    - 本地索引库检索文件:/Users/qiangzhi/Library/Caches/CocoaPods/search_index.json
    
    
    第三方源码,第二次安装特别快,就是因为已经缓存到本地了,位置(/Users/qiangzhi/Library/Caches/CocoaPods/Pods)
    
    如果删除search_index.json索引文件后,执行pod search xx 会重新生成search_index.json,需要几分钟
    
    pod search;如果删除再搜索的时候,生成索引文件,等待7-8分钟

    二、pod库的制作(以制作LeeButtonLayout为例)

    pod库制作.jpeg

    制作步骤

    • 从模版库创建工程 (pod lib create LeeButtonLayout
    • 将代码添加到 Classes 文件夹中
    • 修改.podspec配置文件
    • 将代码上传到GitHub远程仓库,并且打好标签
    • pod验证
    • .podspec文件发布到公有库中(trunk方式)
    • 更新本地pod第三方框架信息数据源
    • 2.1、从模版库创建工程
    // 创建一个文件夹(例:remoteLib),从终端进入,执行以下命令,LeeButtonLayout就是库的名称
    pod lib create LeeButtonLayout
    
    // 你想在什么平台使用??(由于是制作移动端的库,所以输入iOS)
    What platform do you want to use?? [ iOS / macOS ]
     > iOS
    
    // 你想使用什么语言??(我制作的库是使用ObjectC开发,所以输入ObjC)
    What language do you want to use?? [ Swift / ObjC ]
     > ObjC
    
    // 您想在库中包含演示应用程序吗?(输入Yes,制作完成时会自动创建一个Example文件,里面是使用demo)
    Would you like to include a demo application with your library? [ Yes / No ]
     > Yes
    
    // 您将使用哪些测试框架?(暂无)
    Which testing frameworks will you use? [ Specta / Kiwi / None ]
     > None
    
    // 你想做基于视图的测试吗?(暂无)
    Would you like to do view based testing? [ Yes / No ]
     > No
    
    // 类前缀
    What is your class prefix?
     > Lee
    
    
    ⚠️过程如下图所示
    
    从模版库创建工程-图示 资源文件 代码文件 Demo 修改代码

    回到Example文件夹下,执行pod install,进行代码测试

    • 2.2、修改.podspec配置文件
    WechatIMG222.jpeg
    • 2.3、将代码上传到GitHub远程仓库,并且打好标签
    // 1、在github上创建好远程仓库,拿到远程仓库地址
    
    // 2、初始化git、并关联推送到远程仓库
    qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git init
    qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git add .
    qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git commit -m "first commit"
    qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git branch -M master
    qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git remote add origin https://github.com/leeqiangzi/LeeButtonLayout.git
    qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git push -u origin master
    
    // 3、添加tag并推送到远程仓库
    qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git tag '0.1.0'
    qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout %  git push --tags
    

    ⚠️GitHub密码验证的支持在2021年8月13日之后就不支持了,需要配置ssh/token,可参考-《笔记-关于GitHub的操作》

    • 2.4、pod验证(本地+远程)
    // 验证本地库
    qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod lib lint
    
    // 验证远程库
    qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod spec lint
    
    二者主要区别:本地验证,不会验证tag
    
    本地验证成功 远程验证成功
    // 1、注册账户(邮箱+姓名+描述)
    - pod trunk register 601623654@qq.com 'leeqiangzi' --description='LeeButtonLayout的配置文件' 
    
    // 2、打开邮箱,通过邮件内容验证section
    
    // 3、推送到远程
    - pod trunk push LeeButtonLayout.podspec
    

    执行结果

    // 执行打印结果
    Updating spec repo `trunk` // 这一步在更新本地索引库
    Validating podspec
     -> LeeButtonLayout (0.1.0)
        - NOTE  | xcodebuild:  note: Using new build system
        - NOTE  | xcodebuild:  note: Using codesigning identity override: -
        - NOTE  | xcodebuild:  note: Build preparation complete
        - NOTE  | [iOS] xcodebuild:  note: Planning
        - NOTE  | [iOS] xcodebuild:  note: Building targets in dependency order
    
    Updating spec repo `trunk`
    
    --------------------------------------------------------------------------------
     🎉  Congrats
    
     🚀  LeeButtonLayout (0.1.0) successfully published
     📅  January 31st, 05:38
     🌎  https://cocoapods.org/pods/LeeButtonLayout
     👍  Tell your friends!
    --------------------------------------------------------------------------------
    

    查看自己是否注册过trunk

    qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod trunk me
    
      - Name:     leeqiangzi
      - Email:    601623654@qq.com
      - Since:    January 31st, 05:33
      - Pods:
        - LeeButtonLayout
      - Sessions:
        - January 31st, 05:33 - June 8th, 18:59. IP: 43.239.85.131 Description:
        LeeButtonLayout的配置文件
    
    • 2.6、pod升级(子库拆分+依赖)
    pod升级过程

    1、修改升级代码,提交到远程仓库,更新tag
    2、修改spec文件,trunk方式提交

    依赖于其他库 子库
    // 升级结果
    qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod trunk push LeeButtonLayout.podspec
    Updating spec repo `trunk`
    Validating podspec
     -> LeeButtonLayout (0.2.0)
        - NOTE  | xcodebuild:  note: Using new build system
        - NOTE  | xcodebuild:  note: Using codesigning identity override: -
        - NOTE  | xcodebuild:  note: Build preparation complete
        - NOTE  | [iOS] xcodebuild:  note: Planning
        - NOTE  | [iOS] xcodebuild:  note: Building targets in dependency order
        - NOTE  | [iOS] xcodebuild:  Pods.xcodeproj: warning: The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 15.2.99. (in target 'AFNetworking' from project 'Pods')
        - NOTE  | [iOS] xcodebuild:  Pods.xcodeproj: warning: MobileCoreServices has been renamed. Use CoreServices instead. (in target 'AFNetworking' from project 'Pods')
    
    Updating spec repo `trunk`
    
    --------------------------------------------------------------------------------
     🎉  Congrats
    
     🚀  LeeButtonLayout (0.2.0) successfully published
     📅  February 6th, 03:40
     🌎  https://cocoapods.org/pods/LeeButtonLayout
     👍  Tell your friends!
    --------------------------------------------------------------------------------
    

    三、远程私有库

    远程私有库

    与发布到pod上的主要区别
    1、需要两个远程仓库(代码仓库 + spec仓库)
    2、需要配置源路径,Podfile需要添加 source 'xxx'
    3、推送配置文件使用pod repo push xxx xxx.podspec,不再使用trunk方式

    其他步骤与 ‘二、pod库的制作’ 基本一致,此方法一般用于公司内部组件化开发使用

    • 3.1、创建远程代码仓库 + 远程配置仓库
    代码仓库 + 配置仓库
    • 3.2、从模版库创建工程
    WechatIMG242.jpeg
    • 3.3、将代码添加到Classes文件中
    替换文件
    • 3.4、在Example文件夹下执行pod install,进行代码编译测试
    • 3.5、修改spec配置文件
      WechatIMG245.jpeg
    • 3.6、将代码提交到远程仓库,添加tag
    // 初始化git、关联远程仓库、推送代码
    qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git init
    qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git add .
    qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git commit -m 'first commit'
    qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git remote add origin https://e.coding.net/leeqiangzi/PrivatePods/LeeLimitInput.git
    qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git push origin master
    
    // 添加标签并推送
    qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git tag '0.1.0'
    qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git push --tags
    
    • 3.7、验证(本地+远程)
    本地验证 远程验证
    • 3.8、推送配置文件
    1、添加源地址
    pod repo add LeeLimitInput https://e.coding.net/leeqiangzi/PrivatePods/LeeLimitInputSpecs.git
    
    2、将spec推送到远程
    pod repo push LeeLimitInput LeeLimitInput.podspec
    
    ⚠️如果名称写错可通过 pod repo remove xxx 删除
    
    这个过程是:先添加到本地配置库,再推送到远程仓库 远程配置仓库展示推送后的结果-0.1.0
    • 3.9、修改Podfile(添加source),执行pod install
    # 如果不添加source,则直接到pod的master中查找
    # 通过pod repo查看source
    source 'https://e.coding.net/leeqiangzi/PrivatePods/LeeLimitInputSpecs.git'
    # 公有库源添加
    source 'https://github.com/CocoaPods/Specs.git'
    
    platform :ios, '9.0'
    
    target 'PodUsageDemo' do
      use_frameworks!
      
      pod 'LeeLimitInput'
    
    end
    

    其他参考文档

    相关文章

      网友评论

        本文标题:Cocoapods流程及pod库的制作

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