# Cocoapods库
先说明库在本地的结构。
首先需要打开 Finder 的显示隐藏文件功能,也可以通过终端命令行来操作:
打开隐藏的命令:
```
$ defaults write com.apple.finder AppleShowAllFiles -bool true
```
关闭隐藏的命令:
```
$ defaults write com.apple.finder AppleShowAllFiles -bool false
```
接着需要重启一下 Finder,可以按住 option + 右键 Finder 图标选择重启。然后打开隐藏目录 .cocoapods (这个目录在你的个人目录底下, `/.cocoapods 或 /Users/[username]/.cocoapods`)

可以看到上图,.cocoapods 目录下的 repos 其实是 repository (仓库)的缩写。 repos 中存放的时仓库的集合。这里的 master 就是 CocoaPods 官方建立的仓库,也就是我们所谓的公共库。
而specs 目录下存放的就是所有提交到 CocoaPods 的开源库的 podspec 文件的集合。其组成方式为:specName -- version -- specName.podspec
( master 里各个类库中现在是 specName.podspec.json 的形式,这个 .json 文件就是 podspec 文件加了个后缀。我们可以采用`$ pod ipc spec`这个命令来将 spec 文件转换成.json )
那这个文件夹是如何来得呢?这个文件夹是在你安装了 CocoaPods 后,第一次执行`$ pod install`时,CocoaPods 通过命令`$ pod setup`来建立的(这条命令会自动执行)。
## 公有库
### 创建公有库的具体操作
#### 新建仓库并配置文件
1. 在 Github 上新建公有仓库,根据下图做相应设置。

2. 随后需要将仓库clone到本地(建议在repos路径下)
`$ git clone 'https://github.com/microyulive/test.git'`

3. 在test下创建Classes文件来放置类文件(这里用Reachability为例)

#### 通过trunk推送podspec文件
1. 在test下创建 .podspec 文件(名字随意,当然可以与 spec 名字相同),然后进行相关的编辑,如下图
`$ pod spec create testComponents`

2. 然后在输入如下命令,结果如正常会如下图
`$ pod lib lint --allow-warnings`

出现以上信息说明验证成功。
3. 为了测试的方便,我们在test目录下创建一个demo工程,这样方便以后对私有库进行维护更新与测试,创建完成后如下图:

4. 推送 podspec文件。
首先需要将代码提交上去,需要注意的是,现在 Cocoapods 提交方式改成 trunk 自动化的提交方式。trunk自动化提交有下面几个步骤:
如果首次使用需要注册
`// pod trunk register [E-mail] [User Name]`
`$ pod trunk register microyulive@live.cn "microyulive"`
执行完成之后,会受到一封验证邮件,按邮件提示完成验证即可。注册流程完成之后,可以使用
`$ pod trunk me`来进行验证,成功信息如下:

提交的时候使用如下命令(在代码的根目录):
`$ git add -A && git commit -m "Add pod files"`
`$ git push origin master`
然后就能在你的 Github 上 test 仓库里看到提交的文件了。

