我想写一个用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对象,它可能可以用来实现我想要的功能。
1条答案
按热度按时间n53p2ov01#
getDependencies()
和dependencies(Closure)
做的是同样的事情。Closure
是一个用于编写好的DSL的Groovy概念,所以如果你正在使用Groovy,在Groovy脚本中调用它是一种惯用的方式。这样做会失去类型安全性,所以在Java中尝试使用它似乎不是一个好主意。您正在访问的
DependencyHandler
是一个“bucket”,它始终存在并在Project对象上初始化,因此在任何时候访问它都没有问题。因此,调用
getDependencies()
并开始工作吧!您可以这样写:字符串
你将不得不考虑如何获得
name
变量。我想你会想通过添加一个项目扩展来做到这一点。强烈建议使用Gradle惰性API(即使用Property
和Provider
对象),以便在项目增长时保持构建顺利运行。