CocoaPods私有库

作者: rapunzelyeah | 来源:发表于2017-12-29 13:57 被阅读201次

本文主要介绍CocoaPods私有库的创建,做这件事的主要起因是,公司接过来一个外包的项目,项目中用到了他们的私有库,pod中可以看到源码,虽然直接将源码添加到工程中也是可行的,但本着学一点是一点的思想,借此机会尝试一下自己做一个私有库。

首先需要明确一个概念,私有仓库和私有库,类比CocoaPods的官方仓库,私有仓库就是整个库,其中会包含多个私有库以及同一个私有库的不同版本,在本机~/.cocoapods/repos/路径下,CocoaPods官方仓库位于master文件夹中,~/.cocoapods/repos/master/Specs文件夹下保存的就是各个开源库的podspec文件。在终端执行pod repo list可以查看本地仓库,名字为master的就是官方仓库。

因此,在私有库创建之前,首先要创建一个私有的仓库:

创建CocoaPods私有仓库

创建私有仓库,可以在gitlab,github,coding等网站中直接创建即可,这里不详细描述。这里我用的是coding的git,创建后可以得到仓库的git地址,需要在本地添加仓库。

# pod repo add REPO_NAME SOURCE_URL
pod repo add TestRepository https://git.coding.net/rapunzel/TestRepository.git

添加后可以在本地查看是否添加成功。

pod repo list

成功后可以看到输出:


本地仓库列表

或者也可以直接查看~/.cocoapods/repos/文件夹,如果有名字为刚才添加的REPO_NAME的文件夹,那就说明repo add成功。

本地仓库可以做删除和更新等操作:

pod repo remove REPO_NAME
pod repo update

添加私有库代码

在私有仓库中添加源码,这里暂时先上传一个文件夹,后面会在podspec中引用这个文件夹。


1609c8c53e691ad0.png

给私有库打tag,这个tag表示后面podspec文件中的引用版本,因此,每次重新编辑后,要重新打tag,然后再更新podspec文件,生成新版本的pod库。

git tag '0.0.1' 
或者 git tag -a 0.0.1 -m 'version 0.0.1'
git push --tags

创建私有库

在前面创建仓库,添加代码,打标签等操作都完成后,就可以真正开始创建私有库了,这里主要分为几个步骤:

1. 创建podspec文件
2. 编辑podspec文件
3. 验证podspec文件
4. 本地调用验证
5. 将podspec文件推送到远程仓库

创建podspec文件

首先进入到库目录下:

cd /Users/masaike/.cocoapods/repos/TestRepository/PodTestAlertView

执行创建podspec文件语句:

pod spec create SPEC_NAME

在目录下会出现一个PodTestAlertView.podspec文件,可以使用sublime打开。可以看到里面有很多信息需要补充:

Pod::Spec.new do |s|

  # ―――  Spec Metadata  ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
  #
  #  These will help people to find your library, and whilst it
  #  can feel like a chore to fill in it's definitely to your advantage. The
  #  summary should be tweet-length, and the description more in depth.
  #

  s.name         = "PodTestAlertView"
  s.version      = "0.0.1"
  s.summary      = "A short description of PodTestAlertView."
  #此处省略一万字
end

编辑podspec文件(大概介绍一下podspec文件中的每个字段的含义)

字段 含义
name 库名称,即pod search POD_NAME中的POD_NAME字段
version 库版本,这里需要和上面的tag版本相同
homepage 表示匹配所有子目录
license 这个不是很了解,暂时使用MIT
author 一般会根据本地的git账户自动填好
platform / deployment_target 单平台用platform,多平台使用deployment_tartet
source git字段填写仓库地址,后面可以使用tag指定标签,也可以使用commit指定某一次提交
source_files 指定库源文件的位置,如果仓库中包含多个pod库,那么在引用pod库时,则需要指定是什么库的文件
resource / resources 资源文件,和source_files格式类似
framework / frameworks 去掉.framework后缀,多个framework以逗号分隔,例如使用UIKit.frameworkFoundation.framework,则为s.frameworks = "UIKit", "Foundation"
library / libraries 去掉名字中的lib和.tbd等后缀,多个lib以逗号分隔,例如使用libsqlite3.0.tbdlibc++.tbd,则为s.libraries = "sqlite3.0", "c++"
dependency 依赖的第三方库,可以指定版本,例如s.dependency "JSONKit", "~> 1.4",也可以不指定版本,例如s.dependency "JSONKit"将默认使用最新版本;这里也可以使用自己的私有库,使用私有库在验证podspec时需要进行私有库地址的搜索,添加--sources = 'SOURCE_URL1, SOURCE_URL2',否则只会在官方仓库搜索,导致依赖库找不到的问题

source_files字段,表示在仓库中寻找并添加的文件类型,需要指定要添加的文件路径。例如我的目录中,这个字段就可以写成s.source_files = "PodTestAlertView/*.{h,m}"

source_files字段 匹配文件类型
* 表示匹配所有文件
*.{h,m} 表示匹配所有以.h和.m的文件
** 表示匹配所有子目录

编辑后的podspec文件大概如下:

Pod::Spec.new do |s|

  s.name         = "PodTestAlertView"
  s.version      = "0.0.3"
  s.summary      = "A short description of PodTestAlertView."
  s.homepage     = "http://EXAMPLE/PodTestAlertView"
  s.license      = "MIT"
  s.author       = "zhangmj"
  s.platform     = :ios, "8.0"
  s.source       = { :git => "https://git.coding.net/rapunzel/TestRepository.git", :tag => "#{s.version}" }
  s.source_files = "PodTestAlertView/*.{h,m}"
  s.frameworks   = "UIKit"
  s.dependency "IQKeyboardManager"

end

验证podspec文件

验证podspec文件命令:

pod spec lint SPEC_NAME.podspec

输出验证结果:


验证结果

可以看到输出中,会有很多WARN,警告的结果就是最后说The spec did not pass validation,不过它也给出了解决方案,就是you can use '--allow-warnings' to ignore them,修改验证指令:

pod spec lint SPEC_NAME.podspec --allow-warnings

忽略警告后,验证通过:


验证通过

验证过程中也可能由于代码问题,出现代码编译方面的error,可以添加--verbose来查看详细的log:

pod spec lint SPEC_NAME.podspec --verbose

根据其中提示的代码方面的错误,库引用方面的错误,修改代码,上传更新,重新打标签,修改podspec文件的引用版本,继续验证。

这里如果在依赖时调用了自己的库,则需要在后面添加私有库地址的SOURCE_URL,因为验证时默认只搜索官方仓库,例:

pod spec lint --allow-warnings SPEC_NAME.podspec --sources='YOUR_PRIVATE_SOURCE_URL, https://github.com/CocoaPods/Specs.git'

本地调用验证

验证podspec文件的正确性后,可以在本地先进行一次安装,没问题后再推送到仓库,修改podfile,指定podspec地址为本地的地址:

pod 'PodTestAlertView', :podspec => '/Users/masaike/.cocoapods/repos/TestRepository/PodTestAlertView/PodTestAlertView.podspec'

成功安装!在做这行之前,我心里是拒绝红色和绿色同时出现的,但在终端里,这个红配绿是夺么和谐!


安装成功

将podspec文件推送到远程仓库

本地验证通过后就可以上传版本了,推送podspec文件使用指令:

pod repo push REPO_NAME SPEC_NAME.podspec

如果在上一步验证时使用了--allow-warnings来忽略警告,在推送podspec文件时也需要忽略警告:

pod repo push REPO_NAME SPEC_NAME.podspec --allow-warnings

开始推送后,一般会报一个错误[!] The repo 'TestRepository' at '..' is not clean,原因是podspec文件是直接在repo下生成的,本地的repo
和远程仓库相比,多了一个podspec文件,所以可以选择将podspec文件移到别的位置,让本地的repo和远程保持同步,重新推送。

Validating spec
 -> PodTestAlertView (0.0.3)
    - WARN  | homepage: The homepage has not been updated from default
    - WARN  | summary: The summary is not meaningful.
    Updating the 'TestRepository' repo

From https://git.coding.net/rapunzel/TestRepository
 * [new tag]         0.0.1      -> 0.0.1
 * [new tag]         0.0.2      -> 0.0.2
 * [new tag]         0.0.3      -> 0.0.3
Already up-to-date.

Adding the spec to the 'TestRepository' repo

 - [Update] PodTestAlertView (0.0.3)

Pushing the 'TestRepository' repo

推送成功后,远程仓库和本地repo都可以看到一个名字和version相同的文件夹,里面包含刚才添加的podspec文件,代表这个版本的podspec文件,然后就可以试试使用私有库了~

使用私有库

在podfile中添加私有仓库地址,同时也要添加官方仓库地址,否则只会在私有仓库中搜索:

source 'https://git.coding.net/rapunzel/TestRepository.git' #私有仓库地址
source 'https://github.com/CocoaPods/Specs.git' #官方仓库地址

platform:ios, '8.0'

target 'test' do  #工程名称

    #三方开源
    pod 'IQKeyboardManager'
    #私有库
    pod 'PodTestAlertView'
    
end

如果可以成功安装,那就ok啦!

一些问题

引用的文件生成的framework,此处感谢此分享的提示

在podspec文件中有一个字段是vendored_frameworks,可以使用自己生成的framework:

s.vendored_frameworks = 'Pod/Assets/*.framework'

然后在验证和push到远程仓库时需要添加--user-libraries

git push origin master比较慢

如果和我一样用的是Coding,那可能是它给你的圣诞节彩蛋= =

这是一个彩蛋

其实还有一个文件夹目录的问题,但是不知道为什么,没有办法复现了,所以先不记录这一条了。

感谢资源分享

创建Podspec描述文件

使用CocoaPods创建私有库

使用Cocoapods创建私有podspec

iOS CocoaPods 私有库 steps and tips

相关文章

网友评论

    本文标题:CocoaPods私有库

    本文链接:https://www.haomeiwen.com/subject/lkmigxtx.html