如何在Gradle中过滤单个资源(类Maven的filter功能)
解决Gradle仅过滤单个资源文件的问题
要实现只对version.properties执行变量替换,同时保留其他资源文件的正常复制(不触发模板替换),可以通过拆分processResources的文件处理逻辑来实现,以下是两种可行的配置方案:
方案一:拆分资源处理规则
通过exclude先排除需要过滤的文件,再单独引入该文件并应用expand操作,确保其他资源不受影响:
tasks { processResources { // 排除需要单独处理的文件,避免被默认规则处理 exclude 'version.properties' // 单独引入目标文件并执行变量替换 from(sourceSets.main.resources.srcDirs) { include 'version.properties' expand(project_version: project.version) } } }
如果version.properties在子目录下(比如META-INF/version.properties),只需调整include和exclude的路径即可。
方案二:按文件名动态处理
通过eachFile遍历所有资源文件,仅对目标文件名执行expand操作:
tasks { processResources { eachFile { fileDetails -> if (fileDetails.name == 'version.properties') { // 仅对目标文件应用变量替换 expand(project_version: project.version) } // 其他文件不做模板替换,保持原内容复制 } } }
原理说明
这两种方案都避免了Gradle默认对所有资源文件应用expand模板处理器,只会对指定的version.properties执行变量替换,其他包含$xxx格式的文件会直接复制,不会触发不存在变量的报错。
内容的提问来源于stack exchange,提问作者oldpotentialnews
相关产品推荐
相关产品推荐

