2015-03-31 110 views
1

說我定義了一個插件,像這樣:gradle配置是否合併或覆蓋?

import org.gradle.api.artifacts.dsl.RepositoryHandler 
import org.gradle.api.artifacts.repositories.MavenArtifactRepository 
import org.gradle.api.Project 
import org.gradle.api.Plugin 

class MyRepos implements Plugin<Project> { 
    static final String NEXUS_URL = 'http://nexus.mine.com/nexus/content/repositories/' 
    static final List<String> NEXUS_REPOS = [ 
     'central', 
     'build', 
     'snapshots', 
     'release-candidates', 
     'releases', 
    ] 

    void apply(Project project) { 
     project.repositories { 
      NEXUS_REPOS.each { 
       maven { 
        url (NEXUS_URL + it) 
       } 
      } 
      mavenLocal() 
     } 
     project.buildscript { 
      repositories { 
       maven { 
        url (NEXUS_URL + 'central') 
       } 
       mavenLocal() 
      } 
     } 
    } 
} 

,並在當地的build.gradle,我寫

apply plugin: MyRepos 

buildscript { 
    dependencies { 
     ... 
    } 
} 

我的願望是要合併使得倉庫兩個部分buildscript在插件和build.gradle中的依賴關係中定義,但看起來局部聲明會覆蓋插件,並最終出現一個指示「沒有定義存儲庫」的錯誤。

如果我通過頂層build.gradle的配置注入來做到這一點,結果是一樣的嗎?

也許正確的解決方案是爲插件提供的分機關閉定義useMyRepos()類似用於mavenCentral()的方式......

回答

1

在gradle這個一般的配置項進行合併,以便應用配置在不同的地點。例如,您可以在一個構建腳本中配置一些依賴項,這些腳本將應用於另一個將添加其他依賴項的構建腳本。

但是,您的情況有點不同,因爲您正在使用buildScript配置,該配置可用於定義構建腳本本身的依賴關係,而不是用於定義項目依賴項的根repositories節點建立。

在這種情況下,根據Purpose of buildScript in Gradle,因爲這些是不同的配置,您必須定義兩次相關性。

+0

也許依賴被合併,我沒有測試過 - 但似乎'buildscripts'和'repositories'的內容沒有合併。我仍然需要檢查配置注入是否正確。 – 2015-03-31 19:50:26

+0

您可以先用兩個腳本嘗試它(一個使用'apply from'應用另一個腳本)。對於不同的對象類型或合併插件和腳本,Gradle可能有不同的規則。 – 2015-03-31 19:52:59

+0

好的 - 做了一些更多的研究,根據[Gradle中的buildScript的目的](http://stackoverflow.com/questions/13923766/gradle-buildscript-dependencies),因爲'buildscript'塊是爲了定義構建腳本本身,而'存儲庫'用於定義您構建的項目的依賴關係,在這種情況下,兩個存儲庫節點將不會合並。 – 2015-03-31 22:13:52