我正在尝试使用Java编写自定义Gradle插件。在此插件中,我需要做的一件事是将所有已定义的依赖项复制到一个文件夹中。我发现了如何使用build.gradle文件中的任务来执行此操作:
task copyDeps(type: Copy) {
from configurations.runtime
into 'build/lib'
}
但是,我正在努力弄清楚如何在自己的自定义任务中运行此任务。我尝试这样做:
public class MyTask extends DefaultTask {
@TaskAction
public void executeTask() {
Copy copyTask = new Copy();
copyTask.into(libFolder).from(getProject().getConfigurations().getByName("runtime").execute();
}
}
但是,当我运行此命令时,出现异常:
Task of type 'org.gradle.api.tasks.Copy' has been instantiated directly which is not supported. Tasks can only be created using the DSL.
我知道它要说的是什么,但是我无法找出能够使用Java内的DSL执行此任务的方法。
您无法在Gradle中的任务内创建任务。如果您要使用任务描述编写自定义插件,那么方法是编写自定义插件类,并在该插件类中声明一个可以完成Copy
您想做的类型的任务。可能看起来像这样:
class MyCustomPlugin extends Plugin<Project> {
void apply(Project project) {
project.tasks.create("copyDeps", Copy.class) {
from configurations.runtime
into 'build/lib'
}
}
}
现在,如果您在构建脚本中应用此插件:
apply plugin:MyCustomPlugin
您会Copy
在构建中自动有一个名为“ copyDeps”的任务。
有时在自定义任务中执行简单的复制操作会很方便。这可以使用project.copy
util方法完成。这样的任务看起来像这样
public class MyTask extends DefaultTask {
@TaskAction
public void executeTask() {
project.copy {
into(libFolder)
from(project.configurations.runtime)
}
}
}
使用纯Java时,它将如下所示:
public class MyTask extends DefaultTask {
@TaskAction
public void executeTask() {
project.copy(new Action<CopySpec>() {
@Override
void execute(CopySpec copySpec) {
copySpec.into(libFolder);
copySpec.from(getProject().getConfigurations().getByName("runtime"));
}
});
}
}
您永远不要Task#execute()
自己打电话。该方法在Gradle中被视为内部API,直接执行该方法会导致意外行为。(例如,它破坏了Gradles的增量构建功能)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句