Ant Replace任务跨Windows、Mac平台行尾符兼容问题咨询
Ant replace任务跨平台替换失效问题
问题描述
使用Ant的replace任务修改xhtml文件时,MacOS环境下执行构建遇到替换失效问题,最小复现用例如下:
- 测试文本文件为CRLF行尾格式(实际场景中文件从官方提供的zip包解压得到,需保留原始格式),内容如下:
<div> <p>replace this</p> </div>
- 对应
build.xml配置内容如下:
<?xml version="1.0" encoding="UTF-8"?> <project name="test.ant.replace" default="main"> <target name="main"> <replace file="test.txt"> <replacetoken><![CDATA[<div> <p>replace this</p> </div>]]></replacetoken> <replacevalue><![CDATA[<div> <p>with this</p> </div>]]></replacevalue> </replace> </target> </project>
不同平台运行表现:
- Windows环境执行
ant -v运行示例,构建正常,替换操作成功执行 - MacOS环境执行相同命令,替换操作不生效
- 若将测试文件行尾格式修改为LF,MacOS环境可正常运行,但Windows环境替换失败
约束条件:需要同时支持两个平台的开发者运行构建,无法通过FixCRLF任务修改输入测试文件的行尾格式。
解决方法
将replacetoken和replacevalue里的硬换行替换为Ant内置的${line.separator}属性,该属性会在构建执行时自动匹配当前运行环境的行分隔符,无需修改源文件格式即可实现跨平台正常替换。
修改后的配置片段如下:
<replacetoken><![CDATA[<div>]]>${line.separator}<![CDATA[ <p>replace this</p>]]>${line.separator}<![CDATA[ </div>]]></replacetoken> <replacevalue><![CDATA[<div>]]>${line.separator}<![CDATA[ <p>with this</p>]]>${line.separator}<![CDATA[ </div>]]></replacevalue>
实现逻辑:JVM运行时会根据操作系统自动给
${line.separator}赋值,Windows下为\r\n(CRLF),MacOS/Linux下为\n(LF),和Ant读取目标文件时识别的行尾规则完全一致,因此两个平台下都能准确匹配到待替换内容,替换后也不会破坏原文件的行尾格式。
内容的提问来源于stack exchange,提问作者Gordon Little
相关产品推荐
相关产品推荐

