iOS使用Cocoapods创建/管理私有库(Swift)

目录步骤:

基础

  • (一 )准备工作;
  • (二) 检查库名是否被占用;
  • (三) 在远程端创建一个私有(Private)的索引库(版本库,Spec repo);
  • (四)添加(clone)远程端私有索引库到本地;
  • (五) 创建本地私有代码库工程;
  • (六) 添加自己封装的源代码、资源文件到工程指定目录下;
  • (七)配置工程中的.podspec文件;
  • (八)更新demo工程,并编译运行demo;
  • (九)通过Pod命令验证本地.podspec文件;
  • (十)通过Git命令,提交本地工程到远程端的私有代码库,并且添加tag;
  • (十一)通过Pod命令验证远程端私有代码库的.podspec文件;
  • (十二)保存.podsepc文件并提交到远程端私有索引库;
  • (十三)检验1:通过pod search私有库名命令,搜索自己的私有库;
  • (十四)检验2:新建测试项目,pod '私有库',再次检查是否可用,及注意事项;

中级

  • (十五)现有私有库的更新管理维护;
  • (十六)本地索引库管理的其他命令;

高级

  • (十七)添加依赖
  • (十八)发布到CocoaPods

分割线——————————————————————————分割线——————————————————————————分割线

(一)准备工作:

托管仓库:GitHub、码云、GitLab(本项目以GitLab为例)
管理工具:Sourcetree、终端命令:iTerm 2(本项目以iTerm 2(也是一种终端工具,比Mac的终端好用)为例)
编译工具:Xcode 12.5.1

(二) 检查库名是否被占用:

如果我们创建的库名在Cocoapods中已存在,在验证的时候没提示我们库名被占用,到最后一步提交的时候提交不到GitHub上,说我的库名已被占用,所以只能重新来一遍了。另一方面,如果你的私有库和公共库有重名的,当你在项目的Podfile文件pod你的私有库时,当pod找不到你的私有库就会去公共库搜索有没有和这个库名一样的库,如果有就会下载这个同名的公共库了,这样pod的就不是自己想引入的私有库了,所以需要在创建私有代码/索引库前检查一下自己创建的私有库的库名是否被占用。这里以SYPrivateRepoTest为私有索引库名为例:

$ pod search SYPrivateRepoTest
[!] Unable to find a pod with name, author, summary, or description matching `SYPrivateRepoTest`

如上,没有找到相关的库,说明该库没有被占用,我们可以使用这个库名。还是不放心的童鞋也可以再验证一下,比如浏览器搜索:

搜索是否有SYPrivateRepoTest相关内容

注意:要记住自己创建的私有库名一定不要跟Github上的第三方库重名,否则会搜不到。即便能搜索得到,pod进来的库也不一定是你自己的私有库,有可能是Github上重名的公共第三方库,而不是自己的私有库。因为pod集成时会先从Github上的公共第三方库查找,然后才是私有库中查找。

至此,验证就算完成,我们就可以放心的使用SYPrivateRepoTest作为我们的私有库了。

(三) 在远程端创建一个私有的索引库(版本库: Spec repo)

我这里是在GitLab上创建的私有索引库和私有代码库,根据自己的情况在相应平台创建你的私有索引库和私有代码库。
创建一个私有索引库,库名为SYPrivateRepoTest,如下图所示:

创建索引库

(四)添加(clone)远程端私有索引库到本地

  1. 将远程端私有索引库(Repo)添加到本地的~/.cocoapods/repos文件夹下,运行命令如下:
//  pod repo add SYPrivateRepoTest 【私有索引库地址,例::https://gitlab.com/degulade/syprivaterepotest.git】
$ pod repo add SYPrivateRepoTest https://gitlab.com/degulade/syprivaterepotest.git
Cloning spec repo `SYPrivateRepoTest` from `https://gitlab.com/degulade/syprivaterepotest.git`
  1. 查看~/.cocoapods/repos文件夹下clone的私有索引库,如下图:


    打开文件夹
索引库添加到本地成功

