Mac终端的Cocoapods创建自己的私有库和公有库

一,前言

  • 为什么要用Cocopods

    通常在开发的过程中,大多时候,我们会处理一类相同的操作,比如对于字符串String的邮箱验证,是否为空,手机号验证,或者一些UIView的动画操作,我们为了避免写一些重复的代码,可能经过类目或者延展的形式对原有的类进行了一个扩充。还有一些是工程中一些基本的公共组件,比如城市列表,刷新控件,网络请求库或者商品的目录这种基本公共组件,在工程中好多地方需要调用,我们都可以进行封装成一个组件功能模块。为了以后方便在其他App中使用,我们可以使用Cocoapods把这些小点子,小功能,可以封装成一个pod,当下次使用的时候,只需简单配置就可以了。这一点特别是在公司开发多个项目的时候,可以很方便快速的共享公共的代码,节约开发时间,这就是为什么好多公司喜欢组件化管理代码。至于库是创建私有的还是公共的,看自己和公司要求而定,大多情况下公司的是私有库pod。当然通过cocopods除了集成自己开发的功能模块外,还可以引用第三方发布到cocopods上的功能功能模块,比如友盟的分享,神策的统计等等好的功能模块。总之Cocopods 减少了代码的耦合性,提供了开发效率等等。
  • 理解Cocopods原理

    • cocoapods的下载原理

      举例: s.source = { :git => 'git@gitlab.xxx.net:ios-thirdpartservice/xxxreact.git', :tag => '1.0.0' } //s.source 位于.podspec内

      当使用Cocoapods导入私有库时,Cocoapods先是根据:git => ‘git@gitlab.xxx.net:ios-thirdpartservice/xxxreact.git’找到对应的git仓库,然后根据:tag => ‘1.0.0’定位到对应tag的提交(如果没有注明Pod依赖库版本则定位到最后一次的提交),然后在这次提交中检索后缀为.podspec的文件(文件可以随便命名)。找到podspec文件后先要验证s.name是否与Podfile中的一致,如果不一致则install时会报错:[!]Unable to find a specification for ‘React’. 如果验证成功后,就会根据Podspec中的s.source_files找到需要导入的代码文件,并通过其他的的数据找到对应的配置文件或资源文件等。最后,将其下载到本地项目中。
      当使用Cocopods导入共有库时,和以上原理也相同。只是共有库要将podspec文件上传到cocoapods。在导入的时候通过名字Reactcocoapods匹配对应的podspec,然后根据s.source去找到对应的仓库和对应的版本,然后会再去匹配新的podspec,后边的步骤就完全相同了。

    • 集成原理
      当所有的依赖库都下载完后,Cocoapods会将所有的依赖库都放到另一个名为Pods的项目中,然后让主项目依赖Pods项目。这样,源码管理工作都从主目录移到了Pods项目中。Pods项目最终会编译成为一个名为libPods.a的文件,主项目只要依赖这个.a文件即可。对于资源文件,Cocoapods提供了一个名为Pods-resource.shbash脚本,该脚本在每次项目编译的时候都会执行,将Pods依赖库的各种资源文件复制到目标目录中。Cocoapods还通过一个名为Pods.xcconfig的文件来在编译时设置所有的依赖参数

      • libPods.a

      • Pods-resources.sh

      • Pods.xcconfig

    • 版本控制原理
      当执行完pod install之后,cocoapods会生成一个podfile.lock的文件。podfile.lock文件最大的用处在于多人开发。如果你没有在podfile中指定pods版本pod ‘React’,那么默认为获取当前React依赖库的最新版本。当团队中的某个人执行完pod install命令后,生产的podfile.lock文件就记录下了当时最新pods依赖库的版本,这时团队中的其他人check下来这份包含podfile.lock文件的工程以后,再去执行pod install命令时,获取下来的pods依赖库的版本和最开始用户获取到的版本一致。如果没有podfile.lock文件,后续所有用户执行pod install命令都会获取最新版本的React,这就可能造成一个团队使用的依赖库版本不一致,这对团队协作来说绝对是个灾难。
      在这种情况下,如果团队想使用当前最新版本的React依赖库,有两种方案:
      1、更改podfile,使其指向最新版本的React依赖库
      2、执行pod update命令;鉴于podfile.lock文件对团队协作如此重要,所以应该加入到版本控制里面。

    • 区分pod install 与 pod update

      我们在使用这个工具时,最经常用到的命令就是pod installpod update;这两个命令都能为我们安装指定的Pod库,但是他们的使用是有区别的,有各自不同的作用和适用场景;了解这两个命令的差异前,需要先对Podfile.lock文件有所了解;Podfile.lock文件中记录了每个pod的当前已安装版本,并锁定这些版本(.lock命名因此而来);当运行pod install命令时,它只解析尚未列在Podfile.lock中的依赖库,在下载并安装新的pod时, 会在Podfile.lock文件中写入新的pod库的当前指定版本;对于已经在Podfile.lock中列出的pod, pod install命令不会尝试检查是否有更新的版本;而是直接使用在Podfile.lock文件中的pod版本;

      • pod install
        在项目中第一次使用CocoaPods时,安装指定的pod库需要使用这个命令;
        当在Podfile中 增加 或 删除 某个pod后, 使用这个命令进行更新;pod install不会尝试更新已安装的pod的版本;

      • pod update
        1、当运行pod update时,CocoaPods会把Podfile中所有的pod都更新到最新版本;并在Podfile.lock中写入最新的版本号;
        2、执行pod update PODNAME命令更新指定的某个PODNAME库到最新版本;

      • pod outdated
        pod outdated命令可以检测出所有比Podfile.lock中写入的版本(每个pod当前安装的版本)更新的pod版本;

  • 了解Cocopods的本地目录

    我们先来看看CocoaPods本地目录中有什么

    • $ cd ~/.cocoapods/repos/master 或者显示隐藏文件

    • $ defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder
      然后进入 ~/.cocoapods/repos/master

      你会发现 master 是一个 git 仓库,输出仓库的远程地址,发现是一个GitHub仓库

    • $ git remote -v

      origin https://github.com/CocoaPods/Specs.git (fetch)
      origin https://github.com/CocoaPods/Specs.git (push)

      继续,我们进入Specs文件夹一直往里点,你会发现很多框架以及版本号

    • $ pod search YYImage
      选择一个框架,通过pod搜索 Specs 文件夹中的框架,输出框架信息

      -> YYImage (1.0.4)
      Image framework for iOS to display/encode/decode animated WebP, APNG, GIF,
      and more.
      pod 'YYImage', '~> 1.0.4'
      - Homepage: https://github.com/ibireme/YYImage
      - Source: https://github.com/ibireme/YYImage.git
      - Versions: 1.0.4, 1.0.3, 1.0.2, 1.0.1, 1.0, 0.9.5, 0.9.4, 0.9.3, 0.9.2,
      0.9.1, 0.9.0, 0.8.9 [master repo]
      - Subspecs:
      - YYImage/Core (1.0.4)
      - YYImage/WebP (1.0.4)

      每个版本号对应的一个json文件,描述了每个对应版本的框架的信息、配置、及源码下载地。

      我们在 CocoaPods 发布我们的框架时,就是要在 master 仓库中添加我们的仓库描述信息,然后push到远程仓库中。不过这个过程不用我们手动去操作,只需要通过pod命令进行操作即可。

二,iOS 创建自己的Cocoapods公有库

  • 注册 CocoaPods 账号 (已注册可忽略)

     想创建开源的Pod库,就要注册一个CocoaPods账号,我们使用终端注册, email 用你的 GitHub 邮箱

    $ pod trunk register GitHub_email 'user_name' --verbose

    等终端出现下面文字,CocoaPods 会发一个确认邮件到你的邮箱上,登录你的邮箱进行确认。

    [!] Please verify the session by clicking the link in the verification email that has been sent to you_email@163.com

    注册成功!

    确认后再终端输入

    pod trunk me

    可以看到你的注册信息

    类似如下:
    $ pod trunk me
      - Name:     xxx
      - Email:    xxx@163.com
      - Since:    November 17th, 20:46
      - Pods:     None
      - Sessions:
      - November 17th, 20:46 - March 27th, 2020 19:44. IP: xxx.xxx.xxx.xxx
  • 创建一个工程

    1、在桌面上新建一个工程文件夹比如“cocopods”
         
    2、打开终端,切换到该目录

    cd /Users/xxx/Desktop/cocopods

    3、创建工程模板

    pod lib create cocopods

    4、配置相关选择。

    • 选择平台

      What platform do you want to use?? [ iOS / macOS ]
      iOS
    • 选择语言

      What language do you want to use?? [ Swift / ObjC ]
      ObjC
    • 是否自动生成demo,选择Yes,方便以后测试

      Would you like to include a demo application with your library? [ Yes / No ]
      Yes
    • 是否集成测试框架

      Which testing frameworks will you use? [ Specta / Kiwi / None ]
      None
    • UI 测试

      Would you like to do view based testing? [ Yes / No ]
      No
    • 指定类前缀 (当指定前缀时系统会自动在模版内创建指定前缀的类,Delegate)

      What is your class prefix?
      LX
      示例图:


    • 执行完之后,自动打开项目

  • 编写podspec文件。

    1、 目录下文件介绍

    • podspec这个文件主要是用来描述项目名称、pod的版本号、介绍、首页(homepage)、作者信息、git源等,具体的可以参看官方Podspec Syntax Reference

    • README使用过GitHub的都会知道README文件的重要性,这个文件可以使用Markdown语法,主要展示在GitHub工程上的首页。README文件对于使用这个pod库的人来说,有和没有这个文件,区别是很明显的,此外这还有助于创建一个高质量的 CocoaPods Quality Index

    • LICENSE要想是Spec仓库接收,就必须包含一个license。命令pod lib create 自动创建使用的是 MIT license;

    2、如果用上面的命令创建工程模板,那么工程的目录下已经自动生成了.podspec(LCocopodsTest.podspec)。如果是已有的工程或者库文件目录,也可以利用Pod命令自己制作.podspec文件,命令如下:

    pod spec cretae <组件库名>

    PS注意:自动生成的podspec文件只是模板,需要结合工程的库文件、资源目录、远程代码仓库(第1步创建的远程代码仓库)修改补充podspec文件。

    • 验证.podspec文件的格式是否正确

      1、cd 到 *.podspec 文件所在的目录下,用到的一些命令

      pod lib lint

      解说:本地验证pod能否通过验证,如果失败使用下面命令:pod lib lint --verbose查看失败原因, 或使用pod lib lint --allow-warnings忽略警告错误

      pod spec lint

      解说:本地和远程验证pod能否通过验证,需要更新提交podspec到远程specs仓库,一般本地验证通过即可提交到远程specs仓库

      pod lib lint --verbose

      解说:加--verbose可以显示详细的检测过程,出错时会显示详细的错误信息

      pod lib lint --verbose --allow-warnings

      解说: 允许警告,用来解决由于代码中存在警告导致不能通过校验的问题

      • 有时候会提示一个错误
          
          ⚠️:没有写简介,把简介填写一下,就可以验证通过。

      • 有时候会提示一个错误:

        ⚠️:到这个提示错误信息的时候,使用如下指令:

        pod lib lint 文件名称.podspec --use-libraries --allow-warnings

              相应的执行上传指令的时候,也需要加上参数:

        pod repo push GofSpecs GofKit.podspec --use-libraries --allow-warnings

        pod lib lint --sources=[https://git.xxx.com/XesAppMediator...]

        解说
        : 私有库依赖需要添加specs源来验证

              引用当前私有库的podFile中指定source为私有库地址

        source http://[privateLibName]/cocoaspecs.git'
        source 'https://github.com/CocoaPods/Specs.git'

        pod lib lint --help
        解说:查看所有可选参数,可选参数可以加多个

  • 提交工程代码

  提交工程代码到远程代码仓库,可以利用git或者svn进行代码版本管理,提交代码到GitHub等, 初始化提交命令如下:

//初始化git版本管理仓库,模板代码已经初始化过此步骤可以忽略(有.git文件夹)

git init

//添加到暂存区

git add .

//提交到本地仓库

git commit -a -m '提交信息'

示例:git commit -a -m '添加pod组件库'

//打标签,注意此标签可能在podspec中用到,用于区分版本

git tag 1.0.0

//本地仓库与远程仓库关联(已关联过的,可以忽略)

git remote add origin <url>

//拉取和合并本地与远程仓库

git pull origin master --allow-unrelated-histories

//本地仓库代码推送到远程

git push --set-upstream origin master

      此时如果你报错,查看报错信息中如果有:“pre-receive hook declined” 说明存在权限问题,没有master分支的代码提交权限。分配权限后,就可以push成功。

//推送标签

git push --tags

  • 使用仓库

    发布到Cocoapods后,在终端更新本地pods仓库信息

    • 更新本地pods仓库信息

      $ pod setup
    • 查询仓库

      $ pod search LCocopodsTest

      -> LCocopodsTest (1.0.0)
      A delightful TextField of PhoneNumber
      pod 'BYPhoneNumTF', '~> 1.0.0'
      - Homepage: https://github.com/xxx/LCocopodsTest
      - Source: https://github.com/xxx/LCocopodsTest.git
      - Versions: 1.0.0, 0.0.1 [LCocopodsTest repo]
      (END)

      若出现仓库信息说明已经成功了,这时候你就可以在 Podfile 添加、使用自己的仓库了 pod 'LCocopodsTest', '~> 1.0.0'

  • 更新维护

    当你的代码更新维护后,就需要重写发布,流程是:

     

    • 更新LCocopodsTest.podspec中的版本号

    • 打上标签推送远程

    • pod trunk push LCocopodsTest.podspec 推送到pods仓库
      更新后你就可以在 CocoaPods Master Repo 仓库上看到自己的提交记录了。




posted on 2019-11-26 09:53  梁飞宇  阅读(192)  评论(0编辑  收藏

统计