2013-09-25 30 views
1

在我的gradle依賴關係中,我希望能夠使用'default'版本並使其自動映射到特定版本的庫。從插件訪問配置ResolutionStrategy

例如,我可以在我的build.gradle如下:

dependencies { 
    compile (group: 'org.hibernate', module: 'hibernate-core', version 'default') 
} 

對決議我想這給我的

dependencies { 
    compile (group: 'org.hibernate', module: 'hibernate-core', version '4.3.0.Beta4') 
} 

等價的映射在文件中指定它包含類似

org.hibernate.hibernate-core=4.3.0.Beta4 

這是讀入一個擴展屬性爲typ在名爲versionMap的項目上使用HashMap。

我能得到這個映射在我的build.gradle文件

configurations { 
    all { 
     resolutionStrategy { 
      eachDependency { DependencyResolveDetails details -> 
       if (details.requested.getVersion() == "default") { 
        def key = details.requested.getGroup() + "." + details.requested.getName() + ".version.default" 
        details.useVersion(versionMap.get(key)) 
       } 
      } 
     } 
    } 
} 

(我必須承認彼得Niederwieser的幫助,讓我這個遠)

如下面的很愉快地工作我需要在我的許多項目中使用相同的功能,因此我已經創建了一個插件項目,並且它的所有構建都很好,但是當我嘗試運行它時,我無法訪問resolutionStrategy來設置邏輯。我的插件代碼如下所示:

import org.gradle.api.Plugin; 
import org.gradle.api.Project; 
import org.gradle.api.artifacts.DependencyResolveDetails; 
import org.gradle.api.artifacts.ConfigurationContainer; 
import org.gradle.api.artifacts.ResolutionStrategy; 

class DefaultVersionsPlugin implements Plugin<Project> { 

    @Override 
    public void apply(Project project) { 

     def strategy = 
      { DependencyResolveDetails details -> 
       if (details.requested.getVersion() == "default") { 
        def key = details.requested.getGroup() + "." + details.requested.getName() 
        details.useVersion(ext.versionMap.get(key)) 
       } 
      } 

     ConfigurationContainer configurations = project.getConfigurations(); 
     configurations.each { config -> 
      println "config: " + config + " - " + config.resolutionStrategy 
      config.resoultionStrategy.eachDependency{ strategy } 
     } 
    } 
} 

上面的println給出了有效的輸出,但下面的行給出了一個錯誤。運行這個插件的輸出是。

config: configuration ':alerting:archives' - org.gradle.api.internal.artifacts.iv[email protected]e2d0ab 

FAILURE: Build failed with an exception. 

* Where: 
Build file 'C:\trunk\build.gradle' line: 52 

* What went wrong: 
A problem occurred evaluating root project 'txlibs'. 
> Could not find property 'resoultionStrategy' on configuration ':alerting:archives'. 

* Try: 
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. 

BUILD FAILED 

Total time: 9.975 secs 

有沒有什麼辦法可以用編程方式設置分辨率策略?我嘗試了所有的組合方式來設置這個,但他們都給出了同樣的錯誤。

+1

這只是一個錯字。它應該是resolutionStrategy而不是resoultionStrategy –

+0

任何改變你的插件是開源的?我正在尋找類似的東西 – philbert

+0

不幸的是,這項工作是專有的,我不再與客戶有關係。 – Klunk

回答

1

我現在已經改變

ConfigurationContainer configurations = project.getConfigurations(); 
configurations.each { config -> 
    println "config: " + config + " - " + config.resolutionStrategy 
    config.resoultionStrategy.eachDependency{ strategy } 
} 

project.getConfigurations().all { config -> 
    config.resolutionStrategy.eachDependency{ DependencyResolveDetails details -> 
     if (details.requested.getVersion() == "default") { 
      def key = details.requested.getGroup() + "." + details.requested.getName() + ".version.default" 
      details.useVersion(project.ext.versionMap.get(key)) 
     } 
    } 
} 

動人的閉包定義內聯(不知道內聯的任何影響或不會)解決了這個問題。

+1

這是'全部'與'每個'。 'all'還會捕獲插件運行後稍後添加的配置。 –

+0

太好了,謝謝你。它當然很好地知道爲什麼發生了什麼事情,所以我不會再犯同樣的錯誤。 – Klunk

0

難道只是在

config.resoultionStrategy 

錯字或僅僅是一個例子,而不是真實的東西?

+0

不完全,但感謝您發現。 上述錯誤現在已經消失,但似乎沒有設置解決策略,因爲依賴性下載失敗。 – Klunk

+0

幾件事情:你能確定解決策略被調用;你能看到它使用ext.versionMap檢索正確的東西嗎? –

+0

我只是試過了,而'ext.versionMap'語法在我這樣的插件中不起作用。但是,'project.versionMap'工作正常。 –