SYPrivateRepoTest文件夹是自己创建的私有索引库文件夹,存放的是自己的私有库下各个版本的.podsepc文件。

  1. 校验你本地添加的私有索引库的安装是否成功,并准备好,命令如下:
$ cd ~/.cocoapods/repos/SYPrivateRepoTest  
$ $ pod repo lint
通过验证

至此,远端索引库添加到本地成功。

(五)创建本地私有代码库工程

  • 通过终端Pod命令创建本地私有代码库模板工程(项目)

1.新建一个文件夹存放工程 ,如:PrivatePods

  1. 打开终端,cd 到存放工程的目标目录下
$ cd .../.../PrivatePods
  1. 然后,创建本地私有代码库(模板工程)到目标目录下,命令如下:
$ pod lib create SYPrivateRepoTest
  • 在创建过程中,需要配置几个信息,如下:
//  输出信息:
Cloning `https://github.com/CocoaPods/pod-template.git` into `SYPrivateRepoTest`.
Configuring SYPrivateRepoTest template.
------------------------------
To get you started we need to ask a few questions, this should only take a minute.

If this is your first time we recommend running through with the guide: 
 - https://guides.cocoapods.org/making/using-pod-lib-create.html
 ( hold cmd and double click links to open in a browser. )

//  需要配置:
# 私有库应用的平台
What platform do you want to use?? [ iOS / macOS ]  
 > iOS

# 私有库使用的编程语言
What language do you want to use?? [ Swift / ObjC ]  
 > Swift

# 是否需要在私有代码库工程中生成一个demo应用程序(项目),需要或不需要根据自己喜好选择(建议选择Yes,因为这样你可以随时查看你创建的库是否正确可用)
Would you like to include a demo application with your library? [ Yes / No ]  
 > Yes

# 是否需要使用测试框架,根据自己情况选择,我这里不需要
Which testing frameworks will you use? [ Quick / None ]  
 > None

# 是否需要做基于视图的测试,根据自己情况选择,我这里不需要
Would you like to do view based testing? [ Yes / No ]  
 > No

//  输出信息:
Running pod install on your new library.

Analyzing dependencies
Downloading dependencies
Installing SYPrivateRepoTest (0.1.0)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `SYPrivateRepoTest.xcworkspace` for this project from now on.
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

[!] Your project does not explicitly specify the CocoaPods master specs repo. Since CDN is now used as the default, you may safely remove it from your repos directory via `pod repo remove master`. To suppress this warning please add `warn_for_unused_master_specs_repo => false` to your Podfile.

 Ace! you're ready to go!
 We will start you off by opening your project in Xcode
  open 'SYPrivateRepoTest/Example/SYPrivateRepoTest.xcworkspace'

To learn more about the template see `https://github.com/CocoaPods/pod-template.git`.
To learn more about creating a new pod, see `https://guides.cocoapods.org/making/making-a-cocoapod`.

至此,本地私有代码库模板工程创建完成。

  • 若选择了创建demo工程,本地私有代码库模板工程创建完成后,会自动打开demo工程pod lib create [工程名]命令,会自动创建.podspec文件、README.md文件和LICENSE开源协议文件等:
    image.png
  1. 终端cd 到PrivatePods目录下,运行tree命令查看本地私有代码库模板工程目录结构,如下:
$ cd /.../.../PrivatePods
$ tree SYPrivateRepoTest -L 2
SYPrivateRepoTest
├── Example                                                      # demo工程文件夹
│   ├── Podfile                                                    # demo的依赖描述文件
│   ├── Podfile.lock
│   ├── Pods                                                      # demo依赖的第三方库文件夹
│   ├── SYPrivateRepoTest
│   ├── SYPrivateRepoTest.xcodeproj
│   ├── SYPrivateRepoTest.xcworkspace
│   └── Tests
├── LICENSE                                                    # 开源协议,默认MIT
├── README.md
├── SYPrivateRepoTest                                    # 存放源代码和资源文件的文件夹
│   ├── Assets                                                   # 存放资源文件的文件夹
│   └── Classes                                                 # 存放源文件的文件夹
├── SYPrivateRepoTest.podspec                     # 库的配置文件
└── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj

10 directories, 5 files
  • 如果tree报错,可通过brew 安装 tree,命令:$ brew install tree

  • 文件夹目录结构(Example文件夹下是demo工程,SYPrivateRepoTest文件夹下是存放私有代码库源代码文件、资源文件等),如下图:

文件夹目录.png
  • Xcode打开的demo工程目录,如下图:
demo工程目录.png

(六) 添加自己封装的源代码、资源文件到工程指定目录下:

  1. 在Xcode打开的demo工程目录下的pod中,找到ReplaceMe.swift文件,右击Show in Finder,查看源文件存放的真正目录位置。Classes文件夹存放源代码文件,Assets文件夹存放资源文件。
ReplaceMe.swift
  1. 将自己封装的源代码文件放到Classes文件夹下、把资源文件放到Assets文件夹下即可。可以将无用的ReplaceMe.swift文件删除。
    添加后的目录,如下图:


    路径说明
//  说明①:源代码文件存放总路径
//  说明②:文件夹分块存储
//  说明③:源文件

注意:如果你不想用系统自动帮你创建的Classes和Assets文件夹,那么你可以直接删掉,根据自己喜好重新创建/存放相关文件夹。切记不要忘记修改.podspec文件中相应的路径配置,否则会由于路径问题,验证的时候找不到对应的文件而验证失败

(七)配置工程中的.podspec文件:

.podspec文描述了Pod库的一个版本。一个索引库,随着时间的推移,将有许多的版本。它包括关于应该从何处获取源、使用什么文件、应用构建设置以及其他通用元数据(如其名称、版本和描述)的详细信息。
Specs Repo是GitHub上的存储库,其中包含所有可用pods的列表。每个库都有一个单独的文件夹,其中包含该pod可用版本的子文件夹。

  1. 在Xcode打开的demo工程中,找到Podspec Metadata文件夹下的工程名.podspec文件:


    SYPrivateRepoTest.podspec
  2. 我的.podspec配置:
  # 工程名称
  s.name             = 'SYPrivateRepoTest'
  # 版本号
  s.version          = '1.0.0'
  # 介绍
  s.summary          = '这是一个私有库测试.'
  # 描述内容
  s.description      = '这是私有库测试,这是一个私有库测试,这是一个私有库测试...'
  # 主页,这里要填写可以访问到的地址,不然验证不通过
  s.homepage         = 'https://gitlab.com/degulade'
  # 开源协议
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  # 作者信息
  s.author           = { '秦紫阳' => 'degulade@foxmail.com' }
  # 远程端私有代码库地址,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
  s.source           = { :git => 'https://gitlab.com/degulade/syprivaterepotest.git', :tag => s.version.to_s }
  # 支持的平台及版本
  s.ios.deployment_target = '9.0'
  # 文件路径,**/*表示Classes目录及其子目录下所有文件,如果有多个目录下则用逗号分开,如果需要在项目中分组显示,这里也要做相应的设置
  s.source_files     = 'SYPrivateRepoTest/Classes/**/*' ,'SYPrivateRepoTest/Classes/Field1/*' ,'SYPrivateRepoTest/Classes/Field2/*'
  # 图片资源,子目录同上
  # s.resources        = "SYPrivateRepoTest/Assets/*"
  # 项目中使用的Swift版本,多个用“,”隔开
  s.swift_version    = '4.0'

.podspec文件中的配置参数说明,请参见Cocoapods-Podspec语法参考 或者 使用Cocoapods创建/管理公共库

(八)更新demo工程,并编译运行demo

  1. 终端运行命令,cd到Example文件夹目录下,
  2. 然后运行pod install或pod update命令更新demo工程:
$ pod install
Analyzing dependencies
Downloading dependencies
Installing SYPrivateRepoTest 1.0.0 (was 0.1.0)
Generating Pods project
Integrating client project
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
  1. 并在Xcode中编译运行demo,看是否有错误,有错误及时修改,保证能运行成功。有错误存在会验证不通过。
运行成功

(九)通过Pod命令验证本地.podspec文件:

