用法:
Podfile 中添加
source 'https://github.com/CocoaPods/Specs.git' # 官方庫
source 'https://github.com/QinKingHan/BX_Podspec_Repo.git' # 私有庫
pod 'TiKuBaseModulesRepo', '~> 0.3.0'
最后 pod install
截圖:私有庫創(chuàng)建
1: 創(chuàng)建兩個(gè)repo 一個(gè)放項(xiàng)目 一個(gè)放spec
'分別初始化git' cd TiKuBaseModulesRepo/SL_Specs_Repo echo "# InitPodFrameWork" >> README.md git init git add README.md git commit -m "first commit" git remote add origin git@github.com:JeeneDo/InitPodFrameWork.git git push -u origin master
2: 關(guān)聯(lián)私有源到遠(yuǎn)端
pod repo add BX_Podspec_Repo https://github.com/JeeneDo/BX_Podspec_Repo.git 此時(shí)如果成功的話進(jìn)入到 ~/.cocoapods/repos 目錄下加袋,就可以看到SL_Spec_Repo這個(gè)目錄了砖第。至此第一步創(chuàng)建私有Spec Repo完成导盅。 這個(gè)是私有庫的 文件夾 集合缠黍,里面放的是你建的各個(gè)私有庫
3: 在TiKuBaseModuleRepo中初始化, 會生成一個(gè)podspec 文件
pod lib create TiKuBasdeModulesRepo pod lib create BaseClassModulesRepo
4: 編輯/校驗(yàn)podspec
pod lib lint --allow-warnings --use-libraries //驗(yàn)證 pod 和 podspec代碼是否編譯通過 --use-libraries // 第三方lib 要加上 // podspec soure:-> http://172.16.117.224/zhangxinxin02/TiKuBaseModulesRepo.git
5: 將配置完代碼倉庫 和 podspec 將代碼同步Git
git add . git commit -m '編輯.podspec and Example and Pod Class' git remote add origin ssh://git@172.16.117.224:39876/zhangxinxin02/TiKuBaseModulesRepo.git git pull origin master --allow-unrelated-histories git push origin master git tag -m "first release" 0.1.0 <tag 一定要和Spec文件一樣,每次改動都要 pod lib lint 進(jìn)行校驗(yàn) 同時(shí)tag加1> git push --tags
6: 把Spec 推送到遠(yuǎn)端的私有源倉庫
pod repo push BX_Podspec_Repo TiKuBaseModulesRepo.podspec --allow-warnings --use-libraries --verbose 執(zhí)行成功后 pod search TiKuBaseModulesRepo 如果發(fā)現(xiàn)搜索不到剛才的組件 rm ~/Library/Caches/CocoaPods/search_index.json '同時(shí)也會推送到 spec 的repo'
以上流程要分清 spec 和 repo. 同時(shí)注意名字不要混
7: 使用
source 'https://github.com/CocoaPods/Specs.git' # 官方庫 source 'https://github.com/JeeneDo/BX_Podspec_Repo.git' # 私有庫 platform :ios, '7.0'
8: 日常更新維護(hù)
1: 代碼更新: 1.1: 修改Sepc 并 pod lib lint --allow-warnings --use-libraries // 確認(rèn) //引入第三私有 pod lib lint --allow-warnings --use-libraries --sources='https://github.com/JeeneDo/BX_Podspec_Repo.git,https://github.com/CocoaPods/Specs.git' //OC Swift 混編去掉--use-libraries 但這樣會引起其他問題 pod lib lint --verbose --allow-warnings --swift-version=4.0 --sources='https://github.com/JeeneDo/BX_Podspec_Repo.git,https://github.com/CocoaPods/Specs.git' //d.同時(shí)依賴了第三方靜態(tài)庫和第三方非靜態(tài)私有庫 pod lib lint XGCommonView.podspec --sources='http://git.ops.com/XGN-IOS/xgn.git,https://github.com/CocoaPods/Specs.git' --use-libraries --allow-warnings --no-clean //依賴了第三方非靜態(tài)私有庫 pod lib lint XGCommonView.podspec --sources='http://git.ops.com/XGN-IOS/xgn.git,https://github.com/CocoaPods/Specs.git' --allow-warnings --no-clean //b.依賴了第三方靜態(tài)庫 pod lib lint XGCommonView.podspec --use-libraries --allow-warnings --no-clean 打開你的xx.podspec文件,將原本的版本號改為0.2.0妻味,與剛剛的tag保持一致正压。 (如果代碼確定沒有問題的話,就不需要pod lib lint责球,直接執(zhí)行第4步) 1.2 git add . git commit -m '更新描述' 2: 代碼庫版本更新 git tag -a '新版本號' -m '注釋' git push --tags 3: 私有庫更新索引庫 pod repo push 索引庫名稱 xxx.podspec --allow-warnings pod repo push BX_Podspec_Repo TiKuBaseModulesRepo.podspec --allow-warnings --use-libraries --verbose pod repo push BX_Podspec_Repo BaseClassModulesRepo.podspec --allow-warnings --use-libraries --verbose 4: 別的電腦可以用pod repo update命令來使用倉庫 (也可以用pod repo update 倉庫名來更新指定倉庫)
-
遇到的問題
-
找不到 libxml2.dylib
-
注意這個(gè)import <libxml/tree.h> 只能在項(xiàng)目中編程蔑匣,直接拖到Pod中編譯會報(bào)錯(cuò)。真坑
-
在 .xcconfig 設(shè)置環(huán)境 雖然編譯通過了棕诵,但是pod lib lint 失敗裁良。
-
原因是.xcconfig 是不會push到遠(yuǎn)端的。解決方法在Podspec 中添加
s.xcconfig = { 'HEADER_SEARCH_PATHS' => "$(SDKROOT)/usr/include/libxml2" }
- Podspec 的配置
# ――― 代碼文件 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # # 代碼文件匹配,**指匹配任意文件夾,*.{h,m}指匹配任意.h和.m文件 s.source_files = "Classes", "Classes/**/*.{h,m}" s.exclude_files = "Classes/Exclude" # SDK需要暴露的.h文件,默認(rèn)暴露所有 # s.public_header_files = "Classes/**/*.h" # ――― 資源路徑 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # #s.source = { :git => 'http://172.16.117.224/zhangxinxin02/TiKuBaseModulesRepo.git', :tag => s.version.to_s } # 指定資源,比如xib,圖片等資源都是 # s.resource_bundles = { 'XXXKit' => ['XXXKit/Classes/**/*.{storyboard,xib,cer,json,plist}','XXXKit/Assets/*.{bundle,xcassets,imageset,png}'] } # s.resource_bundles = { 'LazyTableViewModel' => ['Assets/*.png'] } # ――― 系統(tǒng)庫依賴以及靜態(tài)庫―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # s.framework = "UIKit" # s.frameworks = "UIKit", "AnotherFramework" # s.library = "iconv" # s.libraries = "iconv", "xml2" 校套, 'c++' < 用于.mm 文件> # ――― 其他三方庫依賴 ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # # Pod 引入的 # 比如你的SDK依賴AFNetworking,注意這里和podfile中的語法不同在于,這里無法指定其他依賴的具體路徑 # 比如這種寫法就不支持 s.dependency 'XMPPFramework', :git => "https://github.com/robbiehanson/XMPPFramework.git", :branch => 'master' # s.dependency "AFNetworking", "~> 3.0" # 手動引入的第三方framework # s.vendored_frameworks = 'vendors/IJKMediaFramework.framework' # s.vendored_libraries = 'ProtocolBuffNetWorking/StaticLib/*.a' # swift 要指定版本 s.swift_version = '5.1' s.pod_target_xcconfig = { 'SWIFT_VERSION' => '5.1' } # ――― Xcode配置相關(guān) ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # s.xcconfig = { 'HEADER_SEARCH_PATHS' => "$(SDKROOT)/usr/include/libxml2" } # spec.user_target_xcconfig = { # 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES' } # s.pod_target_xcconfig = { 'ENABLE_BITCODE' => 'NO' }
-
-
-
-
文件結(jié)構(gòu)問題處理
- TiKuBaseModulesRepo/Classes 放實(shí)體文件价脾,在 Example 引用這些文件進(jìn)行編譯(在pod也可以但是Example 可以建幾個(gè)文件夾進(jìn)行分類。便于理解)
- 上面兩種創(chuàng)建方式不同 Target 也不同笛匙。避免踩坑 還是在Pod建立吧
- TiKuBaseModulesRepo/Classes 放實(shí)體文件价脾,在 Example 引用這些文件進(jìn)行編譯(在pod也可以但是Example 可以建幾個(gè)文件夾進(jìn)行分類。便于理解)
-
fatal: 遠(yuǎn)程分支 0.1.8 在上游 origin 未發(fā)現(xiàn)
- 這個(gè)一般就是tag 打錯(cuò)了侨把。重新打一個(gè)就行
不能在項(xiàng)目·中直接改動POD 改動后調(diào)試有異常。無法正確調(diào)試
-
本地私有庫 ** (一般用到打包私有靜態(tài)庫**)
-
podFile 改為
pod 'TiKuBaseModulesRepo', :path => File.expand_path("../..", Dir.pwd)+'/TiKuGit/TiKuBaseModulesRepo' pod 'BaseClassModulesRepo', :path => File.expand_path("../..", Dir.pwd)+'/TiKuGit/BKX_BaseClassModule'
將處理好的文件夾放到和項(xiàng)目同一個(gè)目錄下
基本完成了,這時(shí)引入文件會報(bào)錯(cuò)妹孙。在 Build Setting — Header Search Paths 中將Development Pods下面的文件家拖入即可
-
pod package POPModulesRepo.podspec --force --no-mangle --exclude-deps --spec-sources=https://github.com/JeeneDo/InitPodFrameWork.git,https://github.com/CocoaPods/Specs.git pod package YYKitModulesRepo.podspec --force --no-mangle --exclude-deps --spec-sources=https://github.com/JeeneDo/YYKitModulesRepo.git,https://github.com/CocoaPods/Specs.git '遇到的問題 '打包出來的framework 引入后報(bào)錯(cuò)找不到' 解決: 將framwork 目錄結(jié)構(gòu)和正常的弄成 一樣秋柄。特別是'modules.modulemap 里面的東西 才是主要 這里加入引入的頭文件 '引入問題 'swift - 單個(gè)文件 引入 import YYKitModulesRepo, - '全局'引入在 XXX-Bridging-Header.h 加入#import <AfnAndSDWebRepo/AfnAndSDWebImageHeader.h> OC中 - #import <YYKitModulesRepo/YYModel.h> '最好自己創(chuàng)建一個(gè) 頭文件來引入各個(gè)類', 這樣打成framework后只用在modules.modulemap 添加引入就可以了 'duplicate symbol _OBJC_CLASS_$_PodsDummy_Pods_packager' Fixed by appending --no-mangle --exclude-deps
- 測試步驟
修改引入afn 代碼 查看編譯時(shí)間 記錄下來,并記錄當(dāng)前包大小
將afn 封入自己創(chuàng)建的私有pod庫中蠢正,并進(jìn)行打包成動態(tài)庫
刪除項(xiàng)目中afn代碼骇笔,引入afn-framework。
重復(fù)第一步嚣崭,并比較編譯時(shí)間和包大小
- 測試步驟
-