之后需要给 push 的代码打上 tag 也就是给源代码打上版本号标签:
`$ git tag '0.0.1'`
`$ git push --tags`
最后就是把 podspec 文件进行推送:
`$ pod trunk push test.podspec`随后 Cocoapods 团队会进行审核,现在基本上几分钟内就可以完成。
#### 更新本地pod依赖
主要有时候会遇到提交完成但是未审核通过的情况,完全需要依赖`$ pod search`来进行查询。所以这时候需要对本地进行更新:
`$ pod setup`(此命令初次会花费较长时间,和网络环境好坏有关)
总的来说,在 trunk push 之后,可以先使用`$ pod search`查找,如果没有则在进行`$ pod setup`即可。
#### 有关podspec文件的更新
有时候需要单独修改 podspec 文件。此时只能先重新对 tag 进行更新(即更新版本号,如:0.0.1 -\> 0.0.2),然后再进行 `$ pod trunk push`的操作即可,否则可能很会报错。
### 说明
上述是官方的 repo,私有库的内容在后面,当然也可以查看[官方文档](https://guides.cocoapods.org/making/private-cocoapods.html "https://guides.cocoapods.org/making/private-cocoapods.html"),但是直接按照官方文档可能比较容易遇到一些坑,所以按照官方文档内容进行整理,来实现一个私有的 spec repo。根据官方的原理,只需要创建一个和 master 相类似结构的目录就可以实现私有的spec repo,当然也可以 fork 一个官方的 repo,但是它包含了太多没有必要地库在里面,这在编译仓库的时候需要浪费大量的时间,所以只要重新创建一个就可以了。
----
## 私有库
## 版本1
### 创建私有库总体步骤是这样的:
1. 创建并设置一个私有的Spec Repo(repo地址1)。
2. 创建Pod的所需要的项目工程文件,并且有可访问的项目版本控制地址(Repo地址2)。
3. 创建Pod所对应的podspec文件。
4. 本地测试配置好的podspec文件是否可用。
5. 向私有的Spec Repo中提交podspec。
6. 在个人项目中的Podfile中增加刚刚制作的好的Pod并使用。
7. 更新维护podspec。
#### 创建私有Spec Repo (私有库)
需要在 Github 上新建一个私有仓库(具体步骤略)。完成之后在终端上执行:
`# pod repo add [Private Repo Name] [Github HTTPS Clone URL]`
`$ pod repo add testView https://github.com/microyulive/testView.git`
如果成功则可以在`~/.cocoapods/repos`下看到 testView 这个目录了。
_**如果有同事共同使用这个私有库的话需要让他获得相关的权限再如此执行即可**_
#### 创建Pod项目工程文件
_**如果是现有项目并且已经在 Git 控制之下既可跳过此步骤,直接去“创建podspec文件”这一步**_
这里需要在项目的根目录下使用一个工具`$ pod lib create`
如有个一个项目叫做 testDemo,则此处可以在 testDemo 路径下执行 `$ pod lib create testLibrary`
随后会有相关的4个问题需要提交,分别是:
1. 是否需要一个例子工程 (一般选 YES)
2. 选择一个测试框架 (一般选 Specta)
3. 是否基于View测试 (一般选 YES)
4. 类的前缀 (一般根据项目情况而定)
之后会自动执行`$ pod install`命令并生成相关的依赖。接下来就是在 Pod 文件夹中添加库文件和资源,并配置 podspec 文件。一般可以将需要的文件或者需要新建的文件放在 Pod/Classes下,然后在 Example文件夹执行`$ pod update`再打开工程就可以看到相关添加的文件已经在工程下 Development Pods/testLibrary中了。接着就可以敲代码编辑、测试了。
_**以后但凡有添加新文件或者更新了 podspec 的版本都需要执行**_ `$ pod update`
一旦编辑完成之后就可以推送到远端的仓库并编辑 podspec 文件了。
通过 Cocoapods 创建出来的目录本身就在本地的 Git 管理下,我们需要做的就是给它添加远端仓库,同样去 GitHub 或其他的Git服务提供商那里创建一个私有的仓库,拿到 SSH 地址,然后 cd 到 testLibrary 目录:
$ git add .
$ git commot -s -m "Initial Commit"
$ git remote rm origin
$ git remote add origin git@github.com:microyulive/testLibrary.git
$ git push origin master
同时需要打上tag
$ git tag -m "First Release" "0.0.1"
$ git push --tags
随后开始编辑 podspec 文件,方法与公有库部分相似,此处略,当然不要忘记在编辑完成之后用`$ pod lib lint`进行验证。然后跳到“本地测试 podspec 文件这一步”。
#### 创建podspec文件
如果是从第二步“创建 Pod 项目工程文件”跳过直接到这里的,那么需要在现有项目下创建一个 podspec 文件,执行命令:
`$ pod spec create testLibrary git@github.com:microyulive/testLibrary.git`
之后编辑这个 podspec 文件并进行验证即可。
#### 本地测试podspec文件
我们可以创建一个新的项目,在这个项目的 Podfile 文件中直接指定刚才创建编辑好的 podspec 文件,看是否可用。 在 Podfile 中我们可以这样编辑,有两种方式,二者选其一即可:
platform :ios, '7.0'
pod 'PodTestLibrary', :path => '~/code/Cocoapods/podTest/PodTestLibrary' #指定路径
pod 'PodTestLibrary', :podspec => '~/code/Cocoapods/podTest/PodTestLibrary/PodTestLibrary.podspec' #指定podspec文件
然后执行`$ pod install`命令安装依赖,打开项目工程,可以看到库文件都被加载到 Pods 子项目中了,不过它们并没有在 Pods 目录下,而是跟测试项目一样存在于Development Pods/testLibrary中,这是因为我们是在本地测试,而没有把 podspec 文件添加到 Spec Repo 中的缘故。
#### 向Spec Repo提交podspec
此步骤完成的前提是 podspec 必须通过验证且最好删掉无用的注释。然后执行提交命令:
`$ pod repo push testView testLibrary.podspec #前面是本地Repo名字 后面是podspec名字`
完成之后这个组件库就添加到我们的私有S pec Repo 中了,可以进入到`~/.cocoapods/repos/testView`目录下查看,此时远端仓库中会发现 podspec 文件也被推送上去了。至此即可使用`$ pod search`命令查看它了。
_**此处说的是添加到私有库,如果要添加到公有库则请参照上面公有库部分(使用trunk)**_
#### 使用制作好的Pod
完成上述所有步骤之后,我们就可以在自己的项目中使用刚才创建或者编辑的私有的 Pod 了。我们只需要在 Podfile 里进行相关的添加即可:
`$ pod 'testLibrary', '~> 0.0.1'`
然后执行`$ pod update`,更新相关的依赖库再打开项目即可看到此时这个库的相关文件已经在 Pods 下了,而不会是之前的 Development Pods。
#### 更新维护podspec
最后是后续的更新维护工作,类如添加新的版本,删除 Pod。
目前已经有了一个0.0.1版本的testLibrary,可以进行添加扩展的操作(在 podspec 文件使用 subspec 功能,以此添加分支)。同时可以将相关的`source_files`,`dependency`,`resource`等分开单独放在各个 subspec 下。完成之后执行`$ pod update`,验证无误之后将项目推送到远端仓库`$ git push origin master`,并更新 tag 到新的版本号(比如0.0.2)。最后使用`$ pod lib lint`验证 podspec 文件,通过则提交到 Spec Repo 中,执行命令为:
`$ pod repo push testView testLibrary.podspec`
然后再到`~/.cocoapods/repos/testView`目录下查看,会发现其已经有2个版本。同时也可以用`$ pod search`查看结果也会发现添加了新的版本。
而在使用的时候,Podfile 中内容就可以改为例如:
platform :ios, '7.0'
pod 'testLibrary/testNewOne', '0.0.2' #使用某一个部分
pod 'testLibrary/testNewTwo', '0.0.2' #使用某一个部分
pod 'testLibrary', '0.0.2' #使用整个库
如果要删除只要执行`$ pod repo remove testView`即可。
如果在删除之后需要添加回来,可以通过`$ pod repo add testView git@github.com:microyulive/testView.git`来找回。
当然如果要删除私有库下某一个指定的 podspec 则可以直接 cd 到`~/.cocoapods/repos/testView`下直接删除:
`$ rm -rf testLibrary`
然后在将此变动推送到远端仓库即可:
$ git add --all
$ git ci -m "Remove pods"
$ git push origin master
----
## 版本2
### 创建一个私有和一个公有的 Spec Repo
在你的 git 服务器上创建一个 repo。这里可以在 github 或者自己的 git 服务器上实现。

如图所示,在 github 上创建一个空的仓库,命名为 test,这个仓库是用来存放自己所有的公有库的 spec 文件,就如同官方的 https://github.com/CocoaPods/Specs 是用来存放所有官方的 specs 文件一样。
然后再新建一个名为 testView 的私有库(类型中要选择 Private )。在此相同情况下只会插入一个库的截图。
然后就可以执行:
`pod repo add REPO_NAME SOURCE_URL`
其中的 `REPO_ NAME` 是要添加的私有 repo 的名称(这里填的是: test),后面是仓库的 git 地址。这里做的其实是创建的工作,也就是在 `/.cocoapods/repo` 目录下添加了一个以你的私有 repo 为名的文件夹,但是并没有添加 spec 文件。
在终端执行命令:
`pod repo add test https://github.com/microyulive/test.git`
`pod repo add testView https://github.com/microyulive/testView.git`
这里用的是 https 地址,当然也可以用 git 地址,不过这样有可能失败。如果失败,很大因素是 github 的 ssh 在本地没有配置好,配置方法可以看这里:[Generating SSH keys](https://help.github.com/articles/generating-ssh-keys/ "https://help.github.com/articles/generating-ssh-keys/"),成功后可以看得到 .cocoapods 目录如下图所示:

testView 也一样。
至此,已经在本地得到自己的公有仓库 test 和私有仓库 testView,这是两个空的仓库。
### 在本地将私有库导入公有库中
首先在私有库 testView 下新建 .podspec 文件,此处文件名最好与 spec 名字相同,命令为:
`pod spec create testView`
然后进行与之前相似的编辑操作并返回终端,用`pod lib lint --allow-warnings`验证。验证通过之后,用`pod repo push test testView.podspec`将 testView 放入 test 中。你会发现 .cocoapods 的目录会发现了相应的变化。
此时就可以使用`pod search testView`查看是否成功。
_在编辑Podfile时,需要添加私有库的source地址,然后才能通过pod install正常使用_
source 'https://github.com/CocoaPods/Specs.git' #官方仓库地址
source ‘https://github.com/marklin2012/O2Specs.git’ #私有仓库地址
### 发布稳定的依赖库版本
由于刚才一系列操作过程中没有生成稳定的依赖库版本,一般在调试完之后需要发布。我们可以使用命令行或者在 github 页面手动生成,这里为了方便我们使用命令行。首先在终端中 cd 到之前的依赖库 testView 的目录中,然后输入如下命令:
git tag '0.0.1'
git push --tags
git push origin master
这样我们就得到了一个稳定的 release 版本 0.0.1,可以在 Github 上查看。
而对于 podspec 文件,也需要将 s.source 进行修改:
s.source = { :git => "https://github.com/microyulive/testView.git", :tag => version }