我想写一个用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 对象,该对象可能可用于实现我想要的功能。
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
对象),以确保您的构建随着项目的增长而顺利运行。