前言
什么是索引庫(kù)?為什么要?jiǎng)?chuàng)建私有索引庫(kù)?終端輸入pod repo
,如果之前沒(méi)有配置過(guò),輸出信息為:
master
- Type: git (master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/Jack/.cocoapods/repos/master
瀏覽器打開(kāi)https://github.com/CocoaPods/Specs,可以看到一個(gè)Specs文件夾,文件夾內(nèi)包含目前所有支持CocoaPods框架的索引,但https://github.com/CocoaPods/Specs.git
是公開(kāi)索引庫(kù),只能添加公開(kāi)(開(kāi)源)框架,如果想讓私有框架支持CocoaPods,這個(gè)時(shí)候必須用私有索引庫(kù)。
正文
如果私有框架已經(jīng)存在,只需進(jìn)入對(duì)應(yīng)本地項(xiàng)目根目錄,創(chuàng)建podspec填寫(xiě)正確信息后上傳,并將podspec文件push到私有索引庫(kù)即可。
pod spec create [podspec文件名] //創(chuàng)建podspec
pod lib lint //podspec本地驗(yàn)證
pod spec lint //podspec遠(yuǎn)程驗(yàn)證
git add .
git commit -m xx
git push origin master
pod repo push [私有索引庫(kù)] [podspec文件] //將podspec文件push到私有索引庫(kù)
如果從零開(kāi)始創(chuàng)建私有框架,可以按以下步驟執(zhí)行:
(以下均以TestLib為例,請(qǐng)自行替換)
終端進(jìn)入準(zhǔn)備創(chuàng)建lib的文件夾,執(zhí)行命令
pod lib create TestLib
這個(gè)過(guò)程可能需要等待幾秒,之后會(huì)出現(xiàn)如下信息:
What language do you want to use?? [ Swift / ObjC ]
Would you like to include a demo application with your library? [ Yes / No ]
Which testing frameworks will you use? [ Specta / Kiwi / None ]
Would you like to do view based testing? [ Yes / No ]
根據(jù)提示輸入即可,完成后會(huì)自動(dòng)打開(kāi)TestLib對(duì)應(yīng)的Example工程
執(zhí)行tree命令查看目錄結(jié)構(gòu)
01:TestLib Jack$ tree TestLib -L 2
TestLib
├── Example
│ ├── Podfile
│ ├── Podfile.lock
│ ├── Pods
│ ├── TestLib
│ ├── TestLib.xcodeproj
│ ├── TestLib.xcworkspace
│ └── Tests
├── LICENSE
├── README.md
├── TestLib
│ ├── Assets
│ └── Classes
├── TestLib.podspec
└── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj
10 directories, 5 files
將組件放入TestLib/Classes中,并刪除ReplaceMe.m,進(jìn)入Example文件夾執(zhí)行pod install
后,TestLib對(duì)應(yīng)的Example工程已經(jīng)裝載好,可以進(jìn)行demo演示。以后每次更新lib,都需要進(jìn)到Example中執(zhí)行pod install
獲取最新代碼
- 創(chuàng)建遠(yuǎn)程私有庫(kù)
由于github創(chuàng)建私有庫(kù)需要付費(fèi),這里用coding進(jìn)行演示
這里README.md、開(kāi)源許可證、gitignore都不需要添加,從上面TestLib的目錄結(jié)構(gòu)可以看到,pod lib create
已經(jīng)創(chuàng)建了這三個(gè)文件,如果添加,在commit時(shí)候會(huì)導(dǎo)致沖突(文件內(nèi)容不完全相同),所以只要?jiǎng)?chuàng)建一個(gè)最干凈的私有庫(kù)。
- 修改podspec文件
Pod::Spec.new do |s|
s.name = 'TestLib'
s.version = '0.1.0'
s.summary = 'TestLib'
s.description = <<-DESC
TestLib只是一個(gè)演示
DESC
s.homepage = 'https://coding.net/u/coder_01/p/TestLib'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { '01_Jack' => '123@qq.com' }
s.source = { :git => 'git@git.coding.net:coder_01/PrivateSpecs.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '8.0'
s.source_files = 'TestLib/Classes/**/*'
# s.resource_bundles = {
# 'TestLib' => ['TestLib/Assets/*.png']
# }
s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 2.3'
end
- 對(duì)podspec進(jìn)行本地驗(yàn)證:
pod lib lint --private
如果因?yàn)閣aring驗(yàn)證不通過(guò)可以加上--allow-warnings
,遠(yuǎn)程驗(yàn)證和pod repo push
同理
- 打包
驗(yàn)證通過(guò)后打包類庫(kù),這里可以用cocoapods的插件cocoapods-packager來(lái)完成(手動(dòng)打包太麻煩)。如果之前沒(méi)有安裝cocoapods-packager,執(zhí)行以下命令:
sudo gem install cocoapods-packager
打包:
pod package TestLib.podspec --force
默認(rèn)打包成.framework
,如果加上--library
則打包成.a
。
驗(yàn)證通過(guò)后,通過(guò)git status
可查看當(dāng)前git改變狀態(tài),不需要提交的文件可添加到gitignore中。
git status
git add .
git commit -m 'first blood'
到這里已經(jīng)可以將代碼提交到遠(yuǎn)程倉(cāng)庫(kù),但需要先添加倉(cāng)庫(kù)地址再提交
- 添加公鑰
ssh-keygen
將生成的公鑰id_rsa.pub添加到賬戶
git remote add origin git@git.coding.net:coder_01/TestLib.git
git push origin master
在對(duì)podspec做遠(yuǎn)程驗(yàn)證前要先push tag,tag必須與podspec中的version一致
git tag 0.1.0
git push --tags
pod spec lint --private
遠(yuǎn)程驗(yàn)證通過(guò)后,將TestLib.podspec push到遠(yuǎn)程私有索引庫(kù),同樣,需要先添加倉(cāng)庫(kù)再push
- 創(chuàng)建私有索引庫(kù)
pod repo add PrivateSpecs git@git.coding.net:coder_01/PrivateSpecs.git
pod repo push PrivateSpecs TestLib.podspec
此時(shí)本地索引庫(kù)長(zhǎng)這樣
cd ~/.cocoapods/repos
open .
最基本的制作到這里就完成了,現(xiàn)在能搜到TestLib這個(gè)庫(kù)
pod search TestLib
新建工程,pod init
,修改podfile文件。這里需要添加兩個(gè)source,一個(gè)原master repo,一個(gè)后添加的PrivateSpecs
source 'git@git.coding.net:coder_01/PrivateSpecs.git'
source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!
target 'Test' do
pod 'TestLib'
end
執(zhí)行pod install
即可使用TestLib
框架
Tip:如果組件中含有圖片、音視頻、xib/storyboard等,podspec的描述與代碼中的寫(xiě)法都需要改變
重新回到podspec文件
s.source_files = 'TestLib/Classes/**/*'
# s.resource_bundles = {
# 'TestLib' => ['TestLib/Assets/*.png']
# }
s.source_files
用來(lái)找代碼,s.resource_bundles
用來(lái)找資源。
TestLib/Classes/**/*
表示匹配TestLib/Classes文件夾下所有子目錄的所有文件
Pattern:*
-
*
匹配所有文件 -
c*
匹配所有以c開(kāi)頭的文件 -
*c
匹配所有以c結(jié)尾的文件 -
*c*
匹配所有包含c的文件
Pattern: **
-
**
遞歸匹配所有子文件夾
未組件化前,加載圖片、音視頻、xib/storyboard等資源可通過(guò)mainBundle來(lái)加載,現(xiàn)在要通過(guò)組件自帶bundle來(lái)獲取資源。TestLib會(huì)自動(dòng)將s.resource_bundles
下指定的路徑資源打成bundle包,并命名為T(mén)estLib.bundle
但是,并不一定要把資源放到Assets文件夾下,可以是任意文件夾(如目錄結(jié)構(gòu)中的Classes或者新建),只要能找到資源即可。同樣,如果包含資源s.source_files
要這樣寫(xiě):
s.source_files = 'TestLib/Classes/**/*{.h,.m}'
如果不這樣寫(xiě),若Classes中包含資源文件,會(huì)導(dǎo)致崩潰。此時(shí)先找到TestLib.bundle
,再?gòu)倪@個(gè)bundle中加載資源就可以了
// 獲取bundle資源
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
podspec還有一些常用玩法,如subspec
、dependency
、vendored_frameworks
、vendored_libraries
、prefix_header_contents
、prefix_header_file
等
podspec更多配置可參考Podspec Syntax Reference
Have fun !