Library Publication 時遇到 "more than one library with package name" 錯誤的解決方法

Library Publication 是 Gradle 在0.9.0 時增長的一個新特性,它的做用是讓Lib也能發佈不一樣的版本
在這以前,Lib只能發佈release版本,你的項目中依賴的全部Lib也都只能是relaese版本的。這種作法看起來很合理,被依賴的庫固然應該是release的,debug狀態下怎麼給其餘項目提供依賴呀?但在實際多模塊項目中,被依賴的庫只是項目中普普統統的一部分,庫和項目同時被開發被調試,debug狀態的Lib也是很是正常的,因而很早就有人給Google提了一個issue: https://code.google.com/p/android/issues/detail?id=52962 ,Google工程師便在gradle的0.9.0版本中增長了Library Publication特性來處理這個問題,不過好像直到1.0才徹底處理好
 
(轉載請註明:博客園-閣剛廣志,地址:http://www.cnblogs.com/bellkosmos/p/6437171.html )
 
對我來講,我寫的不少工具包都會打印Log,而工具包天然會放在通用的模塊裏,因此我固然但願Log能根據模塊當前的buildtype來決定是否打印,因而我對這個common lib 使用了Library Publication這個特性
Library Publication 不會改變以前的構建過程,只是在gradle腳本中增長了一些配置,就實現了Lib的多版本發佈
Google工程師的實現思路很是簡單:
  1. 仍是隻須要選擇application的variant就能夠直接打包
  2. 改動在於,讓 [application依賴的library的variant] 被 [application的variant] 控制 
你具體的使用方式是也很是簡潔:
  1. 在library中設置讓library發佈本身的所有variant:android.publishNonDefault = true
  2. 而後在application中的reference中標明不一樣的 [application的variant] 依賴的不一樣的 [library具體的variant] :debugCompile project(path: ':Library', configuration: 'debug')
 
但我在實際項目中使用時,發現直接就同步不過去,報錯信息是「more than one library with package name:XXX」
正常狀況下,Gradle會處理好重複依賴的問題,可是這裏竟然會報這個錯誤,那必定是咱們在Library Publication時出了問題
原來仍是由於個人項目中依賴關係有些亂,形成了一個複雜的構建狀況,致使了構建問題,這個問題的原理提及來很是簡單:
  1. 假設有這樣一個多模塊項目:
    1. 應用A依賴庫B和庫C,同時庫B和庫C又都依賴庫D
    2. 在庫D上使用了新特性發布全版本,而後在庫C上使用新特性控制:當C是debug的時候D也是debug、C是release的時候D也是release
    3. 同時在C上也發佈全版本,A經過新特性控制C的版本就像C控制D同樣
    4. 而A對B不作控制,B對D也不作控制
  2. 這時,可是若是你進行debug構建,就會出現問題
  3. 由於當應用A是debug的時候,庫C是被新特性控制成debug的了,一樣D也是debug,另外一邊庫B只默認構建release版本,就天然使用了release,而庫B依賴的庫D由於是普通依賴,天然也是默認的release
  4. 這樣整個項目中就會存在一個debug的庫D和一個release的庫D,Gradle就報了構建錯誤:more than one library with package name:XXX
  5. (若是你對應用A進行release構建,不會有問題,能夠本身推理一下緣由)
 
知道緣由以後解決這個問題就能夠直接對症下藥了:讓庫B也發佈全版本,讓項目A控制庫B的版本,讓庫B控制庫D的版本 
相關文章
相關標籤/搜索