gradle tar任务没有执行

时间:2012-07-19 10:25:40

标签: gradle tar

我正在编写一个非Java项目的Gradle构建,用于将现有目录和tar存档组合成.tar.gz如果我使用这样的定义,tar任务会跳过:

task archive(dependsOn: 'initArchive',type: Tar) << {
    baseName = project.Name
    destinationDir = new File(project.buildDir.path+'/installer')
    compression = Compression.GZIP
    from (archiveDir)
    doLast{
        checksum(archivePath)
    }
}

这是控制台输出

:jenkins-maven-sonar:archive
Skipping task ':jenkins-maven-sonar:archive' as it has no source files.
:jenkins-maven-sonar:archive UP-TO-DATE

BUILD SUCCESSFUL

Total time: 9.056 secs

当我尝试使用tar任务作为方法时,它失败抱怨无法找到方法

task archive(dependsOn: 'initArchive') << {
    tar{
    baseName = project.Name
    destinationDir = new File(project.buildDir.path+'/installer')
    compression = Compression.GZIP
    from (archiveDir)
    doLast{
        checksum(archivePath)
    }
    }
}

FAILURE: Build failed with an exception.

* Where:
Build file '/home/anadi/Code/da-ci-installers/build.gradle' line: 29

* What went wrong:
Execution failed for task ':jenkins-maven-sonar:archive'.
> Could not find method tar() for arguments [build_6a2bckppv2tk8qodr6lkg5tqft$_run_closure3_closure5_closure7@4a5f634c] on task ':jenkins-maven-sonar:archive'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output.

BUILD FAILED

Total time: 8.749 secs

我们可以像Gradle允许运行副本一样运行tar任务吗?在同一个版本中,我有一个像下面这样的块,我想知道tar是否可以以相同的方式使用

            copy {
                project.logger.info("Copying bundle :: "+bundle[x])
                from(rootProject.projectDir.path+"/3rd-party-tools/"+bundle[x]) {
                    include '**/*.*'
                }
                into(archiveDir)
           }

如果不是如何使用上述第一种形式,如何确保我的构建不“跳过tar”任务。

2 个答案:

答案 0 :(得分:11)

您已经解决了在执行阶段而不是配置阶段中配置任务的经典错误。解决方案是删除第一个代码段中的<<

如果您发现<<(及其产生的差异)令人困惑,一个好的解决方案是永远不要使用<<,但始终使用更明确的doLast {}

没有tar方法,但通常最好将这些内容作为单独的任务。 (如果有充分理由,copy之类的方法应该优先于相应的任务。)

答案 1 :(得分:0)

我遇到了一个有趣的情况,当我在tar任务上使用doLast {}时,我被这个击中了。

这是因为多项目构建:

build.gradle
--> sub-project
    --> build.gradle

在这种情况下,如果您尝试在主构建文件中引用tarcopy任务,该任务引用了project(":sub-project")使用的内容,则会诱使开发人员将其包装doLast。

例如,main build.gradle文件包含:

  task distTar(type: Tar, dependsOn: "buildDist") {
    description "Package ProjName into a Tar file"
    group "Build"
    baseName = 'outbasename'
    archiveName = baseName + '.tar.gz'
    compression = Compression.GZIP
    destinationDir = file(project(":packaging").buildDir.path)
    extension = 'tar.gz'
    into('outdir') {
      from project(":sub-project").war
    }
  }

因此他们收到project(":sub-project").war不存在的错误。因此,为了解决这个问题,有人将doLast {}置于任务中并且错误消失了。 BAD !!

  task distTar(type: Tar, dependsOn: "buildDist") {
    doLast { // <-- BAD!!
      description "Package ProjName into a Tar file"
      group "Build"
      baseName = 'outbasename'
      archiveName = baseName + '.tar.gz'
      compression = Compression.GZIP
      destinationDir = file(project(":packaging").buildDir.path)
      extension = 'tar.gz'
      into('outdir') {
        from project(":sub-project").war
      }
    }
  }

然后我被解决了。所以正确的做法是添加

evaluationDependsOn ":sub-project"

在main build.gradle文件中。现在它知道评估它。我删除了不正确的doLast{}块,现在不再忽略该任务。