运行 Gradle 中自定义任务中的任务

Running a task within a custom task in Gradle

我正在尝试使用 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 中的任务中创建任务。如果你想编写一个带有你所描述的任务的自定义插件,方法是编写一个自定义插件 class 并在该插件 class 中声明一个 [=14= 类型的任务] 那就是你想做的。这可能看起来像这样:

class MyCustomPlugin extends Plugin<Project> {

    void apply(Project project) {
        project.tasks.create("copyDeps", Copy.class) {
            from configurations.runtime
            into 'build/lib'
        }
    }

}

现在,如果您在构建脚本中应用此插件:

apply plugin:MyCustomPlugin

您的构建中自动有一个名为 "copyDeps" 类型为 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() 称为你自己的。此方法被认为是 API in Gradle 的内部方法,直接执行它会导致意外行为。 (例如,它破坏了 Gradle 的增量构建功能)