Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gradle 根据以前的任务生成多个渐变Tar任务';s输出_Gradle - Fatal编程技术网

Gradle 根据以前的任务生成多个渐变Tar任务';s输出

Gradle 根据以前的任务生成多个渐变Tar任务';s输出,gradle,Gradle,我觉得答案是“不可能”,但我想我还是会问 假设我有一个生成任意数量目录的任务(即,在构建时我不知道可以生成多少目录): 我想为找到的每个目录生成一个Tar任务。例如: fileTree("build/").visit { if (it.isDirectory()) { def variant = it.name def t = tasks.create(name: "generateTar${variant}", type: Tar) {

我觉得答案是“不可能”,但我想我还是会问

假设我有一个生成任意数量目录的任务(即,在构建时我不知道可以生成多少目录):

我想为找到的每个目录生成一个
Tar
任务。例如:

fileTree("build/").visit {
    if (it.isDirectory()) {
        def variant = it.name
        def t = tasks.create(name: "generateTar${variant}", type: Tar) {
            from "./build/${variant}/"
            baseName = "dist-${variant}"
        }
    }
}
问题是,看起来我只能在配置时创建这些任务。此时,
makeSampleFiles
尚未运行,因此没有文件


在Gradle执行阶段,是否有办法生成和运行任务?或者在执行阶段生成任意数量的TAR的任何其他方法,类似于在
doLast
中可以有多个
copy{}
规范?

实际上,在执行阶段不可能创建和添加任务,但如上面的注释所述,如果您不需要创建多个任务,那么(每个文件夹/要生成的归档文件一个),然后您可以通过一个任务来实现这一点,该任务将迭代其他不同的目录,并为每个目录创建一个tar归档文件

类似的方法会奏效:

// your initial task which creates the directories
task makeSampleFiles {
    doLast {
        mkdir 'build/pkg/a'
        mkdir 'build/pkg/b'
        // ....
        file('build/pkg/a/a.out').text = 'a'
        file('build/pkg/b/b.out').text = 'b'
    }
}

// the task responsible to create tar archives
task makeTarAchives {
    dependsOn makeSampleFiles
    doLast {
        fileTree("build/").visit {
            if (it.isDirectory()) {
                def variant = it.name
                ant.tar(destfile: "build/dist-${variant}.tar", basedir: "build/$variant")
            }
        }
    }
}

实际上,在执行阶段不可能创建和添加任务。但是您真的需要创建这些多个Tar任务吗(您需要手动调用这些任务,还是在项目的任务列表中查看这些任务)?否则,您可以创建一个类似于“makeSampleFiles”的任务,该任务将迭代其他
build/
子文件夹,并为每个子文件夹创建一个tar存档。例如,使用ant
tar
。我确实不需要手动调用它们或在任务列表中查看它们(尽管我认为我可以使用任务规则执行此操作),所以这不是一个要求。一个任务就可以了。我没有想到ant.tar-我认为它确实可以。让我试试。规则似乎非常适合这里的想法。我认为,对于任务规则,您仍然会遇到相同的问题:您需要在配置阶段级别定义规则,而目录列表将不会是known直到执行阶段。规则在这里起作用,但是我仍然有一个问题,我如何为任务名称创建一个“dependsOn”?我仍然需要定义在配置时需要依赖的任务,为此我需要目录列表。。。
// your initial task which creates the directories
task makeSampleFiles {
    doLast {
        mkdir 'build/pkg/a'
        mkdir 'build/pkg/b'
        // ....
        file('build/pkg/a/a.out').text = 'a'
        file('build/pkg/b/b.out').text = 'b'
    }
}

// the task responsible to create tar archives
task makeTarAchives {
    dependsOn makeSampleFiles
    doLast {
        fileTree("build/").visit {
            if (it.isDirectory()) {
                def variant = it.name
                ant.tar(destfile: "build/dist-${variant}.tar", basedir: "build/$variant")
            }
        }
    }
}