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
相关产品推荐
相关产品推荐

