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

dnph8jn4  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(64)

我想写一个用java写的自定义gradle插件。我已经在groovy构建脚本中编写了核心功能。第一部分是声明一些将始终使用的核心依赖项。第二部分是在dependencies部分添加一个helper闭包。这个闭包将以名称作为参数,并基于此决定包含哪些依赖项。如果helper闭包从未使用过,核心依赖性仍将被包括。
groovy脚本实现如下。核心依赖项在标准依赖项部分声明。

dependencies {
    
    implementation '<dependency name>'
    
}

字符串
helper闭包是这样实现的。

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闭包。

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方法中最好地访问dependencies部分?如何使用访问来实现我想要的功能?
我在项目对象上发现了getDependecies()dependencies(Closure)方法可能有用。我不知道它们之间的区别,但我怀疑这与延迟配置有关。dependencies也需要一个闭包,我不确定如何使用。这似乎表明dependencies(Closure)是延迟配置,并且它更可取。两者似乎都导致了一个DependencyObject对象,它可能可以用来实现我想要的功能。

n53p2ov0

n53p2ov01#

getDependencies()dependencies(Closure)做的是同样的事情。Closure是一个用于编写好的DSL的Groovy概念,所以如果你正在使用Groovy,在Groovy脚本中调用它是一种惯用的方式。这样做会失去类型安全性,所以在Java中尝试使用它似乎不是一个好主意。
您正在访问的DependencyHandler是一个“bucket”,它始终存在并在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(即使用PropertyProvider对象),以便在项目增长时保持构建顺利运行。

相关问题