2016-12-06 111 views
5

我目前正在開發一款可在Android平臺上使用的SDK。Android和iOS:如何在構建SDK時處理依賴關係

對於Android,我們在我們的Gradle文件中列出依賴關係,並使用Maven提供SDK(因此我們的依賴關係在.pom文件中列出)。

對於iOS,我們使用cocoapods來處理dependendies。

的問題如下: *我們的SDK使用版本依賴X *我們的一個客戶可能會使用相同的依賴,但在版本Ÿ *另一個客戶也可以使用在版本的Z

完全相同的依賴

所以,這導致我們的SDK可能正在對我們的客戶的一個壞了(如果不是兩個),因爲我們要確保它與依賴X,而不是Y和Z.

現在,遺留代碼有簡單地導入導致這個問題的庫的源代碼並命名它,這樣它模擬我們不使用相同的庫。

但在我看來,這不是一個適當的解決方案:我們沒有最新修復程序,更新很痛苦,客戶端有兩次庫而不是一次。所以,現在,我試圖想一個潛在的好解決方案,但無法找到我想要的谷歌(也許我不使用正確的關鍵字:/)。

我在想的是爲每個依賴關係提供一系列版本的支持。有點像「如果這個方法在這裏,執行它,否則,使用以前版本的方法」(比如iOS上的選擇器respondTo)。然後,客戶端應該能夠在支持的範圍內使用任何版本的依賴項。

但是,我不知道這是否正確? 還有其他解決方案嗎?

謝謝:)

+0

我不認爲你正在努力實現的是可能的。即使您將「代碼」更改爲獨立於版本的版本,您的庫仍然需要提及其依賴的其他庫。如果你沒有指定一個版本,則會假定最新版本(至少在cocoapods中)。您不能在依賴項下提及同一個庫的多個版本。除非明確創建要同時使用的版本。 – lukya

+0

然而,你可以做什麼,是使**基礎sdk **的多個版本,唯一的區別是「依賴」版本。正如您所說的,您可以更改**基本代碼**以支持您打算爲其創建單獨版本的所有依賴項版本。然後,你的sdk的各個版本之間的唯一區別就是pom/pod文件提到特定版本的依賴關係。您將不得不維護您的客戶端的所有依賴版本組合的矩陣,以選擇您的sdk的正確版本。 – lukya

+0

通過上述方法,客戶端仍然不能按照您的計劃使用您的sdk的單一版本,但可以簡單**選擇**支持客戶端代碼中其他依賴項版本的**版本。由於您的sdk是通過maven/cocoapods添加的,所以sdk的更改版本只是客戶端的依賴配置文件(pom/pod)中的一個數字更改。它不理想,但我認爲它接近。 – lukya

回答

2

對於Android,有兩種可能的解決方案,基於一個構建工具,以及一個建築之一:

1,如果你用Maven構建你的圖書館,你可以使用「提供」範圍強制您的庫從運行它的容器獲取依賴關係。這樣,依賴可以由應用程序使用您的庫提供。請注意,如果依賴關係非常不同,這將無濟於事。

2.-搶救的抽象!您可以將您的項目細分爲主庫和插件庫。主庫將向用戶顯示每個類的一種方法,這將是他們將從他們的應用程序調用的方法。在主庫中,所有類都將以間接形式導入每個外部SDK或依賴項,通用包裝器可以是抽象類或接口,並以這種方式使用它們。例如,也許你正在提供一個增強的Facebook登錄界面。然後,您不必將Facebook SDK直接引用到View中,而是引用一個facebookLoginInterface並調用它。然後,您將擁有一個輔助項目facebookLogin41,您將在其中使用facebook sdk 4.1實現facebookLoginInterface,以及第二個項目facebookLogin418,您可以使用facebook sdk 4.1.8實現相同的界面。然後,實現某種提供邏輯,如依賴注入框架(Roboguice提供者就是一個很好的例子),maven依賴範圍(例如提供)等,以使庫實例成爲facebookLoginInterface。最後,客戶端只導入主庫和輔助項目,並使用主庫。

+0

感謝您的答案,基於插件的方法可能會非常有趣。它應該在我們的Android項目上運行良好,因爲我們主要將網絡庫凌空作爲依賴項。所以我們可以輕鬆地做一個界面,並將其作爲一個插件集成。 我的主要關注點是iOS應用程序:我們有幾個小型庫作爲依賴項(小型設計工具或代碼實用程序)。每個插件一定會被過度使用。也許我們應該將多個插件合併爲一個?你有什麼想法嗎? –

+0

只要你保持依賴性契約(合併插件消耗相同的衝突依賴),你將很好地合併插件。 –

相關問題