cocoaPods私有庫創(chuàng)建以及使用,多重庫引用

一、創(chuàng)建本地pod私有庫


1.創(chuàng)建git私有庫

在進(jìn)行一切操作之前,先在內(nèi)網(wǎng)創(chuàng)建一個(gè)git倉庫。
這塊我就不多做介紹啦,建庫都會(huì)滴 ~~
https://xxxxxx/xxxx/iOSComponents/XXXXBaseIoTSocketManager.git

2.在本地創(chuàng)建工程

cd到你想要?jiǎng)?chuàng)建pod庫工程的路徑下,并執(zhí)行pod庫創(chuàng)建:

pod lib create XXX(庫名)

因?yàn)榭偙粔Γ裕瑘?zhí)行這步總443的小伙伴們,可以執(zhí)行下面的

pod lib create XXX(庫名) --template-url=https://gitee.com/peter_zhang/pod-template.git

如圖1所示:


圖1

回車,回答一下問題:

#選擇使用平臺(tái)
What platform do you want to use?? [ iOS / macOS ]
 > iOS

#選擇你想使用的變成語言
What language do you want to use?? [ Swift / ObjC ]
 > ObjC

#是否創(chuàng)建一個(gè)demo工程,為了方便測試,選擇Yes
Would you like to include a demo application with your library? [ Yes / No ]
 > Yes

#選擇測試框架
Which testing frameworks will you use? [ Specta / Kiwi / None ]
 > None

#是否需要視圖測試
Would you like to do view based testing? [ Yes / No ]
 > Yes

#demo工程的class前綴
What is your class prefix?
 > XXX

然后會(huì)彈出一個(gè)名為XXXBaseIotSocketManager-Example的工程,目錄如圖2所示:


圖2
cd 到 Example 文件夾下, 安裝CocoaPods項(xiàng)目
pod install --no-repo-update
進(jìn)入Example文件夾點(diǎn)擊.xcworkspace的文件夾打開項(xiàng)目,運(yùn)行一下是否成功

如圖3所示:


圖3

二、編輯私有庫


1.添加代碼文件 & 資源文件 (復(fù)制粘貼)

如圖4所示,XXXBaseIoTSocketManager目錄下有兩個(gè)文件夾,一個(gè)Assets,一個(gè)Classes文件夾,用來添加資源文件和代碼文件。
把代碼加進(jìn)了Classes文件夾中,如下圖4:

圖4

加進(jìn)來應(yīng)該后,工程應(yīng)該如圖5所示:


圖5

如果工程目錄中pod中,沒有該索引的話,就自己加一下,如圖6所示,如


圖6
2.編輯.podspec配置文件
#
# Be sure to run `pod lib lint BOEBaseIoTSocketManager.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
#名稱
  s.name             = 'XXXBaseIoTSocketManager'
#這一塊看個(gè)人需求,想要的起始分支。-版本號
  s.version          = '1.0.0'
#剪短的介紹喲~
  s.summary          = '這里寫你想要的簡介。。。。'

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!
#詳細(xì)介紹
  s.description      = <<-DESC
                       這里寫你想要的具體描述,有時(shí)候過短的話會(huì)有警告滴~~ 所以,不要逼summary短喲~~ 
                       DESC
#s.homepage里面寫你的git主頁,注意是沒有.git的喲~~ 一定要能訪問到,要不然驗(yàn)證不通過
  s.homepage         = 'https://github.com/jiangsujia@126.com/XXXBaseIoTSocketManager'
#截圖
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
#開源協(xié)議
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
#作者信息
  s.author           = { 'jiangsujia@126.com' => 'jiangsujia@126.com' }
#項(xiàng)目地址,不支持SSH的地址,驗(yàn)證不通過,只支持HTTP和HTTPS,最好使用HTTPS
  s.source           = { :git => 'https://github.com/jiangsujia@126.com/XXXBaseIoTSocketManager.git', :tag => s.version.to_s }
#多媒體介紹地址
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
#支持的平臺(tái)及版本
  s.ios.deployment_target = '8.0'
#代碼文件地址,**/*表示Classes目錄及其子目錄下所有的文件,如果有多個(gè)目錄則用逗號分組顯示,這里也要做相應(yīng)的設(shè)置
  s.source_files = 'XXXBaseIoTSocketManager/Classes/**/*'
  #資源文件地址
  # s.resource_bundles = {
  #   'XXXBaseIoTSocketManager' => ['XXXBaseIoTSocketManager/Assets/*.png']
  # }
