如何制作Pod库

需求:

  1. 管理一些常用的类或者第三方的SDK;
  2. 组件化开发;

具体步骤:

1. 打开终端,进入要建立私有库项目工程的路径,并执行pod lib create [pod name] 创建并下载Cocoapods模板;

过程中会有一些选项,按需选择即可,所有选项选择完成后会自动打开工程。

选项如下:

➜  XHC-iOS-Libs pod lib create EncryptionMethods
Cloning `https://github.com/CocoaPods/pod-template.git` into `EncryptionMethods`.
Configuring EncryptionMethods 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 ]
 > objc

Would you like to include a demo application with your library? [ Yes / No ]
 > no

Which testing frameworks will you use? [ Specta / Kiwi / None ]
 > none

Would you like to do view based testing? [ Yes / No ]
 > no

What is your class prefix?
 > LS

Running pod install on your new library.

Analyzing dependencies
Fetching podspec for `EncryptionMethods` from `../`
Downloading dependencies
Installing EncryptionMethods (0.1.0)
Generating Pods project
Integrating client project

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

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

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

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

2. 添加源码文件

将源码文件复制到文件夹路径:[YourPodName]/[YourPodName]/Classes 下,如图:

代码放置路径.png
3. 创建私有库获取 git 地址,并完善[YourPodName].podspec 配置文件

复制链接,下面编辑 [YourPodName].podspec 更改 s.homepages.source 使用

私有库地址.png
4. 编辑 CocoaPods 配置文件 [YourPodName].podspec(可以直接在 Xcode 中编辑,也可以用 Sublime Text 或 Visual Studio Code 等编辑都可以)

我的编辑,仅做参考

s.summary          = 'XHC EncryptionMethods pod Use.'
s.homepage         = 'http://172.17.0.18/XHC-iOS-Libs/EncryptionMethods.git'
s.source           = { :git => 'http://172.17.0.18/XHC-iOS-Libs/EncryptionMethods.git', :tag => s.version.to_s }
  • 如果 homepage 有更好的展示页面,可以直接填你的展示页面;
  • 如果是 MRC 的,不支持 ARC 可添加下面代码 ;
s.requires_arc = false
  • 还有其他一些属性配置,有兴趣的小伙伴可以自己试试;
编辑podspec.png
5. 进入我们的 Example 文件,执行 pod update --no-repo-update 指令,安装本地库源码
➜  Example git:(master) ✗ pod update --no-repo-update
Update all pods
Analyzing dependencies
Fetching podspec for `EncryptionMethods` from `../`
Downloading dependencies
Installing EncryptionMethods 0.1.0
Generating Pods project
Integrating client project
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

查看 Example 下的项目已经导入成功


pod 库导入.png
5. 本地 pod 配置文件验证合法性

为了保证项目的正确性,尤其是 pod 配置文件的正确性,在正式提交前,我们需要执行以下本地验证。在本地验证正常的情况下,再上传发布还是比较稳妥的。

返回我们的项目根目录,执行 pod 本地验证指令:

  • pod lib lint (如果有错误,可能会产生很多警告⚠️和错误❌)
  • 其他参数:
Usage:

    $ pod lib lint

      Validates the Pod using the files in the working directory.

