Gradle:创建一个在" build"之后运行的任务任务

时间:2015-07-16 08:24:46

标签: groovy gradle

这似乎是一件非常简单的事情,但我尝试了无数的在网上找到的例子,它们都以某种不同的方式失败,这意味着我可能只是没有得到任务如何在gradle中工作的概念(对不起,这对我来说还是一个新手。)

我想要做的是:我有一个多项目gradle解决方案,它有几个java子项目。对于每个子项目,我想创建一个任务:

  1. 构建项目
  2. 将生成的jar文件复制到其他文件 目录
  3. 这是我得到的(它可能只是遗漏了一些小东西,或者它可能是一种完全错误的方法,我希望有人会向我解释):在我的根build.gradle我'我说这个:

    subprojects{
        plugins.withType(JavaPlugin){ //create copyOutput task for all java projects
            tasks.create("copyOutput"){
                Path infile = Paths.get(buildDir.getCanonicalPath() + "/libs/" + project.name + ".jar")
                Path outfile = Paths.get(rootProject.projectDir.getCanonicalPath() + "/bin/" + project.name + ".jar")
                Files.copy(infile, outfile, REPLACE_EXISTING)
            }
            tasks['copyOutput'].dependsOn tasks['build'] //only run after build (doesn't work, runs immediately at configuration time)
        }
    }
    

    我可以通过堆栈跟踪收集到的问题是,它在配置时执行立即任务,每个时间(不仅仅是我做gradle copyOutput,但总是,即使我做gradle clean之类的事情。)

    显然,我并不了解任务创建和依赖的工作方式。任何人都可以澄清吗?

1 个答案:

答案 0 :(得分:2)

您需要添加操作(<<):

subprojects{
    plugins.withType(JavaPlugin){ //create copyOutput task for all java projects
        tasks.create("copyOutput") << {
            Path infile = Paths.get(buildDir.getCanonicalPath() + "/libs/" + project.name + ".jar")
            Path outfile = Paths.get(rootProject.projectDir.getCanonicalPath() + "/bin/" + project.name + ".jar")
            Files.copy(infile, outfile, REPLACE_EXISTING)
        }
        tasks['copyOutput'].dependsOn tasks['build'] //only run after build (doesn't work, runs immediately at configuration time)
    }
}