#公開頭文件
  # s.public_header_files = 'Pod/Classes/**/*.h'
#buildsetting相關(guān)設(shè)置
#s.xcconfig = {
#    'ENABLE_BITCODE' => 'NO',
#    'CLANG_CXX_LIBRARY' => 'libstdc++'
#}

#該pod依賴的系統(tǒng)framework,多個(gè)用逗號分隔開
# s.frameworks = 'UIKit', 'MapKit'
#該pod依賴的系統(tǒng)Library,多個(gè)用逗號隔開
#比如 libz.tdb, s.libraries = 'z'
#s.libraries = 'sqlite3',


#第三方.a文件
#s.vendored_libraries = 'XXXBaseIoTSocketManager/Classes/ThirdParty/*.a'

#第三方frameworks文件
#s.vendored_frameworks = 'XXXBaseIoTSocketManager/Classes/ThirdParty/*.framework'

#依賴關(guān)系,該項(xiàng)目所依賴的其他庫,如果有多個(gè)則需要填寫多個(gè)s.dependency
  s.dependency 'CocoaAsyncSocket', '~> 7.6.3'
end
3.更新依賴關(guān)系

配置完成后,再次cd到Example文件夾下,更新pod:

jiangsjdeiMac:Example jiangsj$ pod update --no-repo-update

更新完成后打開項(xiàng)目能否正常運(yùn)行,并驗(yàn)證導(dǎo)入的文件是否能調(diào)用

Podfile如下:

use_frameworks!

platform :ios, '8.0'

target 'XXXBaseIoTSocketManager_Example' do
  pod 'XXXBaseIoTSocketManager', :path => '../'
  pod 'CocoaAsyncSocket', '~> 7.6.3'

  target 'XXXBaseIoTSocketManager_Tests' do
    inherit! :search_paths

    pod 'FBSnapshotTestCase'
  end
end

你會(huì)發(fā)現(xiàn),實(shí)際上按照當(dāng)前的podfile進(jìn)行update后,會(huì)報(bào)錯(cuò)如下:


圖7

建議先把下面這行在Podfile中注釋了,然后執(zhí)行update,但是你會(huì)發(fā)現(xiàn)目錄下的Development Pods 沒有了,然后再把這行打開,再update,就可以展示完整依賴了。

#先注釋此行,pod update , 然后再打開注釋, 再pod update 
  pod 'XXXBaseIoTSocketManager', :path => '../'

最終,終端如圖8顯示:


圖8

三、提交到私有倉庫


1.驗(yàn)證pod配置文件,為了保證項(xiàng)目正確性,pod文件配置沒問題
  1.cd 到你有XXXBaseIoTSocketManager.podspec的文件夾下
  2.運(yùn)行pod lib lint XXXBaseIoTSocketManager.podspec 
ps:
  1.如果出錯(cuò)了,就按照提示修復(fù)錯(cuò)誤,但是有可能沒有錯(cuò)有warnings,比如http什么的,       
  2.那么可以執(zhí)行 pod lib lint XXXXBaseIoTSocketManager.podspec --allow-warnings

還有幾個(gè)本地驗(yàn)證命令推薦如下:

#本地驗(yàn)證
pod lib lint
#本地驗(yàn)證+詳細(xì)打印信息
pod lib lint --verbose
#本地驗(yàn)證+允許使用靜態(tài)庫
pod lib lint --use-libraries
#本地驗(yàn)證+允許警告
pod lib lint --allow-warnings
#本地驗(yàn)證+快速驗(yàn)證
pod lib lint --quick

整個(gè)過程如圖9所示:


圖9

由于我這里有警告所以我就用了--allow-warinings


圖10

當(dāng)出現(xiàn)XXX passed validation的時(shí)候,就驗(yàn)證通過了。

事實(shí)上如果你引用了一堆你私有的庫而pod庫search不到,這步lint就會(huì)出現(xiàn)問題。
我試過很多辦法,仍舊是報(bào)錯(cuò),其實(shí),可以簡化這步,如果你能保證你的庫絕對沒有問題,不執(zhí)行l(wèi)int也可以的。