Options:

    --quick                                           Lint skips checks that would
                                                      require to download and build
                                                      the spec
    --allow-warnings                                  Lint validates even if warnings
                                                      are present
    --subspec=NAME                                    Lint validates only the given
                                                      subspec
    --no-subspecs                                     Lint skips validation of
                                                      subspecs
    --no-clean                                        Lint leaves the build directory
                                                      intact for inspection
    --fail-fast                                       Lint stops on the first failing
                                                      platform or subspec
    --use-libraries                                   Lint uses static libraries to
                                                      install the spec
    --use-modular-headers                             Lint uses modular headers during
                                                      installation
    --sources=https://github.com/artsy/Specs,master   The sources from which to pull
                                                      dependent pods (defaults to
                                                      https://github.com/CocoaPods/Specs.git).
                                                      Multiple sources must be
                                                      comma-delimited.
    --platforms=ios,macos                             Lint against specific
                                                      platforms(defaults to all
                                                      platforms supported by the
                                                      podspec).Multiple platforms must
                                                      be comma-delimited
    --private                                         Lint skips checks that apply
                                                      only to public specs
    --swift-version=VERSION                           The SWIFT_VERSION that should be
                                                      used to lint the spec. This
                                                      takes precedence over a
                                                      .swift-version file.
    --skip-import-validation                          Lint skips validating that the
                                                      pod can be imported
    --skip-tests                                      Lint skips building and running
                                                      tests during validation
    --silent                                          Show nothing
    --verbose                                         Show more debugging information
    --no-ansi                                         Show output without ANSI codes
    --help                                            Show help banner of specified
                                                      command

终端展示如下:

➜  EncryptionMethods git:(master) ✗ pod lib lint         

 -> EncryptionMethods (0.1.0)
    - NOTE  | xcodebuild:  note: Using new build system
    - NOTE  | [iOS] xcodebuild:  note: Planning build
    - NOTE  | [iOS] xcodebuild:  note: Constructing build description

EncryptionMethods passed validation.
➜  EncryptionMethods git:(master) ✗ pod lib lint --allow-warnings   

 -> EncryptionMethods (0.1.0)
    - NOTE  | xcodebuild:  note: Using new build system
    - NOTE  | [iOS] xcodebuild:  note: Planning build
    - NOTE  | [iOS] xcodebuild:  note: Constructing build description

EncryptionMethods passed validation.
➜  EncryptionMethods git:(master) ✗ 

  • 如果出现警告⚠️ - WARN | summary: The summary is not meaningful.
    编辑更改一下 s.summary 即可消除警告
  • pod lib lint --verbose 可查看详细的 log
    podspec 本地验证成功.png

至此,我们的源码已经导入、样例工程已经验证执行、podspec 配置文件本地已经验证,那么我们是不是就可以直接在 pod 里面使用了呢?答案是不行的!目前只是处于本地状态,并没有发布,所以还是不能使用的。

6. pod 库项目发布到私有仓库

在项目工程文件下执行 git 相关指令,并添加 tag ,发布到 git
分别执行以下命令

➜  EncryptionMethods git:(master) ✗ git remote add origin http://172.17.0.18/XHC-iOS-Libs/EncryptionMethods.git
➜  EncryptionMethods git:(master) ✗ git add .
➜  EncryptionMethods git:(master) ✗ git commit -m "v0.1.0"      
➜  EncryptionMethods git:(master) git push origin master 
➜  EncryptionMethods git:(master) git tag 0.1.0
➜  EncryptionMethods git:(master) git push origin 0.1.0 

相关指令执行结束后,此时我们再去看我们的 git 项目:


项目发布.png

现在我们就可以直接在 Podfile 文件中添加如下代码就可以用 pod 来添加我们的库了

pod 'EncryptionMethods', :git => 'http://172.17.0.18/XHC-iOS-Libs/EncryptionMethods.git'

但是机智的同学发下此时执行 pod search EncryptionMethods并不能找到相关的库,提示如下:

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

为了能让 pod 搜索到我们的库,我们还需要把我们的 EncryptionMethods.podspec 文件发布到我们的 PodSpecs 库,方便我们管理各种 pod 库

7. 发布 .podspec 文件到私有库
  • 首先我们需要创建自己的 Specs 管理库;
  • 创建之后获取到 git 地址:git@172.17.0.18:XHC-iOS-Libs/Podspecs.git
  • 在终端执行 Specs 创建指令 pod repo add [REPO_NAME] [SOURCE_URL]
    注意: a. 此指令是在本地创建一个 [REPO_NAME] 并且拉取 [SOURCE_URL] 的所有 podSpec,如果 [SOURCE_URL] 为新创建的仓库,则本地 [REPO_NAME] 文件夹下只包含一个 .git 文件夹
    b. 如果需要管理多个 podSpec,pod repo add [REPO_NAME] [SOURCE_URL] 执行一次即可,后续添加其它 pod 库时,执行 pod repo push [REPO_NAME] [SPEC_NAME.podspec] 就行
➜  EncryptionMethods git:(master) pod repo add EncryptionMethodsSpec http://172.17.0.18/XHC-iOS-Libs/Podspecs.git
Cloning spec repo `EncryptionMethodsSpec` from `http://172.17.0.18/XHC-iOS-Libs/Podspecs.git`

  • 执行发布命令 pod repo push [REPO_NAME] [SPEC_NAME.podspec] ,直接发布,此指令会将[SPEC_NAME.podspec]部署到本地(~/.cocoapods/repos/[REPO_NAME])并且发布到远程 PodSpecs 仓库即上面的 git 地址:git@172.17.0.18:XHC-iOS-Libs/Podspecs.git, 终端展示如下:
➜  EncryptionMethods git:(master) ✗ pod repo push EncryptionMethodsSpec EncryptionMethods.podspec

Validating spec
 -> EncryptionMethods (0.1.0)
    - NOTE  | xcodebuild:  note: Using new build system
    - NOTE  | [iOS] xcodebuild:  note: Planning build
    - NOTE  | [iOS] xcodebuild:  note: Constructing build description

Updating the `EncryptionMethodsSpec' repo

Your configuration specifies to merge with the ref 'refs/heads/master'
from the remote, but no such ref was fetched.

Adding the spec to the `EncryptionMethodsSpec' repo

 - [Add] EncryptionMethods (0.1.0)

Pushing the `EncryptionMethodsSpec' repo


[!] 'EncryptionMethods' uses the unencrypted 'http' protocol to transfer the Pod. Please be sure you're in a safe network with only trusted hosts. Otherwise, please reach out to the library author to notify them of this security issue.
➜  EncryptionMethods git:(master) ✗ 
  • 发布成功之后,我们来看一下我们的 Specs 的 git 项目:


    Podspecs.png
8. 查看我们本地的 PodSpecs 库:

你的 repo 结构应该是这样的:

repo 结构.png

直接 Findle -> 前往 -> 前往文件夹 -> 输入:~/.cocoapods/repos -> 点击前往

本地的 Specs 库.png

至此,我们的私有库创建发布结束。但是我们注意到,EncryptionMethodsSpec 没有 README.md ,为了后期的维护更新,以及团队小伙伴的使用方便,建议完备一下信息,新建一个 README.md 文件,添加一些版本记录信息等。

9. 编辑 Podspecs 的 README.md

终端输入 vi ~/.cocoapods/repos/EncryptionMethodsSpec/README.md,编辑 README.md
a. 按 i 进入编辑状态;
b. 开始写入要编辑的信息;
c. 按 esc 退出编辑状态;
d. 按 :wq 保存更改并推出(切记输入法应在英文输入状态)

# EncryptionMethodsSpec

项目 | 地址 | 版本 | 日期 | 作者
:-: | :-: | :-: | :-: | :-:
EncryptionMethods | http://172.17.0.18/XHC-iOS-Libs/EncryptionMethods.git | 0.1.0 | 2019.4.24 | iTruda

README.md 效果展示:

EncryptionMethodsSpec

项目 地址 版本 日期 作者
EncryptionMethods http://172.17.0.18/XHC-iOS-Libs/EncryptionMethods.git 0.1.0 2019.4.24 iTruda

终端执行以下命令,将更改 push 到 Podspecs 私有仓库

➜  EncryptionMethods git:(master) ✗ cd ~/.cocoapods/repos/EncryptionMethodsSpec
➜  EncryptionMethodsSpec git:(master) ✗ git add .
➜  EncryptionMethodsSpec git:(master) ✗ git commit -m "add README.md"

再去 Podspecs 私有仓库看看效果

Podspecs 私有仓库.png

根据自己的需要,自行编辑吧,到此我们整个添加完毕。
最后我们需要在 Podfile 文件中添加 source 'http://172.17.0.18/XHC-iOS-Libs/Podspecs.git' 就可以查到我们的 pod 库了,接下来在终端去执行 pod search EncryptionMethods 看看效果

-> EncryptionMethods (0.1.0)
   XHC EncryptionMethods pod Use.
   pod 'EncryptionMethods', '~> 0.1.0'
   - Homepage: http://172.17.0.18/XHC-iOS-Libs/EncryptionMethods.git
   - Source:   git@172.17.0.18:XHC-iOS-Libs/EncryptionMethods.git
   - Versions: 0.1.0 [EncryptionMethodsSpec repo]
(END)

我们直接在 Podfile 文件中添加 pod 'EncryptionMethods', '~> 0.1.0',然后执行 pod install就可以使用了。

使用Podfile管理Pods依赖库版本
pod 'AFNetworking'               //不显式指定依赖库版本,表示每次都获取最新版本  
pod 'AFNetworking', '2.0'        //只使用2.0版本  
pod 'AFNetworking', '> 2.0'      //使用高于2.0的版本  
pod 'AFNetworking', '>= 2.0'     //使用大于或等于2.0的版本  
pod 'AFNetworking', '< 2.0'      //使用小于2.0的版本  
pod 'AFNetworking', '<= 2.0'     //使用小于或等于2.0的版本  
pod 'AFNetworking', '~> 0.1.2'   //使用大于等于0.1.2但小于0.2的版本  
pod 'AFNetworking', '~>0.1'      //使用大于等于0.1但小于1.0的版本  
pod 'AFNetworking', '~>0'        //高于0的版本,写这个限制和什么都不写是一个效果,都表示使用最新版本 

接下来让我们的愉快的玩耍吧!!!

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

推荐阅读更多精彩内容