2015-12-06 53 views
1

我試圖建立一個搖籃插件將允許以下內容:搖籃擴展爲NamedDomainObjectContainer封閉

myPluginConfig { 
    something1 { 
     // this is a closure 
    } 
    somethingElse { 
     // this is another closure 
    } 
    // more closures here 
} 

要做到這一點我相當肯定我需要使用NamedDomainObjectContainer包裝一個Closure集合,所以我已經設置了以下插件:

class SwitchDependenciesPlugin implements Plugin<Project> { 
    void apply(Project project) { 
     // add the extension 
     project.getExtensions().myPluginConfig = project.container(Closure) 
     // read the current configuration 
     NamedDomainObjectContainer<Closure> config = project.myPluginConfig 
     // test it out, always returns [] 
     System.out.println(config) 
    } 
} 

什麼我做錯了,做我需要使用project.extensions.create呢?如果是這樣,怎麼樣?

編輯:我的用例包括根據項目層次結構中定義的一些變量添加依賴項。例如,下面的配置將添加red項目如果變量redproject.ext定義,或gson否則:

myPluginConfig { 
    redTrue { 
     compile project(':red') 
    } 
    redFalse { 
     compile 'com.google.code.gson:gson:2.4' 
    } 
    greenTrue { 
     compile project(':green') 
    } 
} 

對於這種使用情況下,我需要有動態的名字myPluginConfig,因此無論是Map或一個NamedDomainObjectContainer

回答

1

你能否解釋一下你在這裏試着模擬什麼?我認爲你有兩個選擇。一種是使用NamedDomainObjectContainer。在這裏你需要一個代表「某事」的類。看看關於維護多個域對象搖籃userguide章(見https://docs.gradle.org/current/userguide/custom_plugins.html#N175CF)的userguide樣品中的「物」是「書」。上面描述的內置配置語法是免費的。

如果你想有一個像上述語法,而不需要維護多個領域對象,你可以簡單地添加需要關閉作爲參數傳遞給你的擴展類中的方法:

void somethingToConfigure(Closure) { 
} 
+0

這個例子正是我試圖實現,只是,而不是'Book's我需要'Closure's,因爲我那麼就需要將它們傳遞給'project.dependencies'。 – frapontillo

+0

這並不直接'Closure'爲關閉不執行'Named'接口也有一個'name'屬性工作。 –

+0

那麼我怎樣才能使它工作?換句話說,Gradle如何用'依賴'來做到這一點? – frapontillo

0

你不能有Closure作爲一個類型NamedDomainObjectContainer僅僅是因爲你使用必須有一個屬性的類型稱爲name,並用一個單一的字符串參數的公共構造函數。

爲了克服這個問題,可以創建一個圍繞Closure的包裝用name場增加。