在组件化的路上实现cocopods私有仓库
1.spec repository 和 code repository
大家很容易把spec repository 和 code repository弄混,我一开始就在这里挂起了好久。
1.code repository是代码仓库,我们把包代码上传到这个仓库。
2.spec repository是配置仓库,所有的配置按照包名、版本号分门别类的存放在这个仓库。这个仓库只用来存放spec文件,不存放代码。
2.创建私有的CocoaPods仓库。
1.创建并设置一个私有的Spec Repository。
我们创建Spec Repository是基于gitlab的,当让你也可以用其他的方式例如(开源中国、CODING、Bitbucket以及CSDN Code.)。我们在github上创建一个空的仓库,命名为MySpecs,这个仓库是用来存放我们自己所有的私有库的spec文件,就如同官方的https://github.com/CocoaPods/Specs是用来存放所有官方的specs文件一样。
终端命令执行:
pod repo add MySpecs http://njGitrepo/wushuanghong/MySpecs.git
注意:上面的命令的解释如下:
pod repo add REPO_NAME SOURCE_URL
其中的 REPO_NAME 是我们要添加的私有repo的名称(这里我们待会填的是: MySpecs),后面是仓库的 gitlab 地址。这里做的其实是创建的工作,也就是在~/.cocoapods/repo目录下添加了一个以你的私有repo为名的文件夹,但是并没有添加spec文件。
然后你可以到~/.cocoapods/repo文件中去看是否有MySpecs文件。如果有那么我们已经在本地得到我们自己的私有仓库 MySpecs ,这是一个空的仓库。
3.制作 CocoaPods 依赖库
1.创建并设置一个私有的code Repository。
当然如上我们还是使用的是gitlab(可以基于公司内网,也可以是外网)。
2.clone仓库到本地
为了方便向仓库中删减内容,需要将仓库 clone 到本地,这里有多种操作方式,可以选择你喜欢的一种,但是为了方便这边选择使用命令行。首先需要切换到你想在本地存储的目录,然后再 clone ,假设你放在用户的根目录上:
cd ~
git clone http://xxxx/xxx/PGQTestPodSpec.git
完成后,我们进入到 ~/PGQTestPodSpec 目录,这时候你看到是一个空文件夹,这由于我用的是gitlab创建的,没有像github网页那样在创建code Repository的时候可以勾选创建LICENSE和README.md文件。其实也不是什么都没有,实际上是有一个隐藏的 .git 文件,后续我们的所有文件都在这个目录下进行。
注意:打开隐藏目录,可以使用命令,接着需要重启一下 Finder, 可以按住 option + 右键 Finder 图标选择重启。
//打开隐藏的命令:
defaults write com.apple.finder AppleShowAllFiles -bool true
//关闭隐藏的命令:
defaults write com.apple.finder AppleShowAllFiles -bool false
3.向本地仓库中添加创建 Pods 依赖库所需的文件
这个代码库需要手动在外面创建好.podspec、LICENSE、README.md以及代码文件和一些资源文件并拖动到,当然你在其他的git服务上需要创建的基本都是这几种文件。
1).每个 Pods 依赖库必须有且仅有一个名称和依赖库名保持一致,后缀名为 .podspec 的描述文件。这里我们依赖库的描述文件名称应该为 PGQTestPodSpec.podspec。
2).创建这个.podspec 的描述文件有两种途径:
a.复制已有的 podspec 文件然后修改对应的参数。
b.执行命令行创建。
我们使用命令行:
pod spec create PGQTestPodSpec
编辑PGQTestPodSpec.podspec 里面有很多东西是我们不需要的,我们可以用文本编辑器打开并删除我们不需要的内容。
Pod::Spec.new do |s|
s.name = 'PGQPodSpecTest'
s.version = '0.0.1'
s.license = 'MIT'
s.summary = 'test'
s.description = <<-DESC
Test for personal pod spec
DESC
s.homepage = 'http://121.196.211.217/wordoor_ios/PGQPodSpecTest'
s.authors = { 'Loissoul' => '[email protected]' }
s.source = { :git => ['http://121.196.211.217/wordoor_ios/PGQPodSpecTest.git'], :tag => "v#{s.version}" }
s.platform = :ios, '8.0' #支持的平台及版本
s.source_files = 'PodTestDemo/PodTestDemo/PodTest/**/*'
end
3).README.md
使用 github 的人应该都熟悉这个文件,它使一个成功的 github 仓库必不可少的一部分,使用 markdown 对仓库进行详细说明。
4).LICENSE 文件
CocoaPods 强制要求所有的 Pods 依赖库都必须有 license 文件,否则验证不会通过。 license 文件有很多中,详情可以参考 tldrlegal。前面我们已经选择创建了一个 MIT 类型的 license。
4.提交修改到code Repository
在提交之前我们先对需要添加的pod进行一下验证,验证有两种方式:
a.本地验证
pod lib lint
b.从本地和远程去验证 (我们通常使用这一种)
pod spec lint
如果你刚才没有给PGQPodSpecTest.podspec的s.source指定tag,就有可能有warn警告,执行下面的命令:
pod lib lint --allow-warnings
如出现
- fatal: Remote branch 0.0.1 not found in upstream origin
- ERROR | [iOS] unknown: Encountered an unknown error ([!] /usr/bin/git clone https://github.com/xxx/PodTest.git /var/folders/14/95vmx0495_s5292ltvwpsc8h0000gn/T/d20170111-11240-1l3iq9n --template= --single-branch --depth 1 --branch 0.0.1
Cloning into '/var/folders/14/95vmx0495_s5292ltvwpsc8h0000gn/T/d20170111-11240-1l3iq9n'...
warning: Could not find remote branch 0.0.1 to clone.
fatal: Remote branch 0.0.1 not found in upstream origin
) during validation.
Analyzed 1 podspec.
[!] The spec did not pass validation, due to 1 error.
[!] The validator for Swift projects uses Swift 3.0 by default, if you are using a different version of swift you can use a `.swift-version` file to set the version for your Pod. For example to use Swift 2.3, run:
`echo "2.3" > .swift-version`.
这是因为在你托管代码的库里(这里是指github)找不到这个分支, 也就是在编辑 PGQPodSpecTest.podspec时, 里面的字段s.verson, s.source 中的 tag与github创建的release版本号不一致导致, 修改为一样即可!(如我上面的tag标注 即可)。
验证成功之后,我们只要把代码提交到 gitlab 仓库,就可以了,参考命令:
git add -A && git commit -m "add pod files"
git push origin master
到现在为止,我们的 CocoaPods 依赖库就已经准备好了,但是现在你还不能在你的工程中使用它。如果你想成为一个真正可用的依赖库,还需要最后一步操作:将刚才生产的 podspec 文件提交到 我们在上面创建的私有Spec Repository上。
5.提交podspec到私有Spec Repository
pod repo push MySpecs PGQPodSpecTest.podspec
pod push成功后,查找自己的框架找不到的解决方法,如pod push了xxx,然后pod search xxx
提示
[!] Unable to find a pod with name, author, summary, or description matching `xxx`
解决方法就是Finder前往资源库去删除缓存中的search_index.json(targetcloud修改成你自己的)
/Users/xxx/Library/Caches/CocoaPods删除search_index.json
然后再输入pod search(查看第三方框架仓库源 pod repo)时会重新创建这个search_index.json
按wq退出search
4.如何引用 CocoaPods 依赖库
1.让我们建立一个普通的工程,命名为 TestPodDemo,然后在终端 cd 到其目录路径下,添加一个 Podfile 文件:
建立后修改 Podfile 文件内容如下:
source 'https://github.com/CocoaPods/Specs.git' #官方仓库地址
source ‘http://xxx/xxxx/PGQPodSpecTest.git’ #私有仓库地址
use_frameworks!
target 'TestPodDemo' do
pod ‘PGQPodSpecTest’
end
执行:
pod install
这样一来我们就可以使用这个私有库了!
2.更新维护podspec。
当我们的代码变动时,首先需要更新code Repository中的.podspec 文件的版本,然后push到 Spec Repository。
参考资料
Creating a Private CocoaPod
Developing Private In-House Libraries with CocoaPods