要解除循環(huán)依賴,引入包管理技術(shù)cocoapods會(huì)讓我們更有效率。pod不允許組件間有循環(huán)依賴,若有pod install時(shí)就會(huì)報(bào)錯(cuò)。
cocoapods,提供私有pod repo,使用時(shí)把自己的組件放在私有pod repo里,然后在Podfile里直接通過(guò)pod命令集成。一個(gè)組件對(duì)應(yīng)一個(gè)私有pod,每個(gè)組件依賴自己所需要的三方庫(kù)。多個(gè)組件聯(lián)合開(kāi)發(fā)的時(shí)候,可以再一個(gè)podspec里配置子模塊,這樣在每個(gè)組件自己的podspec里,只需要把子模塊里的pod依賴關(guān)系拷貝過(guò)去就行了。
pod repo update命令。
有個(gè)場(chǎng)景,幾個(gè)人共同維護(hù)一個(gè)項(xiàng)目,Podfile也是共同維護(hù)一份。有一天其中一個(gè)人,升級(jí)了Podfile中某個(gè)庫(kù)的版本,比如AFNetworking從3.0.4升級(jí)到了3.1.0, pod 'AFNetworking', '~> 3.1.0’。然后,你更新了最新的Podfile,跑了一下pod install。。。。。。
1、先從pod install拋出的異常開(kāi)始,如下圖:
**1.Github **
創(chuàng)建自己的Repository,我創(chuàng)建了SDKLib,然后從本地上傳到github上, 這些步驟就不在這里贅述了,經(jīng)常跑github的同學(xué)應(yīng)該都會(huì)。
**2 基于pod命令創(chuàng)建SDK **
具體的pod命令如下:
pod lib create SDKLib
調(diào)用以后terminal中會(huì)需要填寫以下問(wèn)題,一般選擇創(chuàng)建Demo,其他選項(xiàng)根據(jù)需求填寫:
What languagedoyou want to use??[ Swift / ObjC ]
ObjC
Would you like toincludea demo application with your library? [ Yes / No ]
YES
Which testing frameworks will you use? [ Specta / Kiwi / None ]
None
Would you like todoview based testing? [ Yes / No ]
Yes
What is yourclassprefix?
SDK
第二種:(使用xcode手動(dòng)創(chuàng)建靜態(tài)庫(kù),網(wǎng)上比較多的版本,需要做一些配置,這里個(gè)人覺(jué)得太不方便,如果喜歡xcode自己創(chuàng)建的可以參考這篇http://www.lxweimin.com/p/e588bb0411d8)費(fèi)力不討好的工程
3.建tag
打開(kāi)終端,cd 到項(xiàng)目SDKLib目錄下,
git tag '1.0.0'//這個(gè)命令是本地創(chuàng)建tag,1.0.0版本
git push --tags // 這個(gè)命令是把tag推送到遠(yuǎn)端。
4.創(chuàng)建項(xiàng)目的podspec文件
現(xiàn)在終端還是在項(xiàng)目QShare的目錄下,執(zhí)行以下命令
$ pod spec createSDKLib
在本地目錄下同時(shí)也生成了SDKLib.podspec文件
打開(kāi)項(xiàng)目可以開(kāi)到工程里都給你配置好了 畫的地方就是你開(kāi)發(fā)自己靜態(tài)庫(kù)文件編碼的地方(怎么打包成靜態(tài)庫(kù),請(qǐng)往下看)這里因?yàn)樘厥庠颍恍┪募荒苷归_(kāi)
$ vim SDKLib.podspec
編輯podspec文件,會(huì)發(fā)現(xiàn)這個(gè)文件已經(jīng)生成了部分的字段
以下是編輯好的podspec 文件 做一些解釋
Pod::Spec.new do |s|
s.name = 'SDKLib'
s.version = '0.4.9'
s.summary = 'A short description of SDKLib.'
s.platform = :ios
s.homepage = 'https://github.com/wangxiaokui'#
s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2's.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'xiaokui' => 'm18736056517@163.com' }
s.source = { :git => 'https://github.com/xiaokui/SDKLib.git', :tag => s.version}
s.source = { :git => '/Users/fan/SDKLib' } #加載本地自己的庫(kù)的引用
s.social_media_url = 'https://twitter.com/'
s.ios.deployment_target = '8.0'
s.source_files = 'SDKLib/Classes/*/'
s.resource_bundles = {
'SDKLib' => ['SDKLib/Assets/*.png']
}
s.public_header_files = 'Pod/Classes/*/.h'
s.frameworks = 'SystemConfiguration','MobileCoreServices','CoreGraphics','UIKit','AVFoundation','Photos','AdSupport','GLKit','MediaPlayer','MessageUI','CoreMotion','CoreTelephony'
s.dependency 'MBProgressHUD'
s.dependency 'MJExtension'
s.dependency 'SDWebImage'
s.dependency 'Masonry'
s.dependency 'MJRefresh'
s.dependency 'SVProgressHUD'
s.dependency 'Google-Mobile-Ads-SDK'
end
podspec中重要的幾個(gè)內(nèi)容解釋如下:
s.source中是表示使用pod package打包時(shí)候pod去尋找的打包的路徑,podspec默認(rèn)使用git commit tag作為路徑,也可以修改成本地路徑/Users/pp/Desktop/MyCustomLib,如果當(dāng)前沒(méi)有設(shè)置:tag,打包時(shí)候默認(rèn)使用當(dāng)前git commit的head節(jié)點(diǎn)(如果部分修改內(nèi)容沒(méi)有commit,那么使用git package不會(huì)將未commit的內(nèi)容進(jìn)行打包).
s.source_files表示具體的源碼的路徑,這里注意源碼一般放到Classes文件夾目錄下,而且實(shí)體文件中不要有非源碼內(nèi)容放到Classes文件夾.Classes文件夾的所有內(nèi)容都要Add Targets To: MyCustomLib.不要Classes文件夾或子文件夾中部分內(nèi)容被remove referrence.
s.resource_bundles中的資源.系統(tǒng)會(huì)自動(dòng)將MyCustomLib/Assets文件夾下的內(nèi)容,cocoapod會(huì)將我們把Assets中的內(nèi)容自動(dòng)打包成MyCustomLib.bundle.這里也可以使用簡(jiǎn)單的方式
1 在Assets文件夾中放入我們自己寫好的MyCustomLib.bundle,bundle中是我們使用的資源.
2 使用s.resource = 'MyCustomLib/Assets/*'.最后會(huì)將這些資源打入framework中.
3 在Example中手動(dòng)引用我們自己創(chuàng)建的*.bundle資源文件.
s.public_header_files用來(lái)指定需要對(duì)外部暴露的頭文件的位置
s.frameworks和s.libraries,表示當(dāng)前sdk依賴的系統(tǒng)的framework和類庫(kù)
s.dependency表示當(dāng)前podspec類庫(kù)對(duì)外部第三方庫(kù)的依賴.如果使用pod package打包sdk時(shí)候,這里的dependency會(huì)被自動(dòng)添加前綴,防止重復(fù)引用沖突.而且這里的依賴只能是pod庫(kù)(公有或者私有)的內(nèi)容.
s.subspec用來(lái)引入我們sdk依賴的自己的framework或者.a等靜態(tài)庫(kù)
特別注意在.podspec 操作了s.dependency依賴了一些庫(kù)了后,就不需要再同一工程里使用podfile文件再次pod這些庫(kù)了,它們會(huì)沖突,同時(shí)需要理解.podspec 里一些配置的意思相信會(huì)解決你不少問(wèn)題
編輯好podspec文件后,需要驗(yàn)證一下這個(gè)文件是否能通過(guò)編譯。
$ pod spec lint SDKLib.podspec --verbose
然而并沒(méi)有通過(guò)
- ERROR | [iOS] Encountered an unknown error (The'Pods'target has transitive dependencies that include static binaries:
找了一些相關(guān)的,這個(gè)錯(cuò)誤是因?yàn)橐蕾噹?kù)(s.dependency)包含了.a靜態(tài)庫(kù)造成的。雖然這并不影響Pod的使用,但是驗(yàn)證是無(wú)法通過(guò)的。可以通過(guò) --use-libraries 來(lái)讓驗(yàn)證通過(guò)。使用以下的命令:
$ pod spec lint QShare.podspec --verbose --use-libraries
這種情況下使用 --use-libraries 雖然不會(huì)出現(xiàn)錯(cuò)誤(error),但是有時(shí)候會(huì)帶來(lái)一些警告(waring),警告同樣是無(wú)法通過(guò)驗(yàn)證的。這時(shí)可以用 --allow-warnings 來(lái)允許警告。
$ pod spec lint QShare.podspec --verbose --use-libraries --allow-warnings
這里針對(duì)自己的項(xiàng)目情況判斷添加那些命令通過(guò)了。
5、提交到pod (使用git命令,打上tag再次提交,版本號(hào)每次需要更新哦)這里不多說(shuō)了
發(fā)布時(shí)也會(huì)驗(yàn)證 Pod 的有效性,如果你在手動(dòng)驗(yàn)證 Pod 時(shí)使用了 --use-libraries 或 --allow-warnings 等修飾符,那么發(fā)布的時(shí)候也應(yīng)該使用相同的字段修飾,否則出現(xiàn)相同的報(bào)錯(cuò)。
發(fā)布成功后,
終于可以使用 pod search 搜索到自己的 Pod 了。
?fanpod search SDKLib
-> SDKLib (1.0.0)
Gather Some Auth Share Pay.
pod 'SDKLib', '~> 1.0.0'
Homepage: https://github.com/xiaokui/SDKLib
Versions: 1.0.0 [master repo]
6、版本升級(jí)
當(dāng)需要更新 Pod 版本的時(shí)候,修改 .podspec 中的 s.version 為更高的版本號(hào),并修改 s.source 中對(duì)應(yīng)的 Git 版本。提交到Git,并打上對(duì)應(yīng)tag。然后再次執(zhí)行pod trunk push SDKLib.podspec將新的 .podspec 發(fā)布到 CocoaPods。更新完成!
為了更方便的修改版本號(hào),用了以下的語(yǔ)句:
s.source = { :git => "https://github.com/xiaokui/SDKLib.git", :tag => "v#{s.version}" }
這樣與 s.version進(jìn)行了綁定,每次提交新的版本只需要修改s.version = "xxxx"。
7:將源碼打包成靜態(tài)庫(kù).a或者.framework
需要安裝cocoapods-packager.(安裝命令:sudo gem install cocoapods-packager)
然后執(zhí)行pod package SDKLib.podspec --force --verbose.通過(guò)這個(gè)命令打包時(shí)候會(huì)自動(dòng)將podspec中dependency的第三方庫(kù)進(jìn)行重命名.這樣打出來(lái)的是SDKLib.framework.
(打release 的包默認(rèn)打包成framework,如果在后面加上參數(shù)“--library”則打包成.a文件,--force是指強(qiáng)制覆蓋)前面資源文件都在SDKLib.framework/Reources/SDKLib.bundle里面可以手動(dòng)把這個(gè)bundle拖出去.
前面提到過(guò)使用pod package打包時(shí)候需要注意.pod會(huì)根據(jù)當(dāng)前podspec中的s.source的地址去查找當(dāng)前sdk源文件的地址.如果使用的s.source = { :git => 'https://github.com/xiaokui/SDKLib.git', :tag => s.version.to_s },那么就會(huì)去git中拉取最后一個(gè)tag對(duì)應(yīng)commit的源碼.如果使用的s.source = { :git => '/Users/fan/Desktop/SDKLib'},那么會(huì)使用當(dāng)前sdk中g(shù)it 的HEAD位置的commit的源碼進(jìn)行打包編譯.(如果源碼有修改,一定要先git commit,然后再打包)
** 注意問(wèn)題**
1、 重點(diǎn)問(wèn)題一: Example中依賴某些類庫(kù)
舉例說(shuō)明,如果SDKLib.podspec中依賴s.dependency 'AFNetworking', '~> 2.3',此時(shí)在Example中也需要使用AFNetworking,那么這里千萬(wàn)不要在Example中引入AFNetworking的源碼,請(qǐng)?jiān)趐odfile中添加pod AFNetworking.
2、 重點(diǎn)問(wèn)題二: SDK中依賴的第三方庫(kù)無(wú)法使用BITCODE
在Example的podfile底部添加以下語(yǔ)句:
// post_install do |installer|
// installer.pods_project.targets.each do |target|
// target.build_configurations.each do |config|
// config.build_settings['ENABLE_BITCODE'] = 'NO'
// end
// end
3 、重點(diǎn)問(wèn)題三: SDK中調(diào)用資源的問(wèn)題
對(duì)于podfile,常見(jiàn)的庫(kù)的地址引用寫法如下:
pod'庫(kù)名', :podspec =>'podspec文件路徑'#指定導(dǎo)入庫(kù)的podspec文件路徑pod'庫(kù)名', :git =>'源碼git地址'#指定導(dǎo)入庫(kù)的源碼git地址pod'庫(kù)名', :tag =>'tag名'#指定導(dǎo)入庫(kù)的Tag分支pod'庫(kù)名', :path =>'~/Documents/AFNetworking'#指定本地的某個(gè)庫(kù),文件夾中要有podspec文件
用AFNetworking舉例:
// 使用倉(cāng)庫(kù)中的master分支:pod'AFNetworking', :git=>'https://github.com/gowalla/AFNetworking.git'//使用倉(cāng)庫(kù)的其他分支:pod'AFNetworking', :git=>'https://github.com/gowalla/AFNetworking.git', :branch=>'dev'//使用倉(cāng)庫(kù)的某個(gè)tag:pod'AFNetworking', :git=>'https://github.com/gowalla/AFNetworking.git', :tag=>'0.7.0'//指定一個(gè)提交記錄:pod'AFNetworking', :git=>'https://github.com/gowalla/AFNetworking.git', :commit=>'082f8319af'//指定本地路徑的最近一次提交commitpod'庫(kù)名', :path=>'~/Documents/AFNetworking'
打包成功后會(huì)在SDKLib.podspec文件路徑下面生成一個(gè)打包文件,在iOS文件夾里面會(huì)看到生成的靜態(tài)庫(kù)包
8:可以驗(yàn)證自己的pod地址了(這樣pod下來(lái)的是靜態(tài)庫(kù)源碼,你會(huì)發(fā)現(xiàn)自己開(kāi)發(fā)的靜態(tài)庫(kù)文件,到pod文件下面了,具體需要你自己驗(yàn)證一篇)
** 再次創(chuàng)建一個(gè)項(xiàng)目,在配置podfile文件在里面添加自己的git地址,pod install 試試 ,一路有坑,根據(jù)特定的情況解決問(wèn)題 **
特別注意:
** 7和8是不一樣,7是打包看不到源碼,8是在git上pod的下來(lái)的源碼,如果想在git上pod下來(lái)是打包好的靜態(tài)庫(kù)不是開(kāi)源的源碼,可以把靜態(tài)庫(kù)配置好..podspec上傳上git,你需要在git上重新建一個(gè)倉(cāng)庫(kù)。**
為了解決這個(gè)異常可能嘗試一下:
(1)是不是Podfile和Podfile.lock 文件不同步?刪掉.lock文件再pod install一次,仍然報(bào)錯(cuò)。
(2)是不是AFNetworking沒(méi)有3.1.0版本?pod search afnetworking一下,版本存在。
如果被我猜中了,證明你把焦點(diǎn)放在了異常前三行,而忽略了最關(guān)鍵的信息:None of your spec sources contain a spec satisfying the dependencies: AFNetworking (~> 3.1.0), AFNetworking (= 3.1.0)。
這句話的意思是說(shuō):你spec資源中不包含AFNetworking的3.1.0的配置信息。這里面有個(gè)關(guān)鍵詞,spec資源和配置信息。
然后最下面提醒pod repo update’ does not happen on ‘pod install’ by default。意思是默認(rèn)情況下,執(zhí)行pod install不會(huì)自動(dòng)執(zhí)行pod repo update命令。那么pod repo update做了什么?
2、pod repo update
簡(jiǎn)單來(lái)說(shuō),pod repo update命名是用來(lái)更新本地cocoapods的spec資源配置信息。
安裝完cocoapods后,在用戶根目錄下有個(gè)隱藏文件夾,/Users//.cocoapods,里面是cocoapods收錄的所有庫(kù)的配置信息,/Users//.cocoapods/repos/master/Specs/。比如AFNetworking就是/Users//.cocoapods/repos/master/Specs/AFNetworking,內(nèi)部分版本包含多個(gè)文件夾,每個(gè)文件夾內(nèi)包含一個(gè)配置文件,比如AFNetworking.podspec.json。
上面報(bào)錯(cuò)的原因就是,Podfile中AFNetworking的版本更新到了3.1.0,但是本地.cocoapods下找不到相應(yīng)的配置文件。
然后按照提示,執(zhí)行pod repo update,碰到網(wǎng)速慢的時(shí)候,命令執(zhí)行完了就不動(dòng)了,又被迫擺出葛優(yōu)躺等著。
重點(diǎn)來(lái)了,pod repo update實(shí)際是更新整個(gè).cocoapods下的所有庫(kù),其實(shí)我們可以只更新其中某個(gè)庫(kù)來(lái)達(dá)到快速可用的目的。下面提供兩個(gè)方法解決:
(1)正規(guī)方法:
指定更新單獨(dú)庫(kù)pod repo update /Users//.cocoapods/repos/master/Specs/
(2)野路子:
如果方法1仍然無(wú)法解決問(wèn)題,而又著急使用。可以直接到相應(yīng)目錄下手動(dòng)增加缺少的版本目錄和spec文件,/Users//.cocoapods/repos/master/Specs//3.2.0/.spec。spec文件參考git上相應(yīng)庫(kù)的版本。
podspec
**1.Github **
創(chuàng)建自己的Repository,我創(chuàng)建了SDKLib,然后從本地上傳到github上, 這些步驟上面有,不過(guò)經(jīng)常跑github的同學(xué)應(yīng)該都會(huì)。
**2 基于pod命令創(chuàng)建SDK **
具體的pod命令如下:
pod lib create SDKLib
調(diào)用以后terminal中會(huì)需要填寫以下問(wèn)題,一般選擇創(chuàng)建Demo,其他選項(xiàng)根據(jù)需求填寫:
What languagedoyou want to use??[ Swift / ObjC ]
ObjC
Would you like toincludea demo application with your library? [ Yes / No ]
YES
Which testing frameworks will you use? [ Specta / Kiwi / None ]
None
Would you like todoview based testing? [ Yes / No ]
Yes
What is yourclassprefix?
SDK
第二種:(使用xcode手動(dòng)創(chuàng)建靜態(tài)庫(kù),網(wǎng)上比較多的版本,需要做一些配置,這里個(gè)人覺(jué)得太不方便,如果喜歡xcode自己創(chuàng)建的可以參考這篇http://www.lxweimin.com/p/e588bb0411d8)費(fèi)力不討好的工程
3.建tag
打開(kāi)終端,cd 到項(xiàng)目SDKLib目錄下,
git tag '1.0.0'//這個(gè)命令是本地創(chuàng)建tag,1.0.0版本
git push --tags // 這個(gè)命令是把tag推送到遠(yuǎn)端。
4.創(chuàng)建項(xiàng)目的podspec文件
現(xiàn)在終端還是在項(xiàng)目QShare的目錄下,執(zhí)行以下命令
$ pod spec createSDKLib
在本地目錄下同時(shí)也生成了SDKLib.podspec文件
$ vim SDKLib.podspec
編輯podspec文件,會(huì)發(fā)現(xiàn)這個(gè)文件已經(jīng)生成了部分的字段
以下是編輯好的podspec 文件 做一些解釋
Pod::Spec.new do |s|
s.name = 'SDKLib'
s.version = '0.4.9'
s.summary = 'A short description of SDKLib.'
s.platform = :ios
s.homepage = 'https://github.com/wangxiaokui'#
s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2's.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'xiaokui' => 'm18736056517@163.com' }
s.source = { :git => 'https://github.com/xiaokui/SDKLib.git', :tag => s.version}
s.source = { :git => '/Users/fan/SDKLib' } #加載本地自己的庫(kù)的引用
s.social_media_url = 'https://twitter.com/'
s.ios.deployment_target = '8.0'
s.source_files = 'SDKLib/Classes/*/'
s.resource_bundles = {
'SDKLib' => ['SDKLib/Assets/*.png']
}
s.public_header_files = 'Pod/Classes/*/.h'
s.frameworks = 'SystemConfiguration','MobileCoreServices','CoreGraphics','UIKit','AVFoundation','Photos','AdSupport','GLKit','MediaPlayer','MessageUI','CoreMotion','CoreTelephony'
s.dependency 'MBProgressHUD'
s.dependency 'MJExtension'
s.dependency 'SDWebImage'
s.dependency 'Masonry'
s.dependency 'MJRefresh'
s.dependency 'SVProgressHUD'
s.dependency 'Google-Mobile-Ads-SDK'
end
podspec中重要的幾個(gè)內(nèi)容解釋如下:
s.source中是表示使用pod package打包時(shí)候pod去尋找的打包的路徑,podspec默認(rèn)使用git commit tag作為路徑,也可以修改成本地路徑/Users/pp/Desktop/MyCustomLib,如果當(dāng)前沒(méi)有設(shè)置:tag,打包時(shí)候默認(rèn)使用當(dāng)前git commit的head節(jié)點(diǎn)(如果部分修改內(nèi)容沒(méi)有commit,那么使用git package不會(huì)將未commit的內(nèi)容進(jìn)行打包).
s.source_files表示具體的源碼的路徑,這里注意源碼一般放到Classes文件夾目錄下,而且實(shí)體文件中不要有非源碼內(nèi)容放到Classes文件夾.Classes文件夾的所有內(nèi)容都要Add Targets To: MyCustomLib.不要Classes文件夾或子文件夾中部分內(nèi)容被remove referrence.
s.resource_bundles中的資源.系統(tǒng)會(huì)自動(dòng)將MyCustomLib/Assets文件夾下的內(nèi)容,cocoapod會(huì)將我們把Assets中的內(nèi)容自動(dòng)打包成MyCustomLib.bundle.這里也可以使用簡(jiǎn)單的方式
1 在Assets文件夾中放入我們自己寫好的MyCustomLib.bundle,bundle中是我們使用的資源.
2 使用s.resource = 'MyCustomLib/Assets/*'.最后會(huì)將這些資源打入framework中.
3 在Example中手動(dòng)引用我們自己創(chuàng)建的*.bundle資源文件.
s.public_header_files用來(lái)指定需要對(duì)外部暴露的頭文件的位置
s.frameworks和s.libraries,表示當(dāng)前sdk依賴的系統(tǒng)的framework和類庫(kù)
s.dependency表示當(dāng)前podspec類庫(kù)對(duì)外部第三方庫(kù)的依賴.如果使用pod package打包sdk時(shí)候,這里的dependency會(huì)被自動(dòng)添加前綴,防止重復(fù)引用沖突.而且這里的依賴只能是pod庫(kù)(公有或者私有)的內(nèi)容.
s.subspec用來(lái)引入我們sdk依賴的自己的framework或者.a等靜態(tài)庫(kù)
特別注意在.podspec 操作了s.dependency依賴了一些庫(kù)了后,就不需要再同一工程里使用podfile文件再次pod這些庫(kù)了,它們會(huì)沖突,同時(shí)需要理解.podspec 里一些配置的意思相信會(huì)解決你不少問(wèn)題
編輯好podspec文件后,需要驗(yàn)證一下這個(gè)文件是否能通過(guò)編譯。
$ pod spec lint SDKLib.podspec --verbose
然而并沒(méi)有通過(guò)
- ERROR | [iOS] Encountered an unknown error (The'Pods'target has transitive dependencies that include static binaries:
找了一些相關(guān)的,這個(gè)錯(cuò)誤是因?yàn)橐蕾噹?kù)(s.dependency)包含了.a靜態(tài)庫(kù)造成的。雖然這并不影響Pod的使用,但是驗(yàn)證是無(wú)法通過(guò)的。可以通過(guò) --use-libraries 來(lái)讓驗(yàn)證通過(guò)。使用以下的命令:
$ pod spec lint QShare.podspec --verbose --use-libraries
這種情況下使用 --use-libraries 雖然不會(huì)出現(xiàn)錯(cuò)誤(error),但是有時(shí)候會(huì)帶來(lái)一些警告(waring),警告同樣是無(wú)法通過(guò)驗(yàn)證的。這時(shí)可以用 --allow-warnings 來(lái)允許警告。
$ pod spec lint QShare.podspec --verbose --use-libraries --allow-warnings
這里針對(duì)自己的項(xiàng)目情況判斷添加那些命令通過(guò)了。
5、提交到pod (使用git命令,打上tag再次提交,版本號(hào)每次需要更新哦)這里不多說(shuō)了
發(fā)布時(shí)也會(huì)驗(yàn)證 Pod 的有效性,如果你在手動(dòng)驗(yàn)證 Pod 時(shí)使用了 --use-libraries 或 --allow-warnings 等修飾符,那么發(fā)布的時(shí)候也應(yīng)該使用相同的字段修飾,否則出現(xiàn)相同的報(bào)錯(cuò)。
發(fā)布成功后,
終于可以使用 pod search 搜索到自己的 Pod 了。
?fanpod search SDKLib
-> SDKLib (1.0.0)
Gather Some Auth Share Pay.
pod 'SDKLib', '~> 1.0.0'
Homepage: https://github.com/xiaokui/SDKLib
Versions: 1.0.0 [master repo]
6、版本升級(jí)
當(dāng)需要更新 Pod 版本的時(shí)候,修改 .podspec 中的 s.version 為更高的版本號(hào),并修改 s.source 中對(duì)應(yīng)的 Git 版本。提交到Git,并打上對(duì)應(yīng)tag。然后再次執(zhí)行pod trunk push SDKLib.podspec將新的 .podspec 發(fā)布到 CocoaPods。更新完成!
為了更方便的修改版本號(hào),用了以下的語(yǔ)句:
s.source = { :git => "https://github.com/xiaokui/SDKLib.git", :tag => "v#{s.version}" }
這樣與 s.version進(jìn)行了綁定,每次提交新的版本只需要修改s.version = "xxxx"。
7:將源碼打包成靜態(tài)庫(kù).a或者.framework
需要安裝cocoapods-packager.(安裝命令:sudo gem install cocoapods-packager)
然后執(zhí)行pod package SDKLib.podspec --force --verbose.通過(guò)這個(gè)命令打包時(shí)候會(huì)自動(dòng)將podspec中dependency的第三方庫(kù)進(jìn)行重命名.這樣打出來(lái)的是SDKLib.framework.
(打release 的包默認(rèn)打包成framework,如果在后面加上參數(shù)“--library”則打包成.a文件,--force是指強(qiáng)制覆蓋)前面資源文件都在SDKLib.framework/Reources/SDKLib.bundle里面可以手動(dòng)把這個(gè)bundle拖出去.
前面提到過(guò)使用pod package打包時(shí)候需要注意.pod會(huì)根據(jù)當(dāng)前podspec中的s.source的地址去查找當(dāng)前sdk源文件的地址.如果使用的s.source = { :git => 'https://github.com/xiaokui/SDKLib.git', :tag => s.version.to_s },那么就會(huì)去git中拉取最后一個(gè)tag對(duì)應(yīng)commit的源碼.如果使用的s.source = { :git => '/Users/fan/Desktop/SDKLib'},那么會(huì)使用當(dāng)前sdk中g(shù)it 的HEAD位置的commit的源碼進(jìn)行打包編譯.(如果源碼有修改,一定要先git commit,然后再打包)
** 注意問(wèn)題**
1、 重點(diǎn)問(wèn)題一: Example中依賴某些類庫(kù)
舉例說(shuō)明,如果SDKLib.podspec中依賴s.dependency 'AFNetworking', '~> 2.3',此時(shí)在Example中也需要使用AFNetworking,那么這里千萬(wàn)不要在Example中引入AFNetworking的源碼,請(qǐng)?jiān)趐odfile中添加pod AFNetworking.
2、 重點(diǎn)問(wèn)題二: SDK中依賴的第三方庫(kù)無(wú)法使用BITCODE
在Example的podfile底部添加以下語(yǔ)句:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ENABLE_BITCODE'] = 'NO'
end
end
3 、重點(diǎn)問(wèn)題三: SDK中調(diào)用資源的問(wèn)題
對(duì)于podfile,常見(jiàn)的庫(kù)的地址引用寫法如下:
pod'庫(kù)名', :podspec =>'podspec文件路徑'#指定導(dǎo)入庫(kù)的podspec文件路徑pod'庫(kù)名', :git =>'源碼git地址'#指定導(dǎo)入庫(kù)的源碼git地址pod'庫(kù)名', :tag =>'tag名'#指定導(dǎo)入庫(kù)的Tag分支pod'庫(kù)名', :path =>'~/Documents/AFNetworking'#指定本地的某個(gè)庫(kù),文件夾中要有podspec文件
用AFNetworking舉例:
// 使用倉(cāng)庫(kù)中的master分支:pod'AFNetworking', :git=>'https://github.com/gowalla/AFNetworking.git'//使用倉(cāng)庫(kù)的其他分支:pod'AFNetworking', :git=>'https://github.com/gowalla/AFNetworking.git', :branch=>'dev'//使用倉(cāng)庫(kù)的某個(gè)tag:pod'AFNetworking', :git=>'https://github.com/gowalla/AFNetworking.git', :tag=>'0.7.0'//指定一個(gè)提交記錄:pod'AFNetworking', :git=>'https://github.com/gowalla/AFNetworking.git', :commit=>'082f8319af'//指定本地路徑的最近一次提交commitpod'庫(kù)名', :path=>'~/Documents/AFNetworking'
打包成功后會(huì)在SDKLib.podspec文件路徑下面生成一個(gè)打包文件,在iOS文件夾里面會(huì)看到生成的靜態(tài)庫(kù)包
8:可以驗(yàn)證自己的pod地址了(這樣pod下來(lái)的是靜態(tài)庫(kù)源碼,你會(huì)發(fā)現(xiàn)自己開(kāi)發(fā)的靜態(tài)庫(kù)文件,到pod文件下面了,具體需要你自己驗(yàn)證一篇)
** 再次創(chuàng)建一個(gè)項(xiàng)目,在配置podfile文件在里面添加自己的git地址,pod install 試試 ,一路有坑,根據(jù)特定的情況解決問(wèn)題 **
特別注意:
** 7和8是不一樣,7是打包看不到源碼,8是在git上pod的下來(lái)的源碼,如果想在git上pod下來(lái)是打包好的靜態(tài)庫(kù)不是開(kāi)源的源碼,可以把靜態(tài)庫(kù)配置好..podspec上傳上git,你需要在git上重新建一個(gè)倉(cāng)庫(kù)。**