Gradle多项目模块中processResources扩展问题:跨模块使用filesMatching获取project.version返回null的排查
问题分析与解决方案:跨模块Gradle资源处理的filesMatching限制
你的怀疑完全正确——filesMatching确实无法匹配其他模块中的文件,这是由Gradle模块任务的作用范围决定的,我来帮你拆解清楚:
核心原因
每个Gradle模块的processResources任务,默认只负责处理当前模块内的资源文件(比如src/main/resources目录下的内容),不会主动扫描或处理其他模块的文件。你在project2的脚本里写的processResources,只会盯着project2自己的资源目录,根本看不到project1里的MyConfiguration.kt。
两种写法的差异
- 第一种写法里,你用
filesMatching("**/MyConfiguration.kt")指定了匹配规则,但因为文件不在project2的资源范围内,这个规则找不到任何文件,变量替换操作根本没执行,所以最终拿到的版本值是null。 - 修改为直接调用
expand(props)后,Gradle会对project2的processResources任务管辖的所有资源文件执行变量替换,这时候能拿到正确版本,要么是project2自己的某个文件需要替换版本,要么是你的项目构建流程中存在特殊配置,让project2的任务间接处理了相关内容,但本质上和project1的那个文件无关。
正确的解决方案
如果要处理project1里的MyConfiguration.kt,你需要把这段配置写到project1的Gradle脚本里,而不是project2中。比如:
processResources { // 这里可以根据需求获取版本:如果是根项目版本用rootProject.version,要是project2的版本就用project(':project2').version def props = ['version': rootProject.version] filesMatching("**/MyConfiguration.kt") { expand(props) } }
这样就能精准匹配到project1中的目标文件,完成版本变量的替换。
内容的提问来源于stack exchange,提问作者khXien
相关产品推荐
相关产品推荐

