You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle Zip任务修改后无法生成归档问题求助

Gradle多目标构建归档任务NO-SOURCE问题排查与解决

背景

基于Gradle 6.9实现多目标库构建,通过专用插件统一所有项目的配置语法。原有针对特定目标的制品归档逻辑正常运行,现需重构为通用配置。

原有正常代码

tasks.create(zipTaskName, Zip) {
    archiveName "${artifactName}_${targetId}.zip"
    into("${artifactName}/${targetId}") {
        from "${artifactDir}"
        // TODO: use pattern from config file
        include "*_${targetId}.zip.checksum"
        include "*_${targetId}.lib"
    }
    into("${artifactName}/inc") {
        from "${includeDir}"
    }
}

重构后出现问题的代码

重构为通过集合遍历生成include规则后,任务执行时日志提示NO-SOURCE,归档文件无法生成:

tasks.create(zipTaskName, Zip) {
    archiveName "${artifactName}_${targetId}.zip"
    into("${artifactName}/${targetId}") {
        from "${artifactDir}"
        // 后续将通过配置变量替换这个集合
        ['*_${targetId}.lib', '*_${targetId}.zip.checksum'].each { includeArtifact ->
            include "${includeArtifact.replace('.', '_${targetId}.')}"
        }
    }
    into("${artifactName}/inc") {
        from "${includeDir}"
    }
}

问题疑问

明明${includeDir}目录下存在文件,为何任务提示无源码?

问题原因与解决方法

问题出在第二个into块的文件收集逻辑:Gradle的CopySpec(Zip任务基于该接口)中,若未显式指定include规则,在部分场景下(如任务内其他CopySpec使用动态生成的include规则时),默认的全量包含规则(**/*)可能未生效,导致无法匹配到${includeDir}下的文件。

添加显式的include "**/*"规则即可解决该问题,确保${includeDir}下所有文件被纳入归档:

tasks.create(zipTaskName, Zip) {
    archiveName "${artifactName}_${targetId}.zip"
    into("${artifactName}/${targetId}") {
        from "${artifactDir}"
        // 后续将通过配置变量替换这个集合
        ['*_${targetId}.lib', '*_${targetId}.zip.checksum'].each { includeArtifact ->
            def artifactPattern = includeArtifact.replace(".", "_${targetId}.")
            include "${artifactPattern}"
        }
    }
    into("${artifactName}/inc") {
        from "${includeDir}"
        include "**/*"
    }
}

内容的提问来源于stack exchange,提问作者stromfinger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 08:05:28