如何从自定义gradle插件向项目添加依赖约束?
我想创建一个gradle插件,它将约束插件应用到的项目中的传递依赖关系。理想情况下,我希望这个插件遵循以下规则:
- 仅当项目中存在约束时才尝试将其应用于项目。例如,如果依赖项X被拉入项目,则仅对依赖项X应用约束。
- 自动应用插件的应用程序上的约束,我不想创建/运行额外的任务或类似的东西.
- (奖励)不要将约束应用于主依赖项,只应用于传递依赖项。
这是我目前掌握的情况
class ConstraintPlugin implements Plugin<Project> {
private Map<String, String> constraintMap = [
"jackson-core": "2.13.2",
"logback-classic": "2.3.9"
]
@Override
void apply(Project project) {
project.configurations.each {config ->
config.resolvedConfiguration.resolvedArtifacts.each {dep ->
if (constraintMap.containsKey(dep.name)) {
ModuleVersionIdentifier id = dep.moduleVersion.id
String constraintVersion = constraintMap.get(id.name)
DependencyConstraint dc = new DefaultDependencyConstraint(id.group, id.name, constraintVersion)
config.dependencyConstraints.add(dc)
}
}
}
我使用的是在constraint plugin类中示例化的map,其中包含了我想要约束的依赖项的名称沿着在应用此插件的项目中要约束的版本。这里我想约束jackson-core
和logback-classic
依赖项。
我的第一个想法是遍历每个配置,看看该依赖项名称是否存在于该配置中。如果是,请创建一个新的DependencyConstraint
并将其添加到配置中。然而,当我将插件应用到另一个项目时,这是不起作用的。
还要注意,我还没有完全忽视主依赖关系,这个特性更像是一个“很好的拥有”,我还没有弄清楚如何只查看给定配置中的传递依赖关系。
我认为我的问题在于我如何以编程方式应用新的DependencyConstraint
,但我似乎找不到一种方法来添加一个有效的约束。我试过的唯一一种方法是project.dependencies.constraints.create(dc)
,它也不起作用。
1条答案
按热度按时间rdlzhqv91#
我知道这已经有一段时间了,但是为什么你不简单地在你的build.gradle中使用约束定义呢?它似乎满足了你的所有需求。您手动创建依赖约束的方法不起作用,因为您是在依赖集被解析并且所有约束都被应用之后才这样做的。你可以这样做,手动添加一个约束,以进一步解决:
现在,如果你在应用和不应用插件的情况下运行这个命令,你会看到jackson-core版本的差异得到解决。
但这只是声明依赖约束的粗略版本。
希望这对你有帮助。