如何配置Gradle构建缓存统一文件换行符解决跨平台缓存失效
解决Gradle跨Windows/Linux构建缓存因资源文件换行符失效的问题
针对资源文件(如logback-spring.xml)因换行符差异导致跨平台构建缓存失效的问题,有以下几种可行方案:
方案1:在Gradle资源处理任务中统一换行符
直接在构建脚本中配置processResources或processTestResources任务,对资源文件进行换行符归一化处理,确保无论源文件换行符是什么,构建时都统一为LF(Linux风格)。
以Kotlin DSL(build.gradle.kts)为例:
tasks.withType<ProcessResources> { filesMatching("**/*.xml") { filter { line -> line.replace("\r\n", "\n") } } // 可根据需要添加其他资源文件类型,如.properties、.yml等 filesMatching("**/*.properties") { filter { line -> line.replace("\r\n", "\n") } } } // 如果测试资源也有同样问题,单独配置processTestResources tasks.withType<ProcessTestResources> { filesMatching("**/*.xml") { filter { line -> line.replace("\r\n", "\n") } } }
或者使用Ant的fixcrlf任务更高效:
tasks.withType<ProcessResources> { doFirst { ant.withGroovyBuilder { "fixcrlf"( "srcDir" -> sourceSets.main.get().resources.srcDirs, "eol" -> "lf", "includes" -> "**/*.xml,**/*.properties", "fixlast" -> true ) } } }
方案2:通过Git统一项目文件换行符(从根源解决)
配置项目的.gitattributes文件,强制Git对所有文本类资源文件使用LF换行符,这样无论在Windows还是Linux环境拉取代码,文件都会保持LF格式,从根源避免换行符差异。
在项目根目录创建.gitattributes文件,添加内容:
# 强制所有XML、properties等资源文件使用LF *.xml text eol=lf *.properties text eol=lf *.yml text eol=lf *.yaml text eol=lf # Kotlin/Java源码保持默认自动转换(Gradle本身已处理,但统一更好) *.kt text eol=lf *.java text eol=lf
配置后,Git会在提交时自动将Windows的CRLF转换为LF,拉取时在Windows环境也会保持LF(如果需要兼容旧工具,也可以用text=auto eol=lf,自动识别文本文件并统一为LF)。
方案3:自定义Gradle输入哈希计算规则
如果不想修改文件内容,可以自定义Gradle对特定资源文件的哈希计算逻辑,在计算哈希前先归一化换行符。
示例代码(Kotlin DSL):
tasks.named<ProcessTestResources>("processTestResources") { inputs.files(sourceSets.test.get().resources).withPropertyName("testResources") .withPathSensitivity(PathSensitivity.RELATIVE) .withNormalizer( object : InputNormalizer { override fun normalize(input: File): InputStream { return if (input.name.endsWith(".xml")) { BufferedReader(InputStreamReader(FileInputStream(input))).use { reader -> StringWriter().apply { reader.forEachLine { line -> write(line) write("\n") } }.toString().byteInputStream() } } else { FileInputStream(input) } } } ) }
这个方法不会修改源文件,只是在计算任务输入哈希时对换行符做归一化,适合不能修改源文件的场景。
内容的提问来源于stack exchange,提问作者jpennell
相关产品推荐
相关产品推荐

