https://guides.cocoapods.org官網(wǎng)
有些時候我們的項目太過于龐大,需要進(jìn)行組建化開發(fā),可以將每個模塊開發(fā)成一個組件?;蛘呤俏覀兊囊恍┳约簬欤胗胮od導(dǎo)入,又不想使用本地路徑的方式。這時候我們就可以做一個遠(yuǎn)程的私有代碼倉庫,這樣我們開發(fā)的庫就可以滿足我們自己用pod進(jìn)行導(dǎo)入,又不用讓別人看到;
因為索引庫中之存放框架的描述信息,真正的框架是存放在描述信息制定的地址之中,所有我們要想把自己的代碼放到pods索引庫中,我們首先應(yīng)該是給自己的遠(yuǎn)程倉庫的框架添加一個描述文件,將描述文件上傳到遠(yuǎn)程框架的索引庫當(dāng)中,1開發(fā)框架->2添加spec文件->3上傳spec到索引庫
進(jìn)入github索引cocoapods可以看到一個Cocoapods/spec文件
首先我們可以現(xiàn)在遠(yuǎn)程代碼倉庫創(chuàng)建一個新的倉庫用來存放我們自己框架的源碼;然后在我們電腦上面床架一個git倉庫,然后將我們本地的git倉庫和遠(yuǎn)程的代碼倉庫建立連接,可以使用clone也可以
手動連接git remote add origin 連接地址;
使用 git remote測試是否添加;
使用 git push origin master將本地代碼推送遠(yuǎn)程倉庫;
使用終端cd到git同級目錄創(chuàng)建spec文件 pod spec create TestLib,一般名稱和代碼的文件名一致;
創(chuàng)建好spec文件就可以修改里面的信息了:
里面有homepage
spec.name = 'Reachability' 框架名
spec.version = '3.1.0' 版本號
spec.license = { :type => 'BSD' }
spec.homepage = 'https://github.com/tonymillion/Reachability' 主頁
spec.authors = { 'Tony Million' => 'tonymillion@gmail.com' } 作者
spec.summary = 'ARC and GCD Compatible Reachability Class for iOS and OS X.' 描述
spec.description = <<-DESC
Computes the meaning of life.
Features:
1. Is self aware
...
42. Likes candies.
DESC 詳細(xì)描述這個字?jǐn)?shù)要比上面summary長并且不可以為空
spec.source = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0' } 遠(yuǎn)程倉庫的地址,發(fā)布的本號,一般
spec.source_files = 'Reachability.{h,m}'
spec.framework = 'SystemConfiguration'
spec.source_files = "Classes", "Classes/**/*.{h,m}" 需要添加到倉庫的文件
spec.exclude_files = "Classes/Exclude"
spec.source_files = 'Reachability/common/*.swift' 需要下載的文件,放到項目里面的,這個路徑是spec文件對應(yīng)的相對路徑,
接下里需要給git設(shè)置tag這里面的tag鑰匙spec的tag保持一致,因為他檢索的時候需要根據(jù)這個tag去遠(yuǎn)程倉庫查找
添加tag
git tag 0.1.1 -m'描述文字'
把tag推送到遠(yuǎn)程代碼倉庫
git push --tags
這時候刷新遠(yuǎn)程代碼倉庫,就可以看到這個0.0.1的新版本了
接下來要把我們的spec上傳到遠(yuǎn)程框架的索引庫中了,首先注冊一下trunk,這個trunk就是允許我們將自己本地的sdk上傳到官方的spec索引庫中
pod trunk register 759542164@qq.com 'SLL' --description='蘇'
驗證完成之后 就可提交了pod trunk push TestLib.podspec,直接提交可能因為警告不能成功。使用命令pod trunk push TestLib.podspec --allow-warnings這里的文件名要注意別寫錯
提交成功之后,遠(yuǎn)程索引庫會自動同步本地的索引庫,如果提交成功本地還是索引不到,可能是本地索引沒有更新
使用命令
pod install --no-repo-update下載不需要檢查更新
pod install --repo-update 檢查本地更新
如果想搜索的話可以使用 pod search XXX
創(chuàng)建遠(yuǎn)程私有代碼倉庫,
只有我們自己可以使用將代碼放到遠(yuǎn)程代碼倉庫,共自己項目組使用
- 在代碼托管平臺創(chuàng)建我們的代碼倉庫,因為GitHub上面私有的要錢,所以我們可以其他的比如碼云,coding都可以,這里我使用的是coding ,先在網(wǎng)上創(chuàng)建好我們的代碼倉庫。復(fù)制url連接
原理:
創(chuàng)建遠(yuǎn)程代碼倉庫->生成spec文件->上傳spec到代碼倉庫
生成我們自己的遠(yuǎn)程代碼庫,將我們遠(yuǎn)程代碼倉庫的spec上傳到我們自己的私有的索引庫,然后在本地生成我們的本地索引庫。
我們自己的授權(quán)的用戶可以使用
私有庫的劃分,主要骨架做成私有庫而不是所有的文件都是一個庫,根據(jù)不同功能和模塊劃分。
基礎(chǔ)組件(分類)、功能組件、業(yè)務(wù)組件(骨架);業(yè)務(wù)組件依賴基礎(chǔ)組件
創(chuàng)建組件庫文件夾testLib->FMBases->Classes->文件
創(chuàng)建本地私有庫FMBases->
git init-> git add.-> git commit -m 初始化
添加pod
pod init->pod install
創(chuàng)建podspec文件
pod spec create FMBases在描述文件里面寫這個信息
將本地庫集成到宿主項目里面
pod init->pod install生成podfile文件配置庫的信息
target 'XMGFM' do
frameworks
use_frameworks!
pod 'XMGFMBase', :path=>'../localLib/XMGFMBase'相對路徑
end
然后執(zhí)行pod install
生成私有的索引庫
在遠(yuǎn)程創(chuàng)建我們代碼倉庫XMGFMSpecs,復(fù)制倉庫的url或者使用ssh公鑰匙和私鑰匙,私鑰匙留著,公鑰匙給外界
如何生成一個公鑰
終端ssh-keygen
存放目錄在 /Users/luosu/.ssh/id_rsa.pub
- 添加自己的本地索引庫
pod repo add 庫名 url
pod repo add 庫名 ssh
可以在終端執(zhí)行pod repo查看當(dāng)前存在的索引庫
添加成功之后,我們就有了自己的索引庫了。
將開發(fā)代碼上傳到遠(yuǎn)程倉庫,這個需要新建一個倉庫,不是剛剛的索引倉庫
cd到本地創(chuàng)建一個remoteLib文件夾
- 創(chuàng)建一個我們需要開發(fā)的組件,創(chuàng)建一個模版庫
pod lib create XMGFMBase
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 ]
> Yes
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?
> XMG
然后終端就會執(zhí)行一些基本讓我選擇的基本選項,執(zhí)行完之后就創(chuàng)建了一個帶有基礎(chǔ)組件和demo案例的項目,用來測試的項目,這是后我們需要把我們的組件放到XMGFMBase/Classes/
然后 安裝一下pod 文件 pod install
修改了podspec文件相關(guān)配置,因為別人下載是根據(jù)podspec里面的信息找遠(yuǎn)程代碼倉庫。主要是source等內(nèi)容
然后回到XMGFMBase文件夾
使用pod lib lint它自動檢索當(dāng)前文件夾下的spec文件,進(jìn)行本地驗證,他不會驗證source里面的tag。但是如果遠(yuǎn)程驗證pod spec lint的話會發(fā)現(xiàn)沒有tag會報錯,因為他會去驗證我們的代碼倉庫,這時候我們創(chuàng)建好的代碼還沒有提交到遠(yuǎn)程代碼倉庫呢,
git init->git add .->git commit -m xxx->git remote add origin https://gitee.com/stop_and_stop/xmgfmbase.git->git push -u origin "master"然后代碼提交到遠(yuǎn)程代碼倉庫
這時候還有創(chuàng)建tag,遠(yuǎn)程驗證依然不通過
添加tag,這里面的tag要跟.podspec里面的version保持一致
git tag -a 0.1.0 -m '描述文字'
把tag推送到遠(yuǎn)程代碼倉庫
git push --tags
一旦驗證成功,就說明私有庫索引沒有問題,然后把索引文件傳到自己的XMGFMBase私有索引庫當(dāng)中,
pod repo push XMGFMBase XMGFMBase.podspec --allow-warnings這句會自動上傳到遠(yuǎn)程私有索引庫里面
然后我們再使用的時候需要在podFile文件里面添加私有庫的source
source 'https://e.coding.net/shllearn/shlprivatestore/shlprivatestore.git'
這樣設(shè)置之后可以加載自己遠(yuǎn)程私有庫了,但是還不能加載共有的遠(yuǎn)程私有庫,所以還要添加公共的索引庫source
source 'https://cdn.cocoapods.org/'
Podfile文件具體配置
source 'git@gitee.com:stop_and_stop/xmgfmspecs.git'
source 'https://cdn.cocoapods.org/'
use_frameworks!
platform :ios, '9.0'
target 'XMGFMBase_Example' do
pod 'XMGFMBase'
pod 'MJExtension'
end
遠(yuǎn)程私有索引庫的升級
cd到模版庫文件,將需要增加的代碼,copy到Classes文件,
修改podspec文件,
pod install
更改版本號,
git add .-> git commit -m xxx->git push
添加tag
git tag -a 0.2.0 -m xxx->git push --tag
驗證文件本地pod lib lint 遠(yuǎn)程pod spec lint
更新新本地索引庫
pod repo push XMGFMBase XMGFMBase.podspec --allow-warnings
如果出現(xiàn)奇怪的錯誤,可以把原來下載的pod 用命令 pod installs清理一下
然后 Example里面pod install一下,
不更新索引庫 pod update --no-repo-update更新框架不更新索引庫
遠(yuǎn)程私有庫依賴+升級
把需要使用第三方庫的組件拖入Classes
執(zhí)行pod install example里面可以看到新的組件
如果自己的組件庫中使用了第三方的庫就需要添加依賴,
修改spec文件
s.dependency 'AFNetworking'
s.dependency 'SDWebImage'
這樣在下載私有庫的庫時候會檢測哪些依賴的庫,如果有就會把依賴庫一起下載過來。
pod install
編譯一下看是否成功,成功之后提交遠(yuǎn)程代碼倉庫
git add .->git commit -m xxx->git push
git tag 0.3.1->git push --tags
驗證sepc文件是合法pod spec lint
成功就提交到本地索引庫pod repo push XMGFMSpecs XMGFMBase.podspec --allow-warnings
用另外的工程引入第三方可以使用就可以
遠(yuǎn)程倉庫私分支
因為我們有時候字需要倉庫的一部分組件的功能,所以要實現(xiàn)分支功能SubSpecs
修改podspec文件
s.subspec 'Base自控名稱' do |b別名|
b.source_files = 'XMGFMBase/Classes/Base/**/*'
end
將主庫的s.source_files注釋
如果有的庫需要依賴第三方的框架,不能直接寫在外面了,
s.subspec 'Network自控名稱' do |n|
n.source_files = 'XMGFMBase/Classes/Network/**/*'
n.denpendency = 'AFNetworking'
end
修改完成測試沒有錯誤以后,上傳代碼到遠(yuǎn)程倉庫
git add .-> git commit -m xxxx->git push
添加tag
git tag 0.2.2 ->git push --tags
驗證spec文件是否符合格式
pod spec lint --allow-warnings
上傳到本地私有索引庫
pod repo push XMGFMSpecs XMGFMBase.podspec --allow-warnings
成功之后 使用
pod search XMGFMBase測試有沒有
在宿主工程測試一下可以用了么
source 'git@gitee.com:stop_and_stop/xmgfmspecs.git'
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'XMGFM' do
use_frameworks!
pod 'XMGFMBase/Category'
#pod 'XMGFMBase/Base'
#pod 'XMGFMBase', :subspecs => ['Base', 'Category']
#pod 'MJExtension'
end
主骨架組件化
創(chuàng)建一個新的框架
pod lib create XMGFMMain
填寫框架的信息
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 ]
> Yes
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?
> XMG
這樣創(chuàng)建的工程里面Example對框架是引用的關(guān)系,不是copy所以才可以邊開發(fā)邊調(diào)試
將main里面的Controller,View代碼copy到當(dāng)前框架XMGFMMain文件夾里面,Example pod install就可以了
顯build一下看是否需要依賴,如果需要記得修改podspec文件
s.dependency 'XMGFMBase/Category'
然后因為加載的是私有庫的框架,所以記得修改podfiles的source
source 'git@gitee.com:stop_and_stop/xmgfmspecs.git'
source 'https://github.com/CocoaPods/Specs.git'
然后pod install加載組件庫
到這步運(yùn)行還是有錯誤,因為加載不了NIB等資源,因為使用加載這些資源使用時mainbundle來加載的,而現(xiàn)在資源不在mainBundle里面
查詢當(dāng)前的bundle路徑
NSBundle *currentBundle = [NSBundle bundleForClass:self];
當(dāng)前類的路徑
添加圖片資源,應(yīng)該放到組件內(nèi)部
先把a(bǔ)ssert里面的圖片拿出來,github上面cartool放入輸入和輸出路徑來破解出來;放到開發(fā)組件Classes同級的asserts里面
修改podspec文件。描述
s.resource_bundles = {
'XMGFMMain' => ['XMGFMMain/Assets/*']
}
這樣還不能直接使用,因為放到這個文件夾里面之后,最終打包成一個資源包。這個放到項目名.framework里面
使用圖片的時候xib里面用 項目名.framework/圖片名
代碼里面加載,不能直接使用imageNamed方法,要使用
// 設(shè)置tabbar 背景圖片
// car, mainBundle
NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];
NSString *imagePath = [currentBundle pathForResource:@"tabbar_bg@2x.png" ofType:nil inDirectory:@"XMGFMMain.bundle"];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
self.backgroundImage = image;
私有庫資源依賴
有時候我們自己寫的庫需要依賴圖片、xib、 storyboard等資源
我們最終要達(dá)到目的是 宿主工程里面只集成業(yè)務(wù)組件


