pod私有庫的創(chuàng)建和使用

注:因?yàn)樽罱拘枨螅疚臑閰⒖妓司W(wǎng)上資源后進(jìn)行的嘗試,可能與多個(gè)網(wǎng)上資源重復(fù)

cocoapods的原理

  1. Pods 項(xiàng)目最終會(huì)編譯成一個(gè)名為 libPods.a 的文件,主項(xiàng)目只需要依賴這個(gè) .a 文件即可。
  2. 對(duì)于資源文件,CocoaPods 提供了一個(gè)名為 Pods-resources.sh 的 bash 腳本,該腳本在每次項(xiàng)目編譯的時(shí)候都會(huì)執(zhí)行,將第三方庫的各種資源文件復(fù)制到目標(biāo)目錄中。
  3. CocoaPods 通過一個(gè)名為 Pods.xcconfig 的文件來在編譯時(shí)設(shè)置所有的依賴和參數(shù)。

工具依賴

?  ~ nvm --version
0.31.3

?  ~ ruby --version
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]

?  ~ pod --version
1.2.1

?  ~ git --version
git version 2.11.0 (Apple Git-81)

tip:本文跳過cocoapods安裝

查看本地pod 倉庫

本地已經(jīng)有一個(gè)master庫(安裝pod后自動(dòng)就會(huì)存在,官方的目錄)
OFToolSpec是后來創(chuàng)建的一個(gè)私有庫

Type:版本管理工具類型及分枝名
URL:git倉庫地址
Path:本地倉庫地址(在根目錄下.cocoapods下)

?  ~ pod repo

master
- Type: git (master)
- URL:  https://github.com/CocoaPods/Specs.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/master

OFToolSpec
- Type: git (master)
- URL:  https://git.coding.net/one_fools/OFToolRepo.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFToolSpec

2 repos

創(chuàng)建pod lib

在桌面創(chuàng)建PodPrivate文件,然后在終端進(jìn)入PodPrivate文件并運(yùn)行命令 pod lib create OFPublicTool創(chuàng)建私有庫模版

?  ~ cd Desktop 
?  Desktop mkdir PodPrivate
?  Desktop cd PodPrivate 
?  PodPrivate ls
?  PodPrivate pod lib create OFPublicTool

以下是配置選擇,可以使用默認(rèn)選項(xiàng)(帶有下劃線的選項(xiàng),并且除了Prefix前綴設(shè)置,其他的不區(qū)分大小寫)

  1. 工程語言
  1. 是否需要Demo
  2. 測(cè)試框架
  3. 是否需要view測(cè)試
  4. 工程前綴
//設(shè)置使用的語言
What language do you want to use?? [ Swift / ObjC ]
 > ObjC
//是否為library創(chuàng)建一個(gè)demo工程
Would you like to include a demo application with your library? [ Yes / No ]
 > 
yes
//使用的單元測(cè)試框架(具體請(qǐng)參看下方`單元測(cè)試`鏈接)
Which testing frameworks will you use? [ Specta / Kiwi / None ]
 > None
//使用UITest
Would you like to do view based testing? [ Yes / No ]
 > no
//你的項(xiàng)目中類的前綴
What is your class prefix?
 > OF

單元測(cè)試
然后會(huì)在當(dāng)前目錄生成 OFPublicTool 文件夾,并且會(huì)在Xcode中自動(dòng)打開這個(gè)項(xiàng)目
注意可能會(huì)有一個(gè)警告提示

A86EECEC-4BF2-4789-BC58-558ADD701F17.png

打開OFPublicTool/Example/OFPublicTool.xcworkspace 工程
刪除此處的 ReplaceMe.m文件,在這里創(chuàng)建將要使用私有庫管理的文件
C07AFF42-4781-4443-A45A-C4D1F016B948.png

如下:
F86C3A58-429A-4B39-9C7E-F05C8AAFB23B.png

然后修改此處的 OFPublicTool.podspec文件,下面標(biāo)注必須修改的地方

05A1876C-4EE2-4B2B-B241-C39AD98AD3F4.png

創(chuàng)建git私有倉庫(使用coding

申請(qǐng)賬號(hào)后創(chuàng)建Git私有倉庫項(xiàng)目


BACDCF36-B34C-4F97-B7F2-86DFFB1ED4F2.png

之后需要在頁面上獲取的信息有


9C15D4BB-9BE8-4204-B8F2-559A344ACEEE.png

創(chuàng)建pod私有庫

把相關(guān)的信息修改到 OFPublicTool.podspec
以下是我的修改

s.summary          = 'My PublicTool.'
s.homepage         = 'https://coding.net/u/one_fools/p/OFPublicTool'
s.source           = { :git => 'https://git.coding.net/one_fools/OFPublicTool.git', :tag => s.version.to_s }

之后進(jìn)入 Example目錄使用 pod update命令

?  Example git:(master) ? pod update

發(fā)現(xiàn)有報(bào)錯(cuò)信息 The validator for Swift projects uses Swift 3.0 by default...

35FAF51B-C569-43C4-A7A4-32D56D281351.png

不過上面有寫到echo "2.3" > .swift-version
繼續(xù)使用此命令,然后再來一次

?  Example git:(master) ? echo "2.3" > .swift-version
?  Example git:(master) ? pod update

安裝成功后發(fā)現(xiàn)下面的警告并沒有消失(暫時(shí)不管)
對(duì)項(xiàng)目進(jìn)行 command + B構(gòu)建一次應(yīng)該會(huì)成功,然后在項(xiàng)目中 OFViewController.m 中引入

#import "OFPublicTool.h"

并對(duì)項(xiàng)目再次進(jìn)行 command + B構(gòu)建,若成功,說明 OFPublicTool.podspec 中的source_files路徑是正確的

若是報(bào)錯(cuò)無法找到文件:

接下來用pod的命令檢查一下此文件下的lib。
后退到podspec文件存在的目錄下

?  OFPublicTool git:(master) ? pod lib lint

 -> OFPublicTool (0.1.0)

OFPublicTool passed validation.

如果出現(xiàn)此處提示說明檢查通過

pod spec lint命令檢查一下遠(yuǎn)程的lib,現(xiàn)在沒有提交到git私有倉庫,一定會(huì)報(bào)錯(cuò)的

?  OFPublicTool git:(master) ? pod spec lint

 -> OFPublicTool (0.1.0)
    - ERROR | [iOS] unknown: Encountered an unknown error ([!] /usr/bin/git clone https://git.coding.net/one_fools/OFPublicTool.git /var/folders/dr/688z508n1fb2m9bh9kqs5_ch0000gn/T/d20170520-7169-ee52z2 --template= --single-branch --depth 1 --branch 0.1.0

Cloning into '/var/folders/dr/688z508n1fb2m9bh9kqs5_ch0000gn/T/d20170520-7169-ee52z2'...
fatal: Remote branch 0.1.0 not found in upstream origin
) during validation.

Analyzed 1 podspec.

[!] The spec did not pass validation, due to 1 error.

發(fā)現(xiàn)報(bào)了一個(gè)錯(cuò)誤,需要一個(gè)tag 0.1.0,下面將本地文件提交到git私有倉庫并打一個(gè)0.1.0的tag

?  OFPublicTool git:(master) ? git add .
?  OFPublicTool git:(master) ? git commit -m"first commit"
?  OFPublicTool git:(master) git remote add origin https://git.coding.net/one_fools/OFPublicTool.git
?  OFPublicTool git:(master) git push origin master
?  OFPublicTool git:(master) git tag -m"tag 0.1.0" 0.1.0
?  OFPublicTool git:(master) git push --tags

git操作不再細(xì)述
上傳成功之后再次用 pod spec lint命令檢查一下遠(yuǎn)程的lib

?  OFPublicTool git:(master) pod spec lint

 -> OFPublicTool (0.1.0)

Analyzed 1 podspec.

OFPublicTool.podspec passed validation.

?  OFPublicTool git:(master) 

發(fā)現(xiàn)通過檢查,這時(shí)候可以去私有倉庫看一下會(huì)發(fā)現(xiàn)已經(jīng)上傳成功了

本地測(cè)試podspec文件

我們可以創(chuàng)建一個(gè)新的項(xiàng)目,在這個(gè)項(xiàng)目的Podfile文件中直接指定剛才創(chuàng)建編輯好的podspec文件,看是否可用。 在Podfile中我們可以這樣編輯,有兩種方式

platform :ios, '8.0'
 
target 'XDTestPod' do
  pod 'OFPublicTool', :path => '~/.cocoapods/repos/OFPublicToolSpec'      #指定路徑
  pod 'OFPublicTool', :podspec => '~/.cocoapods/repos/OFPublicToolSpec/OFPublicTool.podspec'  #指定podspec文件
end

然后執(zhí)行pod install命令安裝依賴,打開項(xiàng)目工程,可以看到庫文件都被加載到Pods子項(xiàng)目中了,不過它們并沒有在Pods目錄下,而是跟測(cè)試項(xiàng)目一樣存在于Development Pods/PodTestLibrary中,這是因?yàn)槲覀兪窃诒镜販y(cè)試,而沒有把podspec文件添加到Spec Repo中的緣故。

向Spec Repo提交podspec

但是現(xiàn)在還沒完,接下來我們把podspec文件上傳的我們自己的spec倉庫里,而不是cocoapods的倉庫。
下面我們創(chuàng)建本地倉庫并把這個(gè)podspec文件上傳進(jìn)去

?  OFPublicTool git:(master) pod repo
?  OFPublicTool git:(master) pod repo add OFPublicToolSpec https://git.coding.net/one_fools/OFPublicTool.git
?  OFPublicTool git:(master) pod repo

master
- Type: git (master)
- URL:  https://github.com/CocoaPods/Specs.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/master

OFPublicToolSpec
- Type: git (tags/0.1.0^0)
- URL:  https://git.coding.net/one_fools/OFPublicTool.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFPublicToolSpec

OFToolSpec
- Type: git (master)
- URL:  https://git.coding.net/one_fools/OFToolRepo.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFToolSpec

3 repos

然后上傳

?  OFPublicTool git:(master) pod repo push OFPublicToolSpec OFPublicTool.podspec 

Validating spec
 -> OFPublicTool (0.1.0)

Updating the `OFPublicToolSpec' repo

Already up-to-date.

Adding the spec to the `OFPublicToolSpec' repo

 - [Update] OFPublicTool (0.1.0)

Pushing the `OFPublicToolSpec' repo

To https://git.coding.net/one_fools/OFPublicTool.git
   8632a92..98f3d44  master -> master

上傳成功

最后檢驗(yàn)

?  OFPublicTool git:(master) pod search OFPublicTool
Creating search index for spec repo 'OFPublicToolSpec'.. Done!
[!] Unable to find a pod with name, author, summary, or description matching `OFPublicTool`

發(fā)現(xiàn)報(bào)錯(cuò),這是因?yàn)閟earch index中緩存沒有清理,再次搜索會(huì)等待一段時(shí)間

?  OFPublicTool git:(master) rm ~/Library/Caches/CocoaPods/search_index.json
?  OFPublicTool git:(master) pod search OFPublicTool

添加到Cocoapods的官方庫

添加到Cocoapods的官方庫,可以使用trunk工具,具體可以查看官方文檔。

pod trunk register 631292061@qq.com 'Ec631292' ---verbose  #注冊(cè)trunk,郵箱以及用戶名請(qǐng)使用大家自己的。執(zhí)行這個(gè)語句后,你的郵箱將會(huì)受到一封帶有驗(yàn)證鏈接的郵件,如果沒有請(qǐng)去垃圾箱找找,有可能被屏蔽了。點(diǎn)擊郵件的鏈接就完成了trunk注冊(cè)流程。
pod trunk me #如果終端顯示了你的用戶名和昵稱,則說明注冊(cè)成功。
pod trunk push OFPublicTool.podspec #通過trunk上傳你的podspec文件,要cd到podspec文件所在目錄執(zhí)行

最后在一個(gè)新項(xiàng)目里引入使用,測(cè)試是否ok,只需要在項(xiàng)目的Podfile里增加以下一行代碼即可

pod 'OFPublicTool', '~> 0.1.0'

注:每當(dāng)你向Pod中添加了新的文件或者以后更新了podspec的版本都需要重新執(zhí)行一遍pod update命令。

更新維護(hù)podspec

Pod::Spec.new do |s|
  s.name             = 'OFPublicTool'
  s.version          = '0.1.3'
  s.summary          = 'My PublicTool.'
  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'https://coding.net/u/one_fools/p/OFPublicTool'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'ECwlf' => '631292061@qq.com' }
  s.source           = { :git => 'https://git.coding.net/one_fools/OFPublicTool.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '8.0'

  s.subspec 'iCarousel' do |iCarousel|
    iCarousel.source_files = 'XDLibrary/Classes/iCarousel/**/*'
    iCarousel.public_header_files = 'XDLibrary/Classes/iCarousel/**/*.h'
  end

  s.subspec 'XDProgress' do |progress|
    progress.source_files = 'XDLibrary/Classes/XDProgress/**/*'
    progress.public_header_files = 'XDLibrary/Classes/XDProgress/**/*.h'
    progress.dependency 'MBProgressHUD', '~> 1.0.0'
  end

  # s.source_files = 'XDLibrary/Classes/**/*'
  
  # s.resource_bundles = {
  #   'XDLibrary' => ['XDLibrary/Assets/*.png']
  # }

  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
  # s.dependency 'AFNetworking', '~> 2.3'
end

因?yàn)槲覀儎?chuàng)建了subspec所以項(xiàng)目整體的依賴dependency,源文件source_files,頭文件public_header_files,資源文件resource等都移動(dòng)到了各自的subspec中,每個(gè)subspec之間也可以有相互的依賴關(guān)系,比如XDProgress依賴于MBProgressHUD。不同的子模塊之間還能互相依賴。

編輯完成之后,在測(cè)試項(xiàng)目里pod update一下,幾個(gè)子項(xiàng)目都被加進(jìn)項(xiàng)目工程了,寫代碼驗(yàn)證無誤之后,就可以將這個(gè)工程push到遠(yuǎn)端倉庫,并打上新的tag->1.0.0。
最后再次使用pod lib lint驗(yàn)證編輯好的podsepc文件,沒有自身的WARNING或者ERROR之后,就可以再次提交到Spec Repo中了,命令跟之前是一樣的

pod repo push OFPublicToolSpec OFPublicTool.podspec 

之后再次到~/.cocoapods/repos/OFPublicToolSpec目錄下查看已經(jīng)有兩個(gè)版本了。

最后介紹一下如何刪除一個(gè)私有Spec Repo,只需要執(zhí)行一條命令即可

pod repo remove OFPublicToolSpec

這樣這個(gè)Spec Repo就在本地刪除了,我們還可以通過

 pod repo add OFPublicToolSpec https://git.coding.net/one_fools/OFPublicTool.git

再把它給加回來。
如果我們要?jiǎng)h除私有Spec Repo下的某一個(gè)podspec怎么操作呢,此時(shí)無需借助Cocoapods,只需要cd到~/.cocoapods/repos/OFPublicToolSpec目錄下,刪掉庫目錄,然后在將Git的變動(dòng)push到遠(yuǎn)端倉庫即可.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容