为什么gradle任务未按正确顺序运行

时间:2020-06-24 09:59:25

标签: java gradle gradle-task

我有2个子项目的Java项目。具有这样的结构

- project_root
  |- client
     |- src
     |- build.gradle
  |- server
     |- src
     |- build.gradle
  |- build.gradle

我需要做的是在根buiild.gradle中创建“部署”任务,并执行以下操作:

  • 清理所有子项目
  • 清理“目标”文件夹
  • 为所有子项目制作罐子
  • 将罐子从所有子项目复制到根目录下的文件夹“ target”
  • 存档目标文件夹。

这就是我尝试这样做的方式

root build.gradle:

allprojects {
    apply plugin: 'java'
    repositories {
        mavenCentral()
    }
}

task cleanTarget(type: Delete) {
    delete "target"
    delete "target.zip"
}

task cleanAll() {
    dependsOn cleanTarget
    dependsOn clean
    dependsOn subprojects.clean
}

task jarChilds() {
    dependsOn subprojects.jar
}

task copyFiles(type: Copy) {
    copy {
        from("client/build/libs/")
        into project.file('target')
    }
    copy {
        from("server/build/libs/")
        into project.file('target')
    }
}

task zipApp(type: Zip) {
    from 'target/'
    include '*'
    include '*/*'
    archiveName 'target.zip'
    destinationDir(project.rootDir)
}

task deploy{
    dependsOn cleanAll
    dependsOn jarChilds
    dependsOn copyFiles
    dependsOn zipApp
    jarChilds.shouldRunAfter cleanAll
    copyFiles.shouldRunAfter jarChilds
    zipApp.shouldRunAfter copyFiles
}

如果我手动运行它,则每个任务都能正常运行,但是如果运行“ deploy”文件夹,则不会创建“ target”文件夹。这是日志输出:

Executing task 'deploy'...

> Task :clean
> Task :cleanTarget
> Task :client:clean
> Task :server:clean
> Task :cleanAll
> Task :client:compileKotlin
> Task :client:compileJava
> Task :client:processResources
> Task :client:classes
> Task :client:inspectClassesForKotlinIC

> Task :client:jar
Client jar done

> Task :server:compileKotlin
> Task :server:compileJava
> Task :server:processResources
> Task :server:classes
> Task :server:inspectClassesForKotlinIC

> Task :server:jar
Server jar done

> Task :jarChilds
> Task :copyFiles NO-SOURCE
> Task :zipApp NO-SOURCE
> Task :deploy


BUILD SUCCESSFUL in 3s
14 actionable tasks: 14 executed
12:39:15: Task execution finished 'deploy'.

我看到错误“ NO-SOURCE”,但是文件夹“ client / build / libs”和“ server / build / libs”存在并且包含jar。我可以肯定,因为手动运行的任务“ copyFiles”会创建文件夹“ target”并复制所有文件。 我看到的唯一可能的选项是在“ jarChilds”之前运行“ copyFiles”任务。但是我不明白为什么。我缺少什么,为什么它不起作用?

P / S /对不起,我的英语不好

1 个答案:

答案 0 :(得分:3)

您的任务copyFiles使用copy实例的方法Project而不是配置实际任务。这就是为什么该任务保持未配置状态,并且一旦执行该任务就报告没有要处理的文件(NO-SOURCE)的原因。要配置任务,请使用任务类型为Copy的方法:

task copyFiles(type: Copy) {
    from("client/build/libs/")
    from("server/build/libs/")
    into("target")
}

其他提示:您可能根本不需要任务copyFiles。相反,您可以只使用任务zipApp来收集文件:

task zipApp(type: Zip) {
    from subprojects.jar
    archiveName 'target.zip'
    destinationDir(project.rootDir)
}

通过将jar的{​​{1}}个任务放入subprojects方法中,Gradle甚至会自动添加任务依赖项,因此您无需使用{{1 }}。

查看以下简短且完整的from文件:

dependsOn