私有庫搭建流程:
一 準(zhǔn)備工作:
1 查看本地是否有私有庫索引文件 pod repo
2 建立存儲podsepc的地方(習(xí)慣上一般把該podspec和源碼庫放在一起辕近,即是該文件同級目錄是Pod文件夾)名段,如github或者gitlab
3 添加私有庫的本地索引骑丸,pod repo add 本地索引庫名稱 遠(yuǎn)程索引庫地址
4 通過pod repo查看是否添加成功
二 私有庫創(chuàng)建(即是存放源碼的地方)
1 創(chuàng)建遠(yuǎn)程倉庫
2 把遠(yuǎn)程庫拉到本地 git clone
3 創(chuàng)建測試工程(隨便一個本地別的目錄,在源碼庫本目錄還未試驗(yàn)),pod init 生成podfile,pod install生成workspace文件
4 創(chuàng)建podspec文件: pod spec create 庫名。在podspec同級目錄創(chuàng)建Pod/Classes文件夾纲刀,功能模塊就放在該classes文件夾下
5 podspec編寫:
必寫字段:
version 必須有tag對應(yīng)
License
platform最好指定,否則在某個未測試兼容的平臺可能報錯
source
source_files:這里要注意補(bǔ)上Pod/前綴
framework:源碼有用到的系統(tǒng)framework要導(dǎo)入
6 提交Podspec和源碼担平,并且打tag
git add --all
git commit -m "update podspec"
git push origin master
git tag 0.0.1
git push --tags
7 檢測pod庫是否可用
Pod lib lint
8 測試本地庫是否可用
pod ‘庫名’示绊,:path =>’本地庫絕對路徑’
Pod repo update
pod install
看源碼文件是否能拉下來,看編譯是否通過
9 提交本地庫,向Spec Repo提交podspec
pod repo push BYPrivateComponent BYPrivateComponent.podspec --verbose --use-libraries --allow-warnings
10 測試是否提交成功pod search 庫名
11 在測試工程導(dǎo)入暂论,測試是否可用 pod 'BYComponents', :git => 'https://xxx.git'或者直接pod ‘庫名’
12 只要更新了pod文件夾下內(nèi)容或者更改了podspec文件都需要執(zhí)行pod update
在隨便一個測試工程引入該庫面褐,例如: pod 'BYComponents', :git => 'https://github.com/zhoubingyu/BYComponents.git'
Pod install 如果報錯就pod update
重新打開workspace工程文件
問題和解決辦法
1 如遇到The source_files
pattern did not match any file
1.1 檢查是否打tag,并且源碼文件推送到遠(yuǎn)程倉庫
1.2 檢查本地目錄/Users/Dana/.cocoapods/repos/空另,是否是最新的podspec文件盆耽,此處的Pod目錄下的文件是否正確。如不正確扼菠,pod repo update /Users/Dana/.cocoapods/repos/BYComponents
更新維護(hù)podspec
1 先將源文件添加到Pod/Classes中
2 編輯podspec
3 在測試項(xiàng)目里pod update
4 把代碼push到遠(yuǎn)端并打tag
5 再次使用pod lib lint驗(yàn)證編輯好的podsepc文件
6 提交本地庫 pod repo push PodTestLibrary PodTestLibrary.podspec
7 到~/.cocoapods/repos/PrivateRepo目錄下查看
8 pod search測試
組件化踩坑記錄
1 subspec里面的source文件夾路徑如果某級目錄沒文件,會報錯坝咐。因?yàn)間it不存儲空文件夾
2 每次有改動循榆,要驗(yàn)證pod lib lint YXComponents.podspec,要提交源碼到遠(yuǎn)程倉庫墨坚,打tag秧饮,對應(yīng)修改podspec里面的版本號,然后推送私有庫索引到遠(yuǎn)程pod repo push YXComponents
3 subspec里面指定的源文件的位置泽篮,不能放在總組件目錄下盗尸。否則報錯,該目錄是放自動生成的版本信息的帽撑。
4 私庫有更新升級流程:
4.1 提交更新的修改
4.2 打tag
4.3 升級Podspec里面的版本號
4.4 pod lint repo xxx
4.5 pod push repo xxx
4.6 pod install
4.7 pod repo push BYPrivateComponent BYPrivateComponent.podspec --verbose --use-libraries --allow-warnings
4.8 遇到target has transitive dependencies that include statically linked binaries
解決辦法: 兩步:1 在podspec加上 s.static_framework = true 2 push私有庫時加上--use-libraries
4.9 劃分子目錄需要每個子目錄能單獨(dú)編譯通過泼各,并且所有的子目錄的父親的source_files不能包含子目錄的文件,否則文件夾被創(chuàng)建亏拉,但是文件還在父目錄下
5.0
允許使用靜態(tài)庫扣蜻,允許警告,可查看詳細(xì)信息及塘。推送私庫到倉庫
pod repo push YXComponents YXComponents.podspec --verbose --use-libraries --allow-warnings
5.1 如果指定了spec文件的public_header_files莽使,則所有要暴露出來的頭文件都要包含在里面。不包含的頭文件將無法引用
5.2 如果依賴了類似libresolv.tbd這類文件笙僚,則要添加下面依賴芳肌,注意去掉前綴lib和后綴.tbd
s.libraries = ‘resolv’
5.3 如果引入有.c文件的pod庫的.h文件,報錯Undefined symbols for architecture i386
方法一:(已驗(yàn)證)在repo push 后面加--skip-import-validation
方法二:s.pod_target_xcconfig = { 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }
5.4 指定私庫版本號
pod 'YXComponents','0.5.9', :subspecs => ['Base','JSBridgesBaseDefine','YXBaseDefine']
5.5 Unexpected duplicate task 錯誤
看podspect里面的依賴路徑是否有重復(fù)包含某個文件,或者匹配集太大亿笤,剛好都包含到同一個文件了翎迁。關(guān)鍵看source_files和resource的匹配模式