我正在尝试使用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执行此任务。
答案 0 :(得分:10)
您无法在Gradle中的任务中创建任务。如果你想用你所描述的任务编写一个自定义插件,那么就要编写一个自定义插件类,并在该插件类中声明一个类型为Copy
的任务,它可以完成你想做的事情。这看起来像这样:
class MyCustomPlugin extends Plugin<Project> {
void apply(Project project) {
project.tasks.create("copyDeps", Copy.class) {
from configurations.runtime
into 'build/lib'
}
}
}
现在,如果你在buildcript中应用这个插件:
apply plugin:MyCustomPlugin
你自动拥有一个名为&#34; copyDeps&#34;的任务在您的构建中的Copy
类型。
有时在自定义任务中执行简单的复制操作会很方便。这可以使用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&#39;增量构建功能)