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的版本 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM