避免 iOS 組件依賴沖突的小技巧

問題緣由

本文以 YBImageBrowser 組件舉例杈曲。

YBImageBrowser 依賴了 SDWebImage,在使用 CocoaPods 集成到項目中時,可能會出現(xiàn)一些依賴沖突的問題,最近社區(qū)提了多個 Issues 并且在 Insights -> Traffic -> Popular content 中看到了此類問題很高的關注度,所以不得不著手解決篙螟。

嚴格的版本限制

一個開源組件的迭代過程中,保證上層接口的向下兼容就不錯了问拘。為了優(yōu)化性能并且控制內存遍略,YBImageBrowser 沒有直接用其最上層的接口,而是單獨使用了下載模塊和緩存模塊骤坐,SDWebImage 的迭代升級很容易導致筆者的組件兼容不了绪杏,所以之前一直是類似這樣依賴的:

s.dependency 'SDWebImage', '~> 5.0.0'

這樣做的好處是限制足夠小版本范圍,降低 SDWebImage 接口變動導致組件代碼錯誤的風險纽绍。但如果 SDWebImage 升級到 5.1.0蕾久,不管相關 API 是否變動,CocoaPods 都視為依賴沖突拌夏。

其它組件依賴了不同版本的 SDWebImage

當兩個組件依賴了同一個組件的不同版本僧著,并且依賴的版本沒有交集,比如:

A.dependency 'SDWebImage', '~> 4.0.0'
B.dependency 'SDWebImage', '~> 5.0.0'

那么 A 和 B 同時集成進項目會出現(xiàn)依賴沖突障簿。

解決方案

使用 CocoaPods 集成項目非常便捷盹愚,對于組件使用者來說,總是想在任何場景下都能輕易集成站故,并且能在將來享受組件的更新優(yōu)化皆怕,顯然前面提到的問題可能會影響集成的便捷性。

更模糊的版本限制

很多時候一個大版本的組件不會改動 API世蔗,并且對于社區(qū)流行的組件我們可以寄一定希望于其做好向下兼容端逼,所以放寬依賴的版本限制能覆蓋將來更多的版本(規(guī)則參考:podspec dependency):

s.dependency 'SDWebImage', '>= 5.0.0'

為什么不干脆去掉版本限制呢朗兵?
因為 YBImageBrowser 3.x 是基于 SDWebImage 5.0.0 開發(fā)的污淋,筆者可以明確不兼容 5.0.0 之前的版本,所以在 SDWebImage 將來迭代版本出現(xiàn)相關 API 不兼容之前余掖,這個限制都是“完美”覆蓋所有版本的寸爆。

避免依賴沖突的暴力方案

當有其它組件依賴了不同版本的 SDWebImage礁鲁,粗暴的解決方案如下:

  • 直接修改其它組件依賴的 SDWebImage 版本。
  • 將 YBImageBrowser 手動導入項目赁豆,并且修改代碼去適應當前的 SDWebImage 版本仅醇。
  • 社區(qū)朋友一個 Issue 中提到的方法:在 ~/.cocoapods/repos 目錄下找到 YBImageBrowser 文件夾,更改對應版本的 podspec.json 文件里對 SDWebImage 的依賴版本魔种。

顯然析二,上面的幾種方案不太優(yōu)雅,手動導入項目難以享受組件的更新優(yōu)化节预,修改本地 repo 信息會因為 repo 列表的更新而復位叶摄。

避免依賴沖突的優(yōu)雅方案

出現(xiàn)依賴沖突是必須要解決的問題,其它組件依賴的版本限制可以視為不變量安拟,解決方案可以從組件的制作方面考慮蛤吓。

要做到的目標是,既滿足部分用戶快速集成組件糠赦,又能讓部分用戶解決依賴沖突的前提下保證能享受組件將來的更新優(yōu)化会傲。

答案就是subspec,以下是 YBImageBrowser.podspec 部分代碼(完整代碼):

  s.subspec "Core" do |core|
    core.source_files   = "YBImageBrowser/**/*.{h,m}"
    core.dependency 'SDWebImage', '>= 5.0.0'
  end
  s.subspec "NOSD" do |core|
    core.source_files   = "YBImageBrowser/**/*.{h,m}"
    core.exclude_files  = "YBImageBrowser/WebImageMediator/YBIBDefaultWebImageMediator.{h,m}"
  end

