具有lazy include属性的Gradle zip任务包含自身

具有lazy include属性的Gradle zip任务包含自身,gradle,libgdx,Gradle,Libgdx,嗨,我完成了这个zip任务,效果非常好: def dir = new File("${projectDir.parentFile}/test/") task testZip(type: Zip) { from dir destinationDirectory = dir include 'toast/**' archiveFileName = 'test.zip' } 但是当我把include属性设置为懒惰时,因为我需要在我的实际情况中这样做 def dir

嗨,我完成了这个zip任务,效果非常好:

def dir = new File("${projectDir.parentFile}/test/")

task testZip(type: Zip) {
    from dir
    destinationDirectory = dir
    include 'toast/**'

    archiveFileName = 'test.zip'
}
但是当我把include属性设置为懒惰时,因为我需要在我的实际情况中这样做

def dir = new File("${projectDir.parentFile}/test/")

task testZip(type: Zip) {
    from dir
    destinationDirectory = dir
    include {
        'toast/**'
    }

    archiveFileName = 'test.zip'
}
然后,它创建一个包含文件夹中所有内容的zip,因此生成的归档文件也是如此。在这个测试用例中,内部zip被破坏了,它不会无限地运行,但在现实世界中,它确实会生成一个无限的zip。不知道为什么,也许我最好的案例文件太少或太小。无论测试用例以哪种方式显示问题,生成的zip都包含一个zip,即使它应该只包含toast目录及其所有内容

我该如何解决这个问题?我需要一个惰性包含,因为我要包含的目录是由其他任务计算的。我得到完全相同的问题与焦油除了它拒绝创建档案,因为它包括自己

使用exclude“*.zip”是一个愚蠢的解决方法,它会使归档文件包含我不想要的其他文件夹。我只想包括一个特定的文件夹,lazyly

下面是真实世界中怪物的样子。我基本上需要从Java检索项目的版本,然后使用该版本命名我正在打包的文件夹。制作一个libGDX游戏并使用jre打包。有问题的任务是“makeArchive”+平台

我该如何解决这个问题?我需要一个惰性包含,因为我要包含的目录是由其他任务计算的。我得到完全相同的问题与焦油除了它拒绝创建档案,因为它包括自己

您可以通过使用doFirst方法并使用传递的操作修改tasks属性来获得所需的内容

task('makeArchive_' + platform, type: Zip) {
    if(platform.contains("win"))
        dependsOn setWindowsIcons
    dependsOn fetchVersion
    dependsOn 'packr_' + platform

    from packrDir
    destinationDirectory = packrDir

    archiveFileName = provider {
        platformRawName.replace("%%VERSION%%", jumpaiVersion) + ".zip"
    }

    doFirst {
        def includeDir = platformRawName.replace("%%VERSION%%", jumpaiVersion)
        // Include only files and directories from 'includeDir'
        include {
            it.relativePath.segments[ 0 ].equalsIgnoreCase(includeDir)
        }
    }
}

请也看看这个类似的问题。我的解决方案只是一个变通办法。若您在配置阶段了解自己的版本,那个么您可以更轻松地实现您想要的。编写自己的自定义任务或插件也有助于清理构建脚本。

非常感谢!
task('makeArchive_' + platform, type: Zip) {
    if(platform.contains("win"))
        dependsOn setWindowsIcons
    dependsOn fetchVersion
    dependsOn 'packr_' + platform

    from packrDir
    destinationDirectory = packrDir

    archiveFileName = provider {
        platformRawName.replace("%%VERSION%%", jumpaiVersion) + ".zip"
    }

    doFirst {
        def includeDir = platformRawName.replace("%%VERSION%%", jumpaiVersion)
        // Include only files and directories from 'includeDir'
        include {
            it.relativePath.segments[ 0 ].equalsIgnoreCase(includeDir)
        }
    }
}