如何从java自定义gradle插件配置依赖项?

问题描述 投票:0回答:1

我想写一个用java编写的自定义gradle插件。 我已经在 groovy 构建脚本中编写了核心功能。 第一部分是声明一些将始终使用的核心依赖项。 第二部分是向依赖项部分添加一个辅助闭包。 该闭包将采用名称作为参数,并根据该名称决定要包含哪些依赖项。 如果从未使用辅助闭包,核心依赖项仍将包含在内。

groovy脚本实现如下。 核心依赖项在标准依赖项部分中声明。

dependencies {
    
    implementation '<dependency name>'
    
}

辅助闭包是这样实现的。

dependencies.ext.helper = { name ->
    
    // Some logic that decides which dependencies to include based on name arg ...
    
    // For each dependency to include ...
    dependencies.implementation "<dependency name>"
    
}

然后可以在

build.gradle
文件的依赖项部分中使用辅助闭包。

dependencies {
    
    helper 'some name'
    
}

我现在想将其转换为用 java 编写的独立插件。

用java编写的插件有以下主类。

package some.package;

import org.gradle.api.*;

public class MyPlugin implements Plugin<Project> 
    
    @Override
    public void apply(Project project){
        
    }
    
}

如何从 apply 方法中最好地访问依赖项部分? 如何使用该访问权限来实现我想要的功能?

我发现项目对象上的

getDependecies()
dependencies(Closure)
方法可能有用。 我不知道它们之间的区别,但我怀疑这与延迟配置有关。
dependencies
还需要一个关闭,我不确定如何使用。 这似乎表明
dependencies(Closure)
是推迟的,而且更可取。 两者似乎都会导致一个 DependencyHandler 对象,该对象可能可用于实现我想要的功能。

java gradle groovy build.gradle gradle-plugin
1个回答
0
投票

getDependencies()
dependencies(Closure)
正在做同样的事情。
Closure
是一个用于编写漂亮 DSL 的 Groovy 概念,因此如果您使用 Groovy,则在 Groovy 脚本中调用它是一种惯用的方式。这样做会失去类型安全性,因此尝试在 Java 中使用它似乎不是一个好主意。

两者都与延迟配置无关。您正在访问的

DependencyHandler
是一个始终存在并在 Project 对象上初始化的“存储桶”,因此随时访问它都没有问题。

所以拨打

getDependencies()
并陷入困境!你可以这样写:

@Override
public void apply(Project project) {
    DependencyHandler dependencies = project.getDependencies();
    dependencies.add(
        JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, dependencyOne
    );
    if (name != null)
        addHelperDependencies(name, dependencies);
    }
    
private void addHelperDependencies(String name, DependencyHandler dependencies) {
    dependencies.add(
        JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, getDependencyTwo(name)
    );
}
    
private String getDependencyTwo(String name) {
    return "aMostUsefulDependency" + name;
}

您必须考虑如何获取

name
变量。我想您会希望通过添加项目扩展来做到这一点。强烈建议使用 Gradle 惰性 API(即使用
Property
Provider
对象),以确保您的构建随着项目的增长而顺利运行。

© www.soinside.com 2019 - 2024. All rights reserved.