• 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 仓库上看到自己的提交记录了。




  • 相关阅读:
    网络安全系列 之 MySQL数据库安全
    设计模式 之 责任链模式学习实践
    清晰化算法在DSP上的实现
    图像清晰化 之雾天图像清晰化处理
    Jupyter Notebook
    网络安全系列 之 协议安全
    FTP、FTPS、SFTP概览
    ImportError: Imageio Pillow plugin requires Pillow, not PIL!
    ubuntu 下开机启动项修复(进不去windows系统)
    error while loading shared libraries: libopencv_core.so.3.4: cannot open shared object file: No such file or directory
  • 原文地址:https://www.cnblogs.com/lxlx1798/p/11904346.html
Copyright © 2020-2023  润新知