由此拙泽,用戶可以自由的選擇是否需要依賴 SDWebImage淌山,在 Podfile 里的觀感大致是這樣:

// 依賴 SDWebImage
pod 'YBImageBrowser'  
// 不依賴 SDWebImage
pod 'YBImageBrowser/NOSD'

那么在 YBImageBrowser 代碼中應該如何區(qū)分是否依賴了 SDWebImage 并且提供默認實現(xiàn)呢?

第一步是設計一個抽象接口(這個接口不依賴 SDWebImage):

@protocol YBIBWebImageMediator <NSObject>
// Download methode, caching methode, and so on.
@end

第二步是在YBImageBrowser.h中定義一個遵循該接口的屬性:

/// 圖片下載緩存相關的中介者(賦值可自定義)
@property (nonatomic, strong) id<YBIBWebImageMediator> webImageMediator;

第三步是實現(xiàn)一個默認的中介者(這個類依賴了 SDWebImage):

@interface YBIBDefaultWebImageMediator : NSObject <YBIBWebImageMediator>
@end
@implementation YBIBDefaultWebImageMediator
//通過 SDWebImage 的 API 實現(xiàn) <YBIBWebImageMediator> 協(xié)議方法
@end

第四步是在內部代碼中通過條件編譯導入并初始化默認中介者:

#if __has_include("YBIBDefaultWebImageMediator.h")
#import "YBIBDefaultWebImageMediator.h"
#endif
...
#if __has_include("YBIBDefaultWebImageMediator.h")
    _webImageMediator = [YBIBDefaultWebImageMediator new];
#endif

第五步在 YBImageBrowser.podspec 中也可以看到顾瞻,在不依賴 SDWebImage 的集成方式時排除了兩個文件:YBIBDefaultWebImageMediator.{h.m}艾岂。

由此便實現(xiàn)了目標:

  • 用依賴 SDWebImage 的集成方式快速集成。
  • 使用不依賴 SDWebImage 的集成方式避免各種情況下的依賴沖突朋其,但注意這種情況需要自行實現(xiàn)一個遵循<YBIBWebImageMediator>協(xié)議的中介者王浴。

以上便是避免依賴沖突的小技巧,希望讀者朋友能提出更好的建議或意見??梅猿。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末氓辣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子袱蚓,更是在濱河造成了極大的恐慌钞啸,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喇潘,死亡現(xiàn)場離奇詭異体斩,居然都是意外死亡,警方通過查閱死者的電腦和手機颖低,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門絮吵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忱屑,你說我怎么就攤上這事蹬敲∠景海” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵伴嗡,是天一觀的道長急波。 經(jīng)常有香客問我,道長瘪校,這世上最難降的妖魔是什么澄暮? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮阱扬,結果婚禮上赏寇,老公的妹妹穿的比我還像新娘。我一直安慰自己价认,他們只是感情好嗅定,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著用踩,像睡著了一般渠退。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脐彩,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天碎乃,我揣著相機與錄音,去河邊找鬼惠奸。 笑死梅誓,一個胖子當著我的面吹牛,可吹牛的內容都是我干的佛南。 我是一名探鬼主播梗掰,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嗅回!你這毒婦竟也來了及穗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绵载,失蹤者是張志新(化名)和其女友劉穎埂陆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娃豹,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡焚虱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了懂版。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹃栽。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖定续,靈堂內的尸體忽然破棺而出谍咆,到底是詐尸還是另有隱情,我是刑警寧澤私股,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布摹察,位于F島的核電站,受9級特大地震影響倡鲸,放射性物質發(fā)生泄漏供嚎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一峭状、第九天 我趴在偏房一處隱蔽的房頂上張望克滴。 院中可真熱鬧,春花似錦优床、人聲如沸劝赔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽着帽。三九已至,卻和暖如春移层,著一層夾襖步出監(jiān)牢的瞬間仍翰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工观话, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留予借,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓频蛔,卻偏偏與公主長得像灵迫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晦溪,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容