该验证过程不会访问网络,且仅仅是一个验证不会添加文件到某文件夹下。

  • 终端下,cd到SYPrivateRepoTest文件夹下,运行pod lib lint --allow-warnings验证命令,如下:
// --allow-warnings参数:允许忽略警告
$ pod lib lint --allow-warnings

 -> SYPrivateRepoTest (1.0.0)
    - NOTE  | xcodebuild:  note: Using new build system
    - NOTE  | xcodebuild:  note: Building targets in parallel
    - NOTE  | xcodebuild:  note: Using codesigning identity override: -
    - NOTE  | xcodebuild:  note: Build preparation complete
    - NOTE  | [iOS] xcodebuild:  note: Planning build
    - NOTE  | [iOS] xcodebuild:  note: Analyzing workspace
    - NOTE  | [iOS] xcodebuild:  note: Constructing build description
    - NOTE  | [iOS] xcodebuild:  warning: Skipping code signing because the target does not have an Info.plist file and one is not being generated automatically. (in target 'App' from project 'App')

SYPrivateRepoTest passed validation.  //  passed validation表示验证通过

注意:若验证过程中有错误,验证失败,修改后再次验证直到通过验证

(十)通过Git命令,提交本地工程到远程端的私有代码库,并且添加tag

  • 提交本地工程到代码库(一定要用库的https地址)
$ git add .  或者  $ git add -A
$ git status  # 显示代码状态
//  略
$ git commit -m '提交的描述内容'
//  略
$ git remote add origin https://gitlab.com/degulade/syprivaterepotest.git     # 远端库的https地址  
$ git push -u origin master  
//  执行结果:
Enumerating objects: 75, done.
Counting objects: 100% (75/75), done.
Delta compression using up to 6 threads
Compressing objects: 100% (67/67), done.
Writing objects: 100% (75/75), 28.16 KiB | 4.02 MiB/s, done.
Total 75 (delta 16), reused 0 (delta 0), pack-reused 0
remote:
remote: To create a merge request for master, visit:
remote:   https://gitlab.com/degulade/syprivaterepotest/-/merge_requests/new?merge_request%5Bsource_branch%5D=master
remote:
To https://gitlab.com/degulade/syprivaterepotest.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
  • 添加tag(每次提交之后一定要添加tag)
$ git tag # 查看所有版本号
$ git tag 1.0.0 # 添加当前版本号
$ git tag # 再次查看所有版本号
1.0.0
$ git push --tags # 推送当前版本
// 执行结果:
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To https://gitlab.com/degulade/syprivaterepotest.git
 * [new tag]         1.0.0 -> 1.0.0

上传完代码后,别忘了为这次提交添加tag,否则下一步验证会有问题,找不到相应版本的.podspec文件。

注意:添加的git tag 版本号版本号必须和.podspec文件中的s.version = '版本号'一致。

(十一)通过Pod命令验证远程端私有代码库的.podspec文件

该验证过程检查的是远程端的repo和相关tag标记,需要网络。
终端运行命令如下:

$ pod spec lint --allow-warnings

 -> SYPrivateRepoTest (1.0.0)
    - NOTE  | xcodebuild:  note: Using new build system
    - NOTE  | xcodebuild:  note: Building targets in parallel
    - NOTE  | xcodebuild:  note: Using codesigning identity override: -
    - NOTE  | xcodebuild:  note: Build preparation complete
    - NOTE  | [iOS] xcodebuild:  note: Planning build
    - NOTE  | [iOS] xcodebuild:  note: Analyzing workspace
    - NOTE  | [iOS] xcodebuild:  note: Constructing build description
    - NOTE  | [iOS] xcodebuild:  warning: Skipping code signing because the target does not have an Info.plist file and one is not being generated automatically. (in target 'App' from project 'App')

Analyzed 1 podspec.

SYPrivateRepoTest.podspec passed validation.  # 验证成功

pod spec lint命令,是用来验证.podspec文件及其他信息的规范。
注意:您的podspec应该在没有任何错误或警告的情况下通过。若验证过程中有错误,验证失败,修改后再次验证,直到通过验证。

(十二)保存.podsepc文件并提交到远程端私有索引库

