zoukankan      html  css  js  c++  java
  • [CocoaPods]Mac端:使用Cocoapods创建公共/私有库

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(let_us_code)
    ➤博主域名:https://www.zengqiang.org
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址: https://www.cnblogs.com/strengthen/p/13854680.html
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    热烈欢迎,请直接点击!!!

    进入博主App Store主页,下载使用各个作品!!!

    注:博主将坚持每月上线一个新app!!!

    一,前言

    • 为什么要用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。在导入的时候通过名字React去cocoapods匹配对应的podspec,然后根据s.source去找到对应的仓库和对应的版本,然后会再去匹配新的podspec,后边的步骤就完全相同了。

      • 集成原理
        当所有的依赖库都下载完后,Cocoapods会将所有的依赖库都放到另一个名为Pods的项目中,然后让主项目依赖Pods项目。这样,源码管理工作都从主目录移到了Pods项目中。Pods项目最终会编译成为一个名为libPods.a的文件,主项目只要依赖这个.a文件即可。对于资源文件,Cocoapods提供了一个名为Pods-resource.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将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 install 和 pod 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 ]
        Swfit
      • 是否自动生成demo,选择Yes,方便以后测试

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

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

        Would you like to do view based testing? [ Yes / No ]
        Yes
      • 示例图:


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

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

  • 相关阅读:
    无法重用Linq2Entity Query
    The Joel Test
    MSBuilder directly instead of default VSComplie with keyborad shotcut 原创
    客户端缓存(Client Cache)
    关于代码重构和UT的一些想法,求砖头
    ExtJS2.0实用简明教程 应用ExtJS
    Perl information,doc,module document and FAQ.
    使用 ConTest 进行多线程单元测试 为什么并行测试很困难以及如何使用 ConTest 辅助测试
    史上最简单的Hibernate入门简介
    汽车常识全面介绍 传动系统
  • 原文地址:https://www.cnblogs.com/strengthen/p/13854680.html
Copyright © 2011-2022 走看看