这是我想要做的事情:
build
复制档案(作品)
的任务task copyTpcds(type: Copy) {
file('build/zip').mkdirs()
from buildscript.configurations.classpath
include 'tpcds*'
into 'build/zip'
}
解压缩然后删除存档的任务
task extractTpcds(type: Copy) {
def names = new FileNameFinder().getFileNames('build/zip', 'tpcds*')
def outDir = file('build/cmd/tpcds')
outDir.mkdirs() // make sure the directory exists
from zipTree(file(names[0])) // generates error when
into outDir
// now remove copied zip file
//zipFile.delete() // deletes file before the extractions completes?
}
以下是几种情况:
build.gradle
并尝试运行任何内容,即使只是gradle tasks
,那么我会在任务#2的代码中收到此错误:Neither path nor baseDir may be null or empty string. path='null' basedir='C:\dev\code\td\pdo\tpcds-tpg'
:{{1 }} file(names[0])
build/zip
它将运行并提取存档所以在我看来
我对如何处理此事感到失望,并非常感谢您的建议
答案 0 :(得分:3)
以下适用于我,使用Gradle 2.12(假设zip文件位于files
):
buildscript {
configurations {
classpath
}
dependencies {
classpath files("files/tpcds.zip")
}
}
def copyFiles = { ->
ant.mkdir(dir: "build/zip")
buildscript.configurations.classpath.each { def thisFile ->
if (thisFile.name ==~ /tpcds.*/) {
ant.copy(file: thisFile.absolutePath, todir: "build/zip")
}
}
}
tasks.whenTaskAdded { task ->
if (task.name == "extractTpcds") {
copyFiles()
}
}
task copyTpcds << {
copyFiles()
}
task extractTpcds(type: Copy) {
def names = new FileNameFinder().getFileNames('build/zip', 'tpcds*')
def outDir = file('build/cmd/tpcds')
outDir.mkdirs() // make sure the directory exists
from zipTree(file(names[0])) // generates error when
into outDir
// now remove copied zip file
//zipFile.delete() // deletes file before the extractions completes?
}
原件问题涉及与ICE规则的阻抗不匹配:初始化阶段,配置阶段和执行阶段。特别是,Copy任务的规范处于Configuration阶段;通常,在执行阶段强制执行任务依赖(例如dependsOn
)。在配置阶段期间,extractTpcds
任务依赖于其他代码。
在我的例子中,有两种情况:
gradle copyTpcds
将在执行阶段调用copyFiles
方法。 <<
表示“在执行阶段执行此操作”。gradle tasks
将在配置阶段触发whenTaskAdded
中的代码,并致电copyFiles
。同样适用于gradle extractTpcds
另一种方法是在两个任务中使用AntBuilder,完全避免使用Type: Copy
,如下所示:
buildscript {
configurations {
classpath
}
dependencies {
classpath files("files/tpcds.zip")
}
}
task copyTpcds << {
ant.mkdir(dir: "build/zip")
buildscript.configurations.classpath.each { def thisFile ->
if (thisFile.name ==~ /tpcds.*/) {
ant.copy(file: thisFile.absolutePath, todir: "build/zip")
}
}
}
task extractTpcds(dependsOn: 'copyTpcds') << {
def outDir = "build/cmd/tpcds"
ant.mkdir(dir: outDir)
def names = new FileNameFinder().getFileNames('build/zip', 'tpcds*')
names.eachWithIndex { zipFile, index ->
if (index == 0) {
ant.unzip(src: zipFile, dest: outDir)
}
}
}
答案 1 :(得分:0)
这样的东西应该有效,但为什么你需要删除拉链?使用dependsOn链接任务意味着您只需运行第二个任务,copyTpcds将自动运行,除非输入或输出已更改(已删除)
task extractTpcds(type: Copy) {
dependsOn(copyTpcds) //make this execute after
def names = new FileNameFinder().getFileNames('build/zip', 'tpcds*')
def outDir = file('build/cmd/tpcds')
outDir.mkdirs() // make sure the directory exists
from zipTree(file(names[0])) // generates error when
into outDir
// now remove copied zip file
doLast { zipFile.delete() }// deletes file after the extractions completes
}