在我的gradle依赖项中,我希望能够使用“default”版本,并自动映射到特定版本的库。
作为示例,我的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
在名为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))
}
}
}
}
}
(我需要感谢Peter 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.ivyservice.resolutionstrategy.DefaultResolutionStrategy_Decorated@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
有没有办法以编程方式设置解析策略?我已经尝试了各种组合来设置它,但它们都给出了相同的错误。
答案 0 :(得分: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 :(得分:0)
这只是
中的拼写错误config.resoultionStrategy
或只是一个例子,而不是真实的东西?