Gradle Copy任务中eachFile不生效无控制台输出问题求助
Gradle Copy任务eachFile不生效排查方案
- 首先排查增量构建跳过问题
Copy任务默认启用增量构建,当输入输出没有变更时,任务会标记为UP-TO-DATE,不会执行复制逻辑,自然无法触发eachFile闭包。
测试方案:执行任务时添加强制重跑参数:
./gradlew <你的updatelight任务名> --rerun-tasks --no-build-cache
也可以在Copy任务配置中临时关闭增量构建验证:
task([ "type": Copy ], taskName) { outputs.upToDateWhen { false } // 其余原有配置 }
- 检查from块是否匹配到有效文件
你当前的eachFile写在单个from的子闭包中,仅对该from匹配到的文件生效。如果对应project.output目录下没有可复制的文件,闭包不会触发。
可以先添加日志确认from块是否加载、对应目录是否有文件:
projectGroups.each { project -> if (!project.isEmpty()) { println "加载项目${project.name}的输出目录: ${project.output.asPath}" println "目录下是否有文件: ${project.output.files.isEmpty()}" from (project.output) { into "cfg/${project.newPath}" eachFile { file -> println " ${file.sourcePath} -> ${file.path}" println '----------------------------------------------' } } } }
- 调整eachFile作用域避免限制
如果需要监听所有复制动作的文件,把eachFile从from子闭包移到Copy任务的根配置下,作用域会覆盖所有来源的文件:
task([ "type": Copy ], taskName) { def projectGroups = (sub + root) def testEnvPath = taskName - 'updatelight' into ("../${testEnvPath}/") // 全局eachFile,所有复制文件都会触发 eachFile { file -> logger.lifecycle(" ${file.sourcePath} -> ${file.path}") logger.lifecycle('----------------------------------------------') } logger.info("Copies user.xml") projectGroups.each { project -> if (!project.isEmpty()) { from (project.output) { into "cfg/${project.newPath}" } } } }
这里建议把println换成logger.lifecycle,属于Gradle默认输出的日志级别,不会被日志过滤规则拦截。
- 最终验证是否有文件被复制
可以在Copy任务末尾加doLast块,确认本次任务是否真的有文件被处理:
doLast { logger.lifecycle("本次任务匹配到的源文件总数: ${source.files.size()}") logger.lifecycle("输出目录路径: ${destinationDir.absolutePath}") }
如果这里输出源文件数为0,说明你的from配置没有匹配到任何文件,需要检查project.output的路径是否正确、是否有生成产物。
内容的提问来源于stack exchange,提问作者AndreasInfo
相关产品推荐
相关产品推荐