2.發(fā)布項(xiàng)目到私有庫中,此時(shí)切換公司內(nèi)網(wǎng)。
1.添加遠(yuǎn)程倉庫,就是之前我們在內(nèi)網(wǎng)建的庫
git remote add origin 你的倉庫地址.git
2.添加文件
git add .
3.提交本地,并且添加描述
git commit -m "第一次提交"
4.推送本地代碼到遠(yuǎn)程
git push origin master
5.打tag
git tag 1.0.0
6.推送tag到遠(yuǎn)程
git push origin 1.0.0

然后打開你的倉庫地址,就可以看到我們的代碼已經(jīng)提交上去了,如圖11。


圖11

由于我上面.podspec文件填寫的是branch是1.0.0,我又減了一個(gè)1.0.0分支。

3.創(chuàng)建Spec的管理庫。

創(chuàng)建本地執(zhí)行Spec命令

pod repo add XXXBaseIoTSocketManager(你的庫名稱) http://XXXX.git(你的庫地址)

接下來就可以發(fā)布了

將自己的私有庫添加到Spec管理中
pod repo push XXXBaseIoTSocketManager(你的庫名稱) XXXBaseIoTSocketManager.podspec

這步其實(shí)也不是必須的,因?yàn)槲沂菍it管理clone到本地,所以本步驟省略也無所謂。

4.檢驗(yàn)私有庫的發(fā)布跟使用

在私有庫引用了私有庫的情況下,在驗(yàn)證和推送私有庫的情況下都要加上所有的資源地址,不然pod會(huì)默認(rèn)從官方repo查詢。

pod spec lint --sources='私有倉庫repo地址,https://github.com/CocoaPods/Specs'
pod repo push 本地repo名 podspec名 --sources='私有倉庫repo地址,https://github.com/CocoaPods/Specs'
5.引用自己或第三方的framework或.a文件

在podsepc中應(yīng)該這樣寫:

s.ios.vendored_frameworks = "xxx/**/*.framework"
s.ios.vendored_libraries = "xxx/**/*.a”
6.私有庫中添加資源(圖片、音視頻等)

方法有三種:

  • 第一種
spec.resources = ["Images/*.png", "XXX/*"]

但是這些資源會(huì)在打包的時(shí)候直接拷貝的app的Bundle中,這樣說不定會(huì)和其它資源產(chǎn)生命名沖突

  • 第二種
spec.resource = "Resources/MYLibrary.bundle"

把資源都放在bundle中,然后打包時(shí)候這個(gè)bundle會(huì)直接拷貝進(jìn)app的mainBundle中。使用的時(shí)候在mainBundle中查找這個(gè)bundle然后再搜索具體資源

 NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"XXXBundle" withExtension:@"bundle"];
    NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
    UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];
  • 第三種
spec.resource_bundles = {
  'xxxx' => ['Resources/*.png'],
  'OtherResources' => ['OtherResources/*.png']
}

這種方法利用 framework 的命名空間,有效防止了資源沖突。
使用方法是先拿到最外面的 bundle,然后再去找下面指定名字 的 bundle 對象,再搜索具體資源

NSBundle *bundle = [NSBundle bundleForClass:[MYSomeClass class]];
NSURL *bundleURL = [bundle URLForResource:@"xxxx" withExtension:@"bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithURL: bundleURL];
UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];
7.檢驗(yàn)私有庫的發(fā)布跟使用

在項(xiàng)目中的Podfile中添加

pod 'xxxBaseIoTSocketManager', :git => 'http://xxxx/XXXBaseIoTSocketManager.git', :branch =>'1.0.0'

如下圖12所示:


圖12

如果沒有索引庫,先新建一個(gè)

 pod repo add [你的Specs] [你的私有庫Specs.git]
pod spec lint XXXX.podspec --verbose --allow-warnings --use-libraries --sources='公有庫Specs.git,私有庫Specs.git'

pod repo push XXXXSpecs XXXX.podspec --verbose --allow-warnings --use-libraries --sources='公有庫Specs.git,私有庫Specs.git'

工程如下13圖所示:


圖13

導(dǎo)入成功就可以使用了。

但是要注意的是,如果你要是在庫中引用了三方庫,那么你要提前在外網(wǎng)把三方庫的引入在你的工程中引入一遍,注釋后再切換到內(nèi)網(wǎng)。如果你這個(gè)庫引用了私有庫,也一并pod進(jìn)來就好了,注意是顯式pod。

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

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

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