iOS組件化的創(chuàng)建姆涩、tag、提交到遠(yuǎn)端

當(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工程。


image.png

工程內(nèi)容:


image.png
  pod 'ZKFoundation', :path => '../'  本地庫的引入方式

在ZKFoundation里面編寫代碼霉咨。

二蛙紫、編寫注意事項

1、在編寫的時候途戒,我們可以直接通過pod 'ZKFoundation', :path => '../' 的方式引用坑傅,把創(chuàng)建的組件庫放到我們的工程里面,然后使用喷斋,提交代碼的時候唁毒,只提交這個本地庫的就可以。
2星爪、每次創(chuàng)建或者刪除組件庫中的類之后浆西,要在這個組件庫里面pod install一下,然后在我們整個項目的pod install顽腾,防止找不到類的錯誤近零。
3、創(chuàng)建一個頭文件抄肖,將所有的類的頭文件放到里面久信,方便外部直接引用哦。


image.png

4漓摩、在ZKFoundation-prefix中可以定義宏方法裙士,方便我們調(diào)用


image.png

三、添加依賴

項目中我們一般會引用其他庫或者第三方庫幌甘,就需要我們添加相應(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就可以了十酣。


image.png

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)任角色
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债热,再被不同屏幕的手機加載的時候,會使用一種圖片幼苛,減少包體積窒篱。


image.png

image.png

十一、本地校驗遇到的報錯問題

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號算行,如下:


image.png

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 

成功:


success

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)建組件庫遇到的問題

從0到1創(chuàng)建組件庫

1迄委、創(chuàng)建遠(yuǎn)程私有索引庫MyLib
2、創(chuàng)建組件庫
3类少、發(fā)布
發(fā)布遇到問題是MyLib的問題叙身,如下圖:


問題

分支和你當(dāng)前的分支要一樣,不一樣的話就會報這樣的錯誤硫狞。
我們需要將隱藏的.git中的config文件中的對應(yīng)分支改一下信轿。


WeChatbfac25fcd4fc80fd390a4df189e4d5c9.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市残吩,隨后出現(xiàn)的幾起案子财忽,更是在濱河造成了極大的恐慌,老刑警劉巖泣侮,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件即彪,死亡現(xiàn)場離奇詭異,居然都是意外死亡活尊,警方通過查閱死者的電腦和手機隶校,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛹锰,“玉大人深胳,你說我怎么就攤上這事⊥” “怎么了舞终?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長翎苫。 經(jīng)常有香客問我权埠,道長,這世上最難降的妖魔是什么煎谍? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任攘蔽,我火速辦了婚禮,結(jié)果婚禮上呐粘,老公的妹妹穿的比我還像新娘满俗。我一直安慰自己转捕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布唆垃。 她就那樣靜靜地躺著五芝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辕万。 梳的紋絲不亂的頭發(fā)上枢步,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音渐尿,去河邊找鬼醉途。 笑死,一個胖子當(dāng)著我的面吹牛砖茸,可吹牛的內(nèi)容都是我干的隘擎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼凉夯,長吁一口氣:“原來是場噩夢啊……” “哼货葬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起劲够,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤震桶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后征绎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尼夺,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年炒瘸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寝衫。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡顷扩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慰毅,到底是詐尸還是另有隱情隘截,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布汹胃,位于F島的核電站婶芭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏着饥。R本人自食惡果不足惜犀农,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宰掉。 院中可真熱鬧呵哨,春花似錦赁濒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挨务,卻和暖如春击你,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谎柄。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工丁侄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谷誓。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓绒障,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捍歪。 傳聞我的和親對象是個殘疾皇子户辱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容