我正在编写一个非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”任务。
答案 0 :(得分:11)
您已经解决了在执行阶段而不是配置阶段中配置任务的经典错误。解决方案是删除第一个代码段中的<<
。
如果您发现<<
(及其产生的差异)令人困惑,一个好的解决方案是永远不要使用<<
,但始终使用更明确的doLast {}
。
没有tar
方法,但通常最好将这些内容作为单独的任务。 (如果有充分理由,copy
之类的方法应该优先于相应的任务。)
答案 1 :(得分:0)
我遇到了一个有趣的情况,当我在tar任务上使用doLast {}时,我被这个击中了。
这是因为多项目构建:
build.gradle
--> sub-project
--> build.gradle
在这种情况下,如果您尝试在主构建文件中引用tar
或copy
任务,该任务引用了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{}
块,现在不再忽略该任务。