2014-01-09 48 views
9

而不是在每個分項目的複製Android的配置塊:如何使用Gradle將Android配置注入到每個子項目?

android { 
    compileSdkVersion 19 
    buildToolsVersion "19.0.0" 

    defaultConfig { 
     minSdkVersion 9 
     targetSdkVersion 14 
    } 
} 

我寧願把這個頂層/根gradle這個build文件,如:

subprojects{ 
    android { 
     compileSdkVersion 19 
     buildToolsVersion "19.0.0" 

     defaultConfig { 
      minSdkVersion 9 
      targetSdkVersion 14 
     } 
    } 
} 

然而,這不起作用。 :(

錯誤: 「..Could找不到參數方法的Android()......」

回答

15

對此的解決方案竟然是:

subprojects{ 
    afterEvaluate { 
     android { 
      compileSdkVersion 19 
      buildToolsVersion "19.0.0" 

      defaultConfig { 
       minSdkVersion 9 
       targetSdkVersion 14 
      } 
     } 
    } 
} 

據我所知,這是因爲在評估時處理/使用android {...}意味着只要它在根構建中擊中子項目時它就必須存在(即,明確書寫或作爲「應用插件」的一部分)文件,更準確地說,它意味着頂層項目必須定義它(這可能不是因爲它可能不是'android'或'android-library'構建本身)。但是,如果我們在評估之後將其推遲,則可以直接使用每個子項目中可用的內容。

這個問題+解決方案還假定所有的子項目都是某種形式的android項目(在我的情況是正確的,但不一定適用於其他項目)。 更安全的答案是使用:

subprojects{ 
    afterEvaluate { 
     if(it.hasProperty('android')){ 
      android { 
       compileSdkVersion 19 
       buildToolsVersion "19.0.0" 

       defaultConfig { 
        minSdkVersion 9 
        targetSdkVersion 14 
       } 
      } 
     } 
    } 
} 
+0

這可以很好地工作,但這種方式沒有子項目可以覆蓋默認值。在設置值之前,您應該檢查compileSdkVersion和buildToolsVersion的存在。 –

+0

的確如此,但另一方面,如果有人不小心嘗試在子項目中覆蓋事物,他們將不會脫身;) – CasualT

相關問題