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

當(dāng)公司的項(xiàng)目越來越大的時(shí)候,為了便于管理,組件庫就成了一個(gè)很好的選擇,便于我們開發(fā)維護(hù)以及在不同的項(xiàng)目中使用。下面我們來走一遍組件庫的創(chuàng)建流程:
我們創(chuàng)建一個(gè)工具類的組件庫,命名為ZKFoundation庫。
git上傳的功能方法和遇到的各種問題處理方法?。。。。。。。。。。?/a>

一、創(chuàng)建組件庫

pod lib create ZKFoundation

接下來會(huì)彈出來幾個(gè)問題:

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里面編寫代碼。

二、編寫注意事項(xiàng)

1、在編寫的時(shí)候,我們可以直接通過pod 'ZKFoundation', :path => '../' 的方式引用,把創(chuàng)建的組件庫放到我們的工程里面,然后使用,提交代碼的時(shí)候,只提交這個(gè)本地庫的就可以。
2、每次創(chuàng)建或者刪除組件庫中的類之后,要在這個(gè)組件庫里面pod install一下,然后在我們整個(gè)項(xiàng)目的pod install,防止找不到類的錯(cuò)誤。
3、創(chuàng)建一個(gè)頭文件,將所有的類的頭文件放到里面,方便外部直接引用哦。


image.png

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


image.png

三、添加依賴

項(xiàng)目中我們一般會(huì)引用其他庫或者第三方庫,就需要我們添加相應(yīng)的依賴。
在ZHFoundation.podspec中,添加相關(guān)依賴:

  s.dependency 'AFNetworking', '4.0.1'
  s.dependency 'UMCommon'
  s.dependency 'IKCrypt'

這樣在我們pod引入ZHFoundation庫的時(shí)候就會(huì)自動(dòng)引入相關(guān)庫,供我們的庫使用。

四、打tag

引入的時(shí)候根據(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就完成了。引入我們項(xiàng)目中如下:

  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.

更新被拒絕,因?yàn)閠ag在遠(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一變動(dòng),那么依賴就會(huì)有問題。因?yàn)閹鞗]有更新。
3、podspace本地庫的版本號s.version = ‘0.1.5-beta’,要隨時(shí)變動(dòng)。否則雖然代碼拉的是最新的tag,但是版本號卻依然是舊的版本號0.1.4。 雖然說用起來沒問題,但是看著對不上版本號也是鬧心。
4、組件庫依賴的三方庫,可以在主工程中刪除掉。在pod install的時(shí)候會(huì)自動(dòng)引入。

六、Pod 私有庫創(chuàng)建&組件化的實(shí)踐

傳送門(http://www.itdecent.cn/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  //這個(gè)
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會(huì)回到置頂?shù)腸ommit_id,但是也會(huì)清除掉我們提交的代碼,如果要保留代碼,那們就是用git reset --soft 6c7da301cf6ca6a39619b9b5457b03ec97bedf7b,這樣技能回退,又能保留我們修改的代碼。
5、pod instlal拉取這個(gè)提交的所有代碼,運(yùn)行代碼(沒問題)
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的時(shí)候,發(fā)現(xiàn)有沖突,但是代碼已經(jīng)commit,我們需要回退。但如果是沒有提交,在git pull的時(shí)候報(bào)沖突,我們就使用下面的方法:

git stash
git pull 
git stash pop

git stash: 將改動(dòng)藏起來
git pull:用新代碼覆蓋本地代碼
git stash pop: 將剛藏起來的改動(dòng)恢復(fù)
這樣操作的效果是在最新的倉庫代碼的基礎(chǔ)仍保留本地的改動(dòng)。這個(gè)時(shí)候,就會(huì)有沖突,我們只需要一個(gè)個(gè)解決沖突就行了。如果不想保留本地的修改,那么就直接覆蓋掉就行了。

git reset --hard
git pull

八、上傳到pod遠(yuǎn)端中

這個(gè)是組件沒有依賴別的私有組件導(dǎo)致需要校驗(yàn)相關(guān)源的情況,所以不需要添加相關(guān)源,校驗(yàn)的時(shí)候默認(rèn)走cocoapod的默認(rèn)源。
1、驗(yàn)證podspec索引文件
通過 pod spec lint --verbose --allow-warnings --use-libraries命令驗(yàn)證 podspec 索引文件。
2、提交索引文件到遠(yuǎn)程索引庫
驗(yà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.itdecent.cn/p/f0a90a119b98

九、Pod有依賴的提交到遠(yuǎn)端

一般情況下項(xiàng)目會(huì)依賴外部source源,所以我們需要在校驗(yàn)的時(shí)候添加相應(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、提交完畢之后校驗(yàn)
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
這個(gè)校驗(yàn)如果報(bào)錯(cuò),就使用下面這個(gè),使用
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
這四個(gè)源分別是我們工程中依賴到的相關(guān)源
其中相應(yīng)的source就是我們工程中以來的source源。注意不要寫https,通過pod repo list來查看本地源。然后填寫在--sources=后面。校驗(yàn)沒問題之后,到最后一步提交。
4、提交
REPO_NAME:本地的文件名
加上提交的podspec文件
pod repo push 2-cocoapods-tyt-specs TYTShareAndMobEvent.podspec --verbose --allow-warnings

報(bào)錯(cuò),提交過程中提示我要輸入github的賬號和密碼,莫名其妙,工程中用的是gitlab,怎么也不會(huì)是github,一查才發(fā)現(xiàn)是podspec文件中的源s.source = 寫的是github地址。需要改成我們項(xiàng)目的地址,使用ssh的地址即可。

還有一個(gè)Xcode版本的問題,在Xcode14中,podfile使用use_modular_headers!,也就是使用代碼的方式,不要使用use_frameworks!,這樣會(huì)使用framework,clean之后編譯總會(huì)報(bào)找不到MBProgressUD三方庫文件找不到的問題。

9.1 Repo是什么

repo是Google開發(fā)的用于管理項(xiàng)目版本庫的一個(gè)工具,repo是使用Python對git進(jìn)行了一定的封裝,并不是用于取代git,它簡化了對多個(gè)Git版本庫的管理。用repo管理的版本庫都需要使用git命令來進(jìn)行操作。

簡單理解:repo擔(dān)任角色
9.2 為什么用Repo

項(xiàng)目組件化模塊化之后,各個(gè)模塊也作為獨(dú)立的git倉庫從主項(xiàng)目中剝離了出來。各個(gè)模塊各自管理自己的版本和分支,為了方便管理各個(gè)子項(xiàng)目的Git倉庫,需要一個(gè)上層工具批量進(jìn)行處理。因此使用了reop,repo也會(huì)建立一個(gè)Git倉庫,用來記錄當(dāng)前項(xiàng)目下的各個(gè)子項(xiàng)目的git倉庫分別屬于哪一個(gè)分支。比如我們用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í)行兩個(gè)命令:

pod repo update 2-cocoapods-tyt-specs

更新repo源,否則會(huì)報(bào)找不到版本的錯(cuò)誤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,再被不同屏幕的手機(jī)加載的時(shí)候,會(huì)使用一種圖片,減少包體積。


image.png

image.png

十一、本地校驗(yàn)遇到的報(bào)錯(cuò)問題

1、引用靜態(tài)庫報(bào)錯(cuò)

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編譯報(bào)錯(cuò)

- 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、如果有報(bào)下面的錯(cuò)

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時(shí)不行的,那樣只是主工程有用,其余的組件庫用不到。需要在podspec文件里面添加,這樣就可以將所有依賴的組件庫設(shè)置成YES。

  s.user_target_xcconfig = {
      'GENERATE_INFOPLIST_FILE' => 'YES'
  }

這樣會(huì)導(dǎo)致一個(gè)CFBundle文件找不到的問題,需要我們手動(dòng)的添加build號,如下:


image.png

4、報(bào)錯(cuò)

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命令時(shí)報(bào)ffi相關(guān)的錯(cuò)誤,解決辦法如下:

sudo arch -x86_64 gem install ffi
arch -x86_64 $SHELL

就可以啟動(dòng)一個(gè) X86 模式終端,使得之后運(yùn)行的命令都在 X86 模式下運(yùn)行。然后在執(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修改錯(cuò)誤

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')

這個(gè)時(shí)候需要在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)前的分支要一樣,不一樣的話就會(huì)報(bào)這樣的錯(cuò)誤。
我們需要將隱藏的.git中的config文件中的對應(yīng)分支改一下。


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

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

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