然后在終端,執(zhí)行一下
pod install 就把本地庫引入了我們的項目,因為我們引入的時候沒有選擇,copy item if needed。所以項目中只是對文件的引用,我們這樣就可以邊開發(fā)邊測試了,等開發(fā)功能差不多的時候,就可以進(jìn)行下一步了。
在代碼托管平臺創(chuàng)建我們的托管項目
創(chuàng)建的時候注意,不要勾選,readeMe和gitignore,因為我們上一步創(chuàng)建出來的項目里面自帶這兩個文件。如果遠(yuǎn)程又創(chuàng)建了會產(chǎn)生沖突,

創(chuàng)建完之后,會有一個url用來cloning的
然后找到url更改我們本地代碼的.podspec文件的里面一些配置
#核心代碼所在的位置
s.source_files = 'HomeKit/Classes/**/*'
默認(rèn)當(dāng)前文件在哪里,他就是找到當(dāng)前文件的目錄下面,因為 HomeKit跟。podspec文件在同一級目錄,所以不需要,跳轉(zhuǎn)文件夾
/**他會找當(dāng)前文件夾里面的所有文件,不寫的話他只會查找一層
之后開發(fā)更新,版本號也是需要更改的。每次更新版本都需要更改,注意跟tag保持一致
s.version = '0.1.0'
因為Cocoapod是根據(jù)tag去索引代碼的,git的tag。如果沒有寫的話是不能下載的,
創(chuàng)建好遠(yuǎn)程的代碼庫,然后將.podspec里面source改成創(chuàng)建好的遠(yuǎn)程地址
s.source = { :git => '創(chuàng)建好的遠(yuǎn)程代碼托管url', :tag => s.version.to_s }
- 當(dāng)我們的代碼運(yùn)行沒有錯誤之后,我們就可以添加到遠(yuǎn)程代碼倉庫了
- 總體來講的話,使用終端操作git管理代碼有這么幾個主要步驟
先查看文件的狀態(tài)
git status
- 把文件添加到本地暫緩區(qū)
git add . - 把文件添加到本地代碼倉庫
git commit 文件名 - 建立本地倉庫與遠(yuǎn)程代碼倉庫之間的連接
先查看是不是有遠(yuǎn)程的代碼倉庫
git remote
如果沒有的話手動添加關(guān)聯(lián)
git remote add origin 遠(yuǎn)程倉庫url - 把本地代碼提交到遠(yuǎn)程代碼倉庫
git push origin master - 添加tag,這里面的tag要跟.podspec里面的version保持一致
git tag -a 0.1.0 -m '描述文字' - 把tag推送到遠(yuǎn)程代碼倉庫
git push --tags
- 將我們的組建添加到pod庫里面,這里需要穿我們自己私有的庫名還有組建的podspec文件全稱
pod repo push HLPrivateStore HomeKit.podspec
執(zhí)行這句可能會產(chǎn)生警告,這時候我們可以忽略警告,可以在后面加上 一句
pod repo push HLPrivateStore HomeKit.podspec --allow-warnings
當(dāng)執(zhí)行完這部我們用pod search來搜索一下看看有沒有我們的庫,如果有就可以使用了。注意,要在podfile文件里面加上一句
source '本地庫的url '
因為他默認(rèn)會從公有庫里尋找,
- 注意以后我們更新我們的庫的話 需要更改podspec。里面的version
還要重新設(shè)置git的tag
劃分子組件
如果我們的組件中用到了太了文件和一些共有的工具類,我們可以將它們劃分成一個個子組件,這樣當(dāng)我們使用的時候,在工程里面就可以很清晰的辨別文件的類型
s.subspec 'Frame' do |frame|
#兩個frame的名字不能一樣不然會出錯,第二個只是一個變量名字,用來在在這個區(qū)間使用
frame.source_files = 'HomeKit/Classes/Frame/*.{h, m}'
end
因為我們沒有改代碼,所有子需要重新覆蓋一下本地的podspec文件就好了
pod repo push HLPrivateStore HomeKit.podspec --allow-warnings
因為我們剛剛更新了spec的文件,劃分了文件結(jié)構(gòu),所以我們引用的項目,重新pod update一下
這時候我們引用的地方可能會出現(xiàn),劃分的文件夾,但是里面沒有文件,文件還是在外面,這是因為我們那有引用全部文件s.source_files = 'HomeKit/Classes/**/*'這句代碼,所以我們要把這句話注釋掉,就可以了
組件加載資源文件(圖片 xib storybord)
在 .podspec文件里面更改
s.resource_bundles = {
'HLCategory' => ['HLCategory/Assets/*.png', 'HLCategory/Classes/**/*.xib']
}
s.resource_bundles = {
'SHLLiveKit' => ['SHLLiveKit/Classes/**/*.{storyboard,xib}']
}
當(dāng)我們在使用 我們框架里面的圖片資源的時候,要記得加上bundle的名字,因為Xcode會將我們的資源壓縮到我們框架的bundle里面,它本身不是mainBundle里面的資源,所以不能直接使用,圖片名字