一,前言

  • 为什么要用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.)
      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., 1.0., 1.0., 1.0., 1.0, 0.9., 0.9., 0.9., 0.9.,
      0.9., 0.9., 0.8. [master repo]
      - Subspecs:
      - YYImage/Core (1.0.)
      - YYImage/WebP (1.0.)

      每个版本号对应的一个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@.com

    注册成功!

    确认后再终端输入

    pod trunk me

    可以看到你的注册信息

    类似如下:

    $ pod trunk me
    - Name: xxx
    - Email: xxx@.com
    - Since: November 17th, :
    - Pods: None
    - Sessions:
    - November 17th, : - March 27th, :. 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 仓库上看到自己的提交记录了。

Mac终端的Cocoapods创建自己的私有库和公有库的更多相关文章

  1. 使用CocoaPods创建自己的私有库-iOS组件化第一步

    目前iOS组件化常用的解决方案是Pod+路由+持续集成,通常架构设计完成后第一步就是将原来工程里的模块按照架构图分解为一个个独立的pod工程(组件),今天我们就来看看如何创建一个Pod私有库. 新建: ...

  2. Mac终端的Cocoapods的安装及使用

    阅读目录 第一步,首先要检查Mac是否安装了rvm.打开终端,输入指令 rvm -v 第二步,用rvm安装ruby环境 第三步,检查更新RubyGems(Ruby1.9.1 以后的版本自带RubyGe ...

  3. CocoaPods创建私有pods

    由于项目需求,需要把项目的不同模块拆分出来即 组件化 ,一开始想做成多target模式,后来换成私有pods CocoaPods的安装和使用,网上很多,自行搜索即可. 听说可以基于svn创建pod私有 ...

  4. 制作CocoaPods公有库和私有库

    认识公有库和私有库 公有库:开源自己封装的库供别人使用,且往cocoaPods的官方Repo仓库(即CocoaPods Master Repo)中新增自己库的索引,该库索引是以*.podspec.js ...

  5. 利用cocoapods创建基于git的私有库

    上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...

  6. iOS代码组件化--利用cocoaPods创建私有库

    如果项目模块多,模块间逻辑复杂,我们发现多个人同时维护一个代码仓库需要十分小心,一不小心,造成冲突,解决起来很烦,相信很多人都遇到手工删除合并的冲突的文件的经历. 如果利用组件化思想,每个人维护自己的 ...

  7. 利用cocoapods创建基于git的私有库Spec Repo

    上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...

  8. 从mac终端创建cocos2d-x项目在xcode和eclipse正常运行环境配置

    一.创建可以同时运行在xcode和eclipse的项目: 1.打开mac终端,进入cocos2d-x目录下的tools/project-creator,执行命令./create_project.py ...

  9. 【转】使用Cocoapods创建私有podspec

    Cocoapods是非常好用的一个iOS依赖管理工具,使用它可以方便的管理和更新项目中所使用到的第三方库,以及将自己的项目中的公共组件交由它去管理.Cocoapods的介绍及优点本文就不在赘述,我开始 ...

随机推荐

  1. RocketMQ 创建和删除 topic,以及 broker 和 nameserver 之间的心跳

    命令行主类:org.apache.rocketmq.tools.command.MQAdminStartup 客户端创建 topic 程序参数:updateTopic -n localhost:987 ...

  2. VMware vMotion 配置要求

    目录 目录 vCenter 支持 vMotion 的前提 条件 vMotion 的主机配置 vMotion 共享存储器要求 vMotion 网络要求 最后 vCenter 支持 vMotion 的前提 ...

  3. 38 是否要使用memory引擎的表

    38 是否要使用memory引擎的表 内存表的数据组织结构 create table t1(id int primary key, c int) engine=Memory; create table ...

  4. mybatis 如何关闭connection

    1.前言 最开始操作数据库是使用jdbc操作数据库,每次创建一个连接都需要关闭连接,避免占用资源.比如 Class.forName("com.jdbc.mysql.Driver") ...

  5. Pku2054 Color a Tree

    有一个N个结点的有根树,1是这个树的根.现在要对这N个结点依次进行染色,每个结点染色要花费1个单位的时候,同时要满足一个结点仅在其父亲被染色后才可被染色,每个结点有个权值Ci,如果我们在第Ti时间对i ...

  6. HTTP response status

    The status code is a 3-digit number: 1xx (Informational): Request received, server is continuing the ...

  7. python函数-语句

    一.def语句和参数 #!/usr/bin/env python #coding:utf-8 def hello(name): print('Hello ' +name) hello('dingkai ...

  8. c语言秋季作业2

    问题 答案 这个作业属于哪个课程 C语言程序设计I 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-4/homework/8657 我在这 ...

  9. SpringBoot(九) -- SpringBoot与数据访问

    一.简介 对于数据访问层,无论是SQL还是NOSQL,Spring Boot默认采用整合Spring Data的方式进行统一处理,添加大量自动配置,屏蔽了很多设置.引入各种xxxTemplate,xx ...

  10. 干货!小白入门Python数据科学全教程

    前言 本文讲解了从零开始学习Python数据科学的全过程,涵盖各种工具和方法 你将会学习到如何使用python做基本的数据分析 你还可以了解机器学习算法的原理和使用 说明 先说一段题外话.我是一名数据 ...