Git & Cocoapods & 私有化,你不得不知的组件化基础!

Git

理解Git的设计思想和基本的工作原理,对更好的使用Git至关重要。

Git思想

直接记录快照,而非比较差异。和其他版本控制系统不同的是,Git存储数据时将数据看成小型的文件系统的一组快照,每次在修改文件提交更新后,它主要对当时的所有文件制作一个快照并保存到快照索引中。Git还对这一个保存过程进行了优化,也就是说当文件没有本修改时,Git不会重新存储文件而是只保留一个链接指向之前存储的文件。这是Git与其他版本控制系统的重要区别。

近乎所有的操作都是在本地执行。Git的大多数操作都是在本地完成,当我们在没有网络或者没有VPN的情况下,同样可以使用Git进行办公。因为在本地磁盘上有项目的完整历史,可以在任何时候浏览项目的历史。

保证数据的完整性。Git为了保证数据的完整性在存储前都会计算校验和,通过校验和来引用。校验和机制叫做SHA-1散列,也叫哈希散列。Git通过对校验和的检查可以保证数据的完整性。

校验和是40个十六进制组成的字符串。例如

24b9da6552252987aa493b52f8696cd6d3b00373

在Git中,所以文件都是通过校验和进行查找的,而不是文件名。

Git工作原理

为了更好的理解Git,需要理解其设计原理。在Git中,文件有三种状态: 已提交(committed),已修改(modified)和已暂存(staged)。

  • 已提交: 数据已经安全的保存到本地数据库中。
  • 已修改: 数据文件被修改,还没保存到数据库中。
  • 已暂存: 对已经修改的文件的当前版本做了标记,包含下次提交的快照。

对应文件的三种状态,还引入了三个工作区域的概念: Git仓库,工作目录和暂存区域。

  • Git仓库: 用来保存项目的数据的地方。
  • 工作目录:项目中某个版本独立提取出来的内容。
  • 暂存区域:保存文件下次提交的信息。

工作流程:

  • 在工作目录中修改文件。
  • 暂存文件,将文件的快照放入暂存区域。
  • 提交更新,找到暂存区域的文件,将快照永久存储。

工作区域和文件状态关系,如下图:

Git & Cocoapods & 私有化,你不得不知的组件化基础!_第1张图片
Git原理.png

验证

首先在桌面创建一个文件夹

$ cd Desktop & mkdir GitDemo & cd GitDemo

初始化Git仓库

git init

查看Git仓库状态

git status
// 输出:
        On branch master
        
        No commits yet
        
        nothing to commit (create/copy files and use "git add" to track)

提示没有可以提交的内容,因为现在工作区什么都没有,下面添加A.md文件。

// 创建A.md文件
touch A.md
// 查看Git状态
git status
// 输出:
    On branch master
    
    No commits yet
    
    Untracked files:
      (use "git add ..." to include in what will be committed)
    
        A.md
    
    nothing added to commit but untracked files present (use "git add" to track)

此时工作目录中新添加了一个文件,也就是说A.md文件被修改。在查看仓库状态会发现Untracked files A.md, 文件是未跟踪状态。可以使用git add 命令提交跟踪。

git add A.md
git status
// 输出:
    On branch master
    
    No commits yet
    
    Changes to be committed:
      (use "git rm --cached ..." to unstage)
    
        new file:   A.md

输出结果新的文件A.md,通过git add 命令,此时的A文件已经被提交到暂存区,文件的状态是已暂存状态。git rm --cached ...可以将暂存的文件从暂存区移除。

git commit -m 'add A.md'
// 输出;
    [master (root-commit) af93fed] add A.md
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 A.md

输出结果显示了一些提交的基本信息,master分支,当前校验和[af93fed]以及在本次提交中,有多少文件修订过,多少行添加和删改过。通过此命令将文件提交到仓库中,此时文件的状态是已提交状态。

远程仓库

前面的提到,Git的大部分操作都是在本地完成的,但是为了多人协作就需要进行远程仓库管理。一些基本操作:

// 查看远程仓库服务器
git remote -v 

// 添加远程仓库
git remote add   

// 拉取仓库信息
git fetch  

// 推送到远程仓库
git push origin master

// 查看远程仓库
git remote show origin

// 远程仓库的移除和重命名
git remote rename  
git remote rm 

标签操作

// 查看所有标签
git tag

// 添加标签
git tag -a 0.1.1 -m 'message'

// 显示标签信息
git show 0.1.1

// 提价标签到远程(--tags所有标签)
git push origin --tags 

以上,只是Git的基本原理,其他内容请看官方文档。Git

Cocoapods

作为iOS开发者,想必对Cocoapods都不会陌生,那么有没有思考过这些问题?它的是如何查找库,如何集成库的,它的工作原理是什么。那么接下来我们学习一下Cocoapods的工作原理。

工作原理

理解其工作原理需要知道几个概念:代码库,索引库,本地索引库,podspec。

Git & Cocoapods & 私有化,你不得不知的组件化基础!_第2张图片
  • 代码库:Github上公开的代码仓库,可以集成使用。例如: Alamofire、AFNworking等。
  • 索引库:官方索引库,能够通过Pod安装的库都在这里面,存放的是每个库的Podspec。
  • 本地索引库:在安装Pod时,会把官方索引库拉取到本地。通过pod repo查看索引库信息。
  • Podspec:库的描述文件,里面记录着库的描述,版本,地址,依赖库等信息。

工作流程:

  • 安装Cocoapods后,本地会来去官方的索引库,生成本地索引表。
  • 使用Pod install时,默认情况下,会去更新本地索引库,可以在后面添加--no-repo-update忽略更新。
  • pod会根据Podfile文件内容查找索引表,找到库所对应的的Podspec文件,获取库的真是地址。
  • 下载三方库到本地。

关于 Podfile 设置请看The Podfile。

Podspec后面在做讲解,也可以查看Podspec Syntax Reference

Cocoapods私有化

理解了GitCocoapods的工作原理,我们需要学以致用。本节我们学习创建私有索引库,可以说这是组件化的基础。

索引库

前面提到通过命令pod repo可以查看本地的索引库。

master
- Type: git (master)
- URL:  https://github.com/CocoaPods/Specs.git
- Path: /Users/lqq/.cocoapods/repos/master

上面的URL地址就是公共索引库的地址,浏览器打开其实就是一个仓库。里面存放着所有支持cocoapods的库的索引文件podspec。因为该库是公共的,任何人都可访问,所以为了使我们私有的库也支持cocoapods就需要创建私有的索引库。

下面我们看如何创建私有索引库,其实很简单。你可以选用一些代码托管平台,例如:码云, Coding。这里以码云为例。

在码云中创建一个私有索引库,命名为LQQSpecs

OK私有库就创建好了。接下来将私有索引库添加到本地。通过命令pod repo add

pod repo add LQQSpecs 

添加完成后运行pod repo就可以看到私有索引库了。

至此,私有索引库创建完成。

代码库

Cocoapods提供了创建代码库的命令。

pod lib create  // 创建仓库
// 拉取模板库
// 1. 设置:编程语言 OC 、Swift
// 2. 是否生成Demo?
// 3. 是否生成单元测试
// 4. 是否生成UI测试
// 5. 文件前缀

文件目录结构如下。

├── Example
│   ├── LQQSegmentBar
│   ├── LQQSegmentBar.xcodeproj
│   ├── LQQSegmentBar.xcworkspace
│   ├── Podfile
│   ├── Podfile.lock
│   ├── Pods
│   └── Tests
├── LICENSE
├── LQQSegmentBar
│   ├── Assets
│   └── Classes
├── LQQSegmentBar.podspec
├── README.md
└── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj
  • Example: Demo文件对应前面第二步,在这里写测试代码,或实例程序
  • LQQSegmentBar: 封装的库。
  • LQQSegementBar.podspec: 这是库的描述文件,将它提交到索引库,后面在解释。

这里需要注意是,当封装库更新时,Example需要使用pod install更新,才能正常使用修改过的库。

配置Podspec

下面我们来看一下Podspec文件。 由于上面使用pod提供的模板库创建的项目,所以默认生成了该文件。如果为现有的库添加该文件,需要使用命令

pod spec create  //创建Podspec

Podspec文件创建成功。那么文件里有什么内容,如何设置。由于涉及到的参数较多,所以这里只找几个关键的。其他请看Podspec Syntax Reference

下面以AFNworkingPodspec文件为例。


Pod::Spec.new do |s|
  s.name     = 'AFNetworking' // 名称
  s.version  = '3.2.0' // 版本
  s.license  = 'MIT' // License
  s.summary  = 'A delightful iOS and OS X networking framework.' // 简介
  s.homepage = 'https://github.com/AFNetworking/AFNetworking' // 项目主页
  s.authors  = { 'Mattt Thompson' => '[email protected]' } // 作者
  s.source   = { :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => s.version, :submodules => true } // 仓库地址
  s.public_header_files = 'AFNetworking/AFNetworking.h' // 头文件
  s.source_files = 'AFNetworking/AFNetworking.h' // 源文件
  
  #......
end 

上面只是涉及最基础的设置,其他的请查看官方文档。

封装好代码并且修改好Podspec文件,我们可以将项目上传到私有仓库了。

上传完成后需要为项目打标签,这个标签与Podspec文件中的版本号对应。

接下来将Podspec上传到私有索引库就可以,在上传之前最好验证Podspec文件是否有错误。

pod lib lint // 本地验证

pod spec lint // 远程验证

上传到私有索引库pod repo push <索引库名>

pod repo push LQQSpecs xxx.podspec

OK!至此,私有索引库,私有仓库,添加到私有索引库都完成了。

检验成果的时候到了。

pod search 'xxx'

// [!] Unable to find a pod with name, author, summary, or description matching `xxx`

WTF! 这是什么情况呢, 不要着急,并不是上述没有成功,是因为电脑有缓存。

资料库->Caches->Cocoapods

那么,如何将个人开源库发送到共有索引库,想必也回来。唯一的区别是Podspec上传的位置不同。

总结

本文学习了Git和Cocoapods工作原理。以及通过Cocoapods创建私有库,并集成Cocoapods功能。

参考

  • Git官方文档-中文版
  • Cocoapods官方文档

你可能感兴趣的:(Git & Cocoapods & 私有化,你不得不知的组件化基础!)