當(dāng)公司的項目越來越大的時候惭每,為了便于管理骨饿,組件庫就成了一個很好的選擇,便于我們開發(fā)維護(hù)以及在不同的項目中使用台腥。下面我們來走一遍組件庫的創(chuàng)建流程:
我們創(chuàng)建一個工具類的組件庫宏赘,命名為ZKFoundation庫。
git上傳的功能方法和遇到的各種問題處理方法@璩蕖2焓稹!>骸L簟!P莘汀0夤 !A鼋浮阳懂!
一、創(chuàng)建組件庫
pod lib create ZKFoundation
接下來會彈出來幾個問題:
1、What platform do you want to use?? [ iOS / macOS ] 選:iOS
2希太、What language do you want to use?? [ Swift / ObjC ] 根據(jù)需要選擇語言
3克饶、Would you like to include a demo application with your library? [ Yes / No ] //是否創(chuàng)建包含組件的demo
4酝蜒、Which testing frameworks will you use? [ Specta / Kiwi / None ] 使用那些測試框架誊辉,選None
5、Would you like to do view based testing? [ Yes / No ] 你是否要執(zhí)行基于view的測試
6亡脑、What is your class prefix? 你類的前綴是什么堕澄?
根據(jù)我們的設(shè)置生成的pod工程。
工程內(nèi)容:
pod 'ZKFoundation', :path => '../' 本地庫的引入方式
在ZKFoundation里面編寫代碼霉咨。
二蛙紫、編寫注意事項
1、在編寫的時候途戒,我們可以直接通過pod 'ZKFoundation', :path => '../' 的方式引用坑傅,把創(chuàng)建的組件庫放到我們的工程里面,然后使用喷斋,提交代碼的時候唁毒,只提交這個本地庫的就可以。
2星爪、每次創(chuàng)建或者刪除組件庫中的類之后浆西,要在這個組件庫里面pod install一下,然后在我們整個項目的pod install顽腾,防止找不到類的錯誤近零。
3、創(chuàng)建一個頭文件抄肖,將所有的類的頭文件放到里面久信,方便外部直接引用哦。
4漓摩、在ZKFoundation-prefix中可以定義宏方法裙士,方便我們調(diào)用
三、添加依賴
項目中我們一般會引用其他庫或者第三方庫幌甘,就需要我們添加相應(yīng)的依賴潮售。
在ZHFoundation.podspec中,添加相關(guān)依賴:
s.dependency 'AFNetworking', '4.0.1'
s.dependency 'UMCommon'
s.dependency 'IKCrypt'
這樣在我們pod引入ZHFoundation庫的時候就會自動引入相關(guān)庫锅风,供我們的庫使用酥诽。
四、打tag
引入的時候根據(jù)tag引入我們的工程中皱埠。
zhanyingzhu@zhanyingdeMacBook-Pro-3 TYTShareAndMobEvent % git add .
zhanyingzhu@zhanyingdeMacBook-Pro-3 TYTShareAndMobEvent % git commit -m "tag=0.0.2-beta"
[master 6f4c338] tag=0.0.2-beta
2 files changed, 1 insertion(+), 3 deletions(-)
zhanyingzhu@zhanyingdeMacBook-Pro-3 TYTShareAndMobEvent % git push
zhanyingzhu@zhanyingdeMacBook-Pro-3 TYTShareAndMobEvent % git tag -a "0.0.2-beta" -m "1肮帐、 此版本為0.1.0版本的beta版,上傳相關(guān)類和依賴。"
zhanyingzhu@zhanyingdeMacBook-Pro-3 TYTShareAndMobEvent % git push origin --tags
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 231 bytes | 231.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
To 192.168.2.20:iOS-Components/TYTShareAndMobEvent.git
* [new tag] 0.0.2-beta -> 0.0.2-beta
zhanyingzhu@zhanyingdeMacBook-Pro-3 TYTShareAndMobEvent % git tag
0.0.1-beta
0.0.2-beta
這樣tag就完成了训枢。引入我們項目中如下:
pod 'TYTShareAndMobEvent', :git => 'git@192.168.2.18:iOS-Components/TYTShareAndMobEvent.git', :tag => '0.0.2-beta'
然后調(diào)用pod update TYTShareAndMobEvent --no-repo-update
更新最新的版本托修。
打tag遇到的問題:
To 192.168.2.20:iOS-Components/TYTFoundation.git
* [new tag] 0.1.6-beta -> 0.1.6-beta
! [rejected] 0.1.4-beta -> 0.1.4-beta (already exists)
! [rejected] 0.1.5-beta -> 0.1.5-beta (already exists)
error: failed to push some refs to '192.168.2.20:iOS-Components/TYTFoundation.git'
hint: Updates were rejected because the tag already exists in the remote.
更新被拒絕,因為tag在遠(yuǎn)端已經(jīng)存在了恒界。
1睦刃,執(zhí)行命令 獲取所有的標(biāo)簽
git pull --tags
2、執(zhí)行命令 覆蓋本地存在的標(biāo)簽沖突
git pull --tags -f
然后再git pul git push就可以了十酣。
3涩拙、刪除tag:
如果提交tag之后,返現(xiàn)這次提交的有問題耸采,又不想增加tag兴泥,那么我們可以刪除tag,修改代碼完畢push之后虾宇,再次打tag提交搓彻。
zhanyingzhu@zhanyingdeMacBook-Pro-3 Example % git tag
0.0.1-beta
0.0.2-beta
0.0.3-beta
0.0.4-beta
0.1.0
0.1.5-beta
zhanyingzhu@zhanyingdeMacBook-Pro-3 Example % git tag -d 0.1.0
Deleted tag '0.1.0' (was 0c9b704)
zhanyingzhu@zhanyingdeMacBook-Pro-3 Example % git push origin :refs/tags/0.1.0
To 192.168.2.20:iOS-Components/TYTShareAndMobEvent.git
- [deleted] 0.1.0
五、組件庫提交標(biāo)準(zhǔn):
1嘱朽、依賴的第三方庫版本都要寫上旭贬。
2、依賴的自己的組件庫版本燥翅、tag不需要寫骑篙,否則,組件庫的版本號森书、tag一變動靶端,那么依賴就會有問題。因為庫沒有更新凛膏。
3杨名、podspace本地庫的版本號s.version = ‘0.1.5-beta’,要隨時變動猖毫。否則雖然代碼拉的是最新的tag台谍,但是版本號卻依然是舊的版本號0.1.4。 雖然說用起來沒問題吁断,但是看著對不上版本號也是鬧心趁蕊。
4、組件庫依賴的三方庫仔役,可以在主工程中刪除掉掷伙。在pod install的時候會自動引入。
六又兵、Pod 私有庫創(chuàng)建&組件化的實踐
傳送門(http://www.reibang.com/p/8219d29fea17)
七任柜、git stash (暫存)
1卒废、先git status獲取當(dāng)前的修改的狀態(tài)。
2宙地、然后使用git stash暫存現(xiàn)在所有的修改文件摔认。
3、 git log獲取以前提交的所有內(nèi)容宅粥。
zhanyingzhu@zhanyingdeMacBook-Pro-3 client_program % git log
commit 549b8ebd5240089872d62831e71c977c594842b4 (HEAD -> dev_6270, origin/dev_6270)
Author: Bubble <huobingbing@teyuntong.com>
Date: Wed Nov 30 13:53:52 2022 +0800
Podfile udpate
commit 6c7da301cf6ca6a39619b9b5457b03ec97bedf7b //這個
Author: chaoyakai <chaoyakai@teyuntong.com>
Date: Wed Nov 30 10:44:00 2022 +0800
fix: 文案修改
commit 026e7d419f91233efdf6e6949fe1c21093012b63
Author: chaoyakai <chaoyakai@teyuntong.com>
Date: Wed Nov 30 10:30:39 2022 +0800
fix: 文案修改
4参袱、然后選取我們要回退的版本id。
git reset --hard 6c7da301cf6ca6a39619b9b5457b03ec97bedf7b
使用hard會回到置頂?shù)腸ommit_id粹胯,但是也會清除掉我們提交的代碼蓖柔,如果要保留代碼,那們就是用git reset --soft 6c7da301cf6ca6a39619b9b5457b03ec97bedf7b
风纠,這樣技能回退,又能保留我們修改的代碼牢贸。
5竹观、pod instlal
拉取這個提交的所有代碼,運行代碼(沒問題)
6潜索、git stash list
查看暫存的所有的內(nèi)容
zhanyingzhu@zhanyingdeMacBook-Pro-3 client_program % git stash list
stash@{0}: WIP on dev_6270: 549b8ebd Podfile udpate
stash@{1}: On dev_6270: TYTGoodsDetailController沖突處理
7臭增、恢復(fù)所有的代碼
zhanyingzhu@zhanyingdeMacBook-Pro-3 client_program % git stash apply stash@{0}
On branch dev_6270
Your branch is up to date with 'origin/dev_6270'.
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: Common/Launch/Task/TYTAgreedPrivacyTask.m
modified: Common/role/TYTSelectedRoleTools.m
modified: MBTytOne.xcodeproj/project.pbxproj
deleted: TytCars/Classes/Other/lib/Encapsulation/TYTDataManager.h
deleted: TytCars/Classes/Other/lib/Encapsulation/TYTDataManager.m
如果要查看相應(yīng)的修改:git diff TytCars/PrefixHeader-Cars.pch
8、然后就是走提交代碼那一套流程了竹习。git add . 以及之后的代碼
上面是git push的時候誊抛,發(fā)現(xiàn)有沖突,但是代碼已經(jīng)commit整陌,我們需要回退拗窃。但如果是沒有提交,在git pull的時候報沖突泌辫,我們就使用下面的方法:
git stash
git pull
git stash pop
git stash: 將改動藏起來
git pull:用新代碼覆蓋本地代碼
git stash pop: 將剛藏起來的改動恢復(fù)
這樣操作的效果是在最新的倉庫代碼的基礎(chǔ)仍保留本地的改動随夸。這個時候,就會有沖突震放,我們只需要一個個解決沖突就行了宾毒。如果不想保留本地的修改,那么就直接覆蓋掉就行了殿遂。
git reset --hard
git pull
八诈铛、上傳到pod遠(yuǎn)端中
這個是組件沒有依賴別的私有組件導(dǎo)致需要校驗相關(guān)源的情況,所以不需要添加相關(guān)源墨礁,校驗的時候默認(rèn)走cocoapod的默認(rèn)源幢竹。
1、驗證podspec索引文件
通過 pod spec lint --verbose --allow-warnings --use-libraries
命令驗證 podspec 索引文件饵溅。
2妨退、提交索引文件到遠(yuǎn)程索引庫
驗證通過之后,pod repo push 本地索引庫 索引文件名 --verbose --allow-warnings --use-libraries
將索引文件提交的到遠(yuǎn)程索引庫。
pod repo push WJHSpecs WJHBaseWidgets.podspec --verbose --allow-warnings --use-libraries
組件庫的提交和靜態(tài)庫的提交略有不同咬荷,詳見之前寫的文章冠句。
http://www.reibang.com/p/f0a90a119b98
九、Pod有依賴的提交到遠(yuǎn)端
一般情況下項目會依賴外部source源幸乒,所以我們需要在校驗的時候添加相應(yīng)的依賴source源懦底,盡量不要多寫無關(guān)的source源避免節(jié)外生枝。
1罕扎、將代碼提交到倉庫聚唐。git push
2、打tag腔召,注意和podspace文件中的s.tag = 0.1.0相同杆查。
git tag -a "0.1.0" -m "1.此版本為0.1.0正式版本"
git push —-tags
3、提交完畢之后校驗
pod lib lint --allow-warnings --verbose --sources=gitee-mirrors-cocoapods-specs,amh-group-iosymm-mb-specrepo,amh-group-cocoapods-mb-thirdpartyspecrepo,2-cocoapods-tyt-specs
這個校驗如果報錯臀蛛,就使用下面這個亲桦,使用
pod spec lint --verbose --allow-warnings --use-libraries --no-clean --sources=gitee-mirrors-cocoapods-specs,amh-group-iosymm-mb-specrepo,amh-group-cocoapods-mb-thirdpartyspecrepo,2-cocoapods-tyt-specs --use-modular-headers
這四個源分別是我們工程中依賴到的相關(guān)源
其中相應(yīng)的source就是我們工程中以來的source源。注意不要寫https浊仆,通過pod repo list
來查看本地源客峭。然后填寫在--sources=后面。校驗沒問題之后抡柿,到最后一步提交舔琅。
4、提交
REPO_NAME:本地的文件名
加上提交的podspec文件
pod repo push 2-cocoapods-tyt-specs TYTShareAndMobEvent.podspec --verbose --allow-warnings
報錯洲劣,提交過程中提示我要輸入github的賬號和密碼备蚓,莫名其妙,工程中用的是gitlab闪檬,怎么也不會是github星著,一查才發(fā)現(xiàn)是podspec文件中的源s.source = 寫的是github地址。需要改成我們項目的地址粗悯,使用ssh的地址即可虚循。
還有一個Xcode版本的問題,在Xcode14中样傍,podfile使用use_modular_headers!
横缔,也就是使用代碼的方式,不要使用use_frameworks!
衫哥,這樣會使用framework茎刚,clean之后編譯總會報找不到MBProgressUD三方庫文件找不到的問題。
9.1 Repo是什么
repo是Google開發(fā)的用于管理項目版本庫的一個工具撤逢,repo是使用Python對git進(jìn)行了一定的封裝膛锭,并不是用于取代git粮坞,它簡化了對多個Git版本庫的管理。用repo管理的版本庫都需要使用git命令來進(jìn)行操作初狰。
簡單理解:repo擔(dān)任角色
- repo就是多個git庫的管理工具莫杈。如果是多個git庫同時管理,可以使用repo奢入。
- 作用就是和主代碼服務(wù)器交互
- 用manifest.xml管理多個git倉庫
git repo工具詳細(xì)使用教程——徹底學(xué)會Android repo的使用
Git筝闹、Gerrit、Repo三者的區(qū)別及使用
9.2 為什么用Repo
項目組件化模塊化之后腥光,各個模塊也作為獨立的git倉庫從主項目中剝離了出來关顷。各個模塊各自管理自己的版本和分支,為了方便管理各個子項目的Git倉庫武福,需要一個上層工具批量進(jìn)行處理议双。因此使用了reop,repo也會建立一個Git倉庫艘儒,用來記錄當(dāng)前項目下的各個子項目的git倉庫分別屬于哪一個分支聋伦。比如我們用pod repo list
查出來之后可以看到,有我們自己的倉庫分支2-cocoapods-tyt-specs
界睁,也有滿幫amh-group-cocoapods-mb-thirdpartyspecrepo``amh-group-iosymm-mb-specrepo
,還有cocoapods的gitee-mirrors-cocoapods-specs
兵拢。
9.3 更新Repo
如果ZHFoundation從 0.1.0 升級到 0.2.0翻斟,需要執(zhí)行兩個命令:
pod repo update 2-cocoapods-tyt-specs
更新repo源,否則會報找不到版本的錯誤None of your spec sources contain a spec satisfying the dependency:
ZHFoundation (= 0.2.0).
并提示你out-of-date source repos which you can update with pod repo update or with pod install --repo-update.
然后再pod install或者pod update ZHFoundation --no-repo-update即可说铃。
十访惜、組件化的優(yōu)化
1、圖片的優(yōu)化
把圖片放到新創(chuàng)建的圖片文件中腻扇,這樣的好處就是圖片的@2x,@3x债热,再被不同屏幕的手機加載的時候,會使用一種圖片幼苛,減少包體積窒篱。
十一、本地校驗遇到的報錯問題
1舶沿、引用靜態(tài)庫報錯
ERROR | [iOS] unknown: Encountered an unknown error (The 'Pods-App' target has transitive dependencies that include statically linked binaries:
在命令中加入 --use-libraries 允許使用靜態(tài)庫即可墙杯。
2、Xcode編譯報錯
- ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code.
添加 --use-modular-headers.
總的命令如下:
pod lib lint --allow-warnings --use-libraries --verbose --sources=amh-group-iosymm-mb-specrepo,amh-group-cocoapods-mb-thirdpartyspecrepo,gitee-mirrors-cocoapods-specs,2-cocoapods-tyt-specs --use-modular-headers
3括荡、如果有報下面的錯
Cannot code sign because the target does not have an Info.plist file and one is not being generated automatically. Apply an Info.plist file to the target using the INFOPLIST_FILE build setting or generate one automatically by setting the GENERATE_INFOPLIST_FILE build setting to YES (recommended). (in target 'App' from project 'App')
我們只改工程里面的GENERATE_INFOPLIST_FILE設(shè)置為YES時不行的高镐,那樣只是主工程有用,其余的組件庫用不到畸冲。需要在podspec文件里面添加嫉髓,這樣就可以將所有依賴的組件庫設(shè)置成YES观腊。
s.user_target_xcconfig = {
'GENERATE_INFOPLIST_FILE' => 'YES'
}
這樣會導(dǎo)致一個CFBundle文件找不到的問題,需要我們手動的添加build號算行,如下:
4梧油、報錯
LoadError - dlopen(/Library/Ruby/Gems/2.6.0/gems/ffi-1.15.5/lib/ffi_c.bundle, 0x0009):
tried: '/Library/Ruby/Gems/2.6.0/gems/ffi-1.15.5/lib/ffi_c.bundle'
(mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64')),
'/usr/lib/ffi_c.bundle' (no such file) - /Library/Ruby/Gems/2.6.0/gems/
ffi-1.15.5/lib/ffi_c.bundle
這是由于M1芯片導(dǎo)致的在pod命令時報ffi相關(guān)的錯誤,解決辦法如下:
sudo arch -x86_64 gem install ffi
arch -x86_64 $SHELL
就可以啟動一個 X86 模式終端纱意,使得之后運行的命令都在 X86 模式下運行婶溯。然后在執(zhí)行上傳podspec命令:
pod repo push 2-cocoapods-tyt-specs TYTGoodsOrderManagement.podspec --verbose --allow-warnings --use-modular-headers --use-libraries
在更新podspec文件:
pod repo update 2-cocoapods-tyt-specs
成功:
5、podspec修改錯誤
error: Cannot code sign because the target does not have an Info.plist file and one is not being
generated automatically. Apply an Info.plist file to the target using the INFOPLIST_FILE build setting
or generate one automatically by setting the GENERATE_INFOPLIST_FILE build setting to YES
(recommended). (in target 'App' from project 'App')
這個時候需要在podspec文件里面新增:
s.user_target_xcconfig = {
'GENERATE_INFOPLIST_FILE' => 'YES'
}
s.pod_target_xcconfig = {
'GENERATE_INFOPLIST_FILE' => 'YES'
}
十二偷霉、創(chuàng)建組件庫遇到的問題
1迄委、創(chuàng)建遠(yuǎn)程私有索引庫MyLib
2、創(chuàng)建組件庫
3类少、發(fā)布
發(fā)布遇到問題是MyLib的問題叙身,如下圖:
分支和你當(dāng)前的分支要一樣,不一樣的話就會報這樣的錯誤硫狞。
我們需要將隱藏的.git中的config文件中的對應(yīng)分支改一下信轿。