将.podspec文件提交到远程端私有索引库,运行命令如下:

$ pod repo push SYPrivateRepoTest SYPrivateRepoTest.podspec

//  执行结果:
Validating spec
 -> SYPrivateRepoTest (1.0.0)  # 1. 验证规范
    - NOTE  | xcodebuild:  note: Using new build system
    - NOTE  | xcodebuild:  note: Building targets in parallel
    - NOTE  | xcodebuild:  note: Using codesigning identity override: -
    - NOTE  | xcodebuild:  note: Build preparation complete
    - NOTE  | [iOS] xcodebuild:  note: Planning build
    - NOTE  | [iOS] xcodebuild:  note: Analyzing workspace
    - NOTE  | [iOS] xcodebuild:  note: Constructing build description
    - NOTE  | [iOS] xcodebuild:  warning: Skipping code signing because the target does not have an Info.plist file and one is not being generated automatically. (in target 'App' from project 'App')

Updating the `SYPrivateRepoTest' repo  # 2. 更新repo

Adding the spec to the `SYPrivateRepoTest' repo # 3. 添加到本地repo

 - [Add] SYPrivateRepoTest (1.0.0)

Pushing the `SYPrivateRepoTest' repo # 4. 提交到远程端的私有索引库

pod repo push [REPO] [NAME.podspec]此命令的执行经历了四个步骤:

  1. 验证spec文件及其他信息的规范
  2. 更新本地的repo索引库
  3. 添加工程中的spec文件到本地的私有索引库中(会自动创建工程文件夹和版本文件夹)
  4. 提交spec文件到远程端的私有索引库中

至此就完成了私有库的创建。

(十三)检验1:通过pod search私有库名命令,搜索自己的私有库

  • 私有库已经创建成功,搜索我们的私有库,运行:
$ pod search SYPrivateRepoTest

//  执行结果:
-> SYPrivateRepoTest (1.0.0)
   这是一个私有库测试.
   pod 'SYPrivateRepoTest', '~> 1.0.0'
   - Homepage: https://gitlab.com/degulade
   - Source:   https://gitlab.com/degulade/syprivaterepotest.git
   - Versions: 1.0.0 [SYPrivateRepoTest repo]
(END)

(十四)检验2:新建测试项目,pod '私有库',再次检查是否可用,及注意事项

新建一个工程,在Podfile文件中pod我们的私有库,pod 'SYPrivateRepoTest'

注意:
1)引入私有库的时候,除了pod 'SYPrivateRepoTest'外,还需要通过source引入私有库对应的索引库地址,如:

source 'https://gitlab.com/degulade/syprivaterepotest.git' # 自己的私有索引库地址。

2)若你的私有库还依赖了第三方公共库或者自己的其他私有库,第三方公共库或者自己的其他私有库对应的索引库地址也需要引入。

导入示例如下:

target 'TestDemo' do
  use_frameworks!

  # 自己的私有索引库地址  
  source 'https://gitlab.com/degulade/syprivaterepotest.git' 
# 公共索引库地址
  source 'https://github.com/CocoaPods/Specs.git' 
    
  pod 'SYPrivateRepoTest'
  
end

cd到测试项目路径下,运行pod install

$ pod install
Analyzing dependencies
Downloading dependencies
Installing SYPrivateRepoTest (1.0.0)
Generating Pods project
Integrating client project
Pod installation complete! There are 7 dependencies from the Podfile and 7 total pods installed.

[!] Automatically assigning platform `iOS` with version `14.0` on target `SimpleNeteaseMusic` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.

注意:source 后边是索引库(版本库)的地址,而不是代码库的地址。
若不引入索引库地址,在pod install时会报找不到你的私有库的错误,或者其他错误。
执行 pod install 命令时,会拉取远程 Podflie 中 source 标记的版本库到本地的 repos 文件夹中,然后在 版本库 中搜索我们pod ' SYPrivateRepoTest' 的 SYPrivateRepoTest.podspec 文件。根据 SYPrivateRepoTest.podspec 文件中描述的源码地址下载并整合到项目中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容