8

我正在为一个非 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”任务。

4

2 回答 2

11

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

如果您发现<<(以及它造成的差异)令人困惑,一个好的解决方案是永远不要使用<<但总是更明确的doLast {}.

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

于 2012-07-19T10:44:37.257 回答
0

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

这是因为多项目构建:

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

在这种情况下,如果您尝试在主构建文件中包含一个tar或一个copy任务,该任务引用了project(":sub-project")使用它的某些内容,它将诱使开发人员将其包装在 doLast 中。

例如,主 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 {}任务和错误消失了。坏的!!

  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"

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

于 2017-03-31T02:35:05.423 回答