Ant中fixcrlf任务includes/exclude参数不生效问题求助
解决Ant fixcrlf任务在filterchain中无法正确过滤文件的问题
我一眼就看出你的配置里的核心问题了:你把独立<fixcrlf>任务的参数用到了filterchain里的<fixcrlf>元素上,这两个的参数支持完全不一样!
问题根源
当<fixcrlf>作为filterchain的一部分使用时,它并不支持srcdir、includes、excludes这些属性——这些属性只属于单独执行的<fixcrlf>任务。你现在的配置里,filterchain里的<fixcrlf>会处理所有通过copy任务的文件(也就是两个fileset里排除了.bak的所有文件),完全忽略你写的includes/excludes规则,这就导致二进制文件也被修改损坏了。
另外,你用ant -verbose/-debug看不到fixcrlf的单独日志,是因为它作为filterchain的组件运行,日志会合并在copy任务的输出里,你得仔细看copy任务处理每个文件的细节才能看到相关信息。
正确的配置方案
你需要在fileset层面控制哪些文件要经过fixcrlf转换,哪些直接复制。这里有两种靠谱的方式:
方式1:拆分copy任务,分别处理不同类型文件
把需要转换换行符的文件(.sh、.properties)和不需要的(.xml、二进制文件)分开执行copy,只有前者应用fixcrlf的filterchain:
<!-- 处理需要转换换行符的文件:sh和properties --> <copy todir="target"> <fileset dir="source1"> <include name="**/*.sh"/> <include name="**/*.properties"/> <exclude name="**/*.bak"/> </fileset> <fileset dir="source2"> <include name="**/*.sh"/> <include name="**/*.properties"/> <exclude name="**/*.bak"/> </fileset> <filterchain> <fixcrlf eol="lf"/> </filterchain> </copy> <!-- 单独复制不需要转换的文件:xml等,不应用filterchain --> <copy todir="target"> <fileset dir="source1"> <include name="**/*.xml"/> <exclude name="**/*.bak"/> </fileset> <fileset dir="source2"> <include name="**/*.xml"/> <exclude name="**/*.bak"/> </fileset> </copy>
方式2:在同一个copy任务里用多fileset区分处理
如果你想把逻辑放在一个copy任务里,可以通过多fileset分别定义需要转换和不需要转换的文件:
<copy todir="target"> <!-- 只包含需要转换的文件,应用fixcrlf --> <fileset dir="source1"> <include name="**/*.sh"/> <include name="**/*.properties"/> <exclude name="**/*.bak"/> <exclude name="**/*.xml"/> </fileset> <fileset dir="source2"> <include name="**/*.sh"/> <include name="**/*.properties"/> <exclude name="**/*.bak"/> <exclude name="**/*.xml"/> </fileset> <!-- 复制不需要转换的文件,不经过filterchain处理 --> <fileset dir="source1"> <include name="**/*.xml"/> <exclude name="**/*.bak"/> </fileset> <fileset dir="source2"> <include name="**/*.xml"/> <exclude name="**/*.bak"/> </fileset> <filterchain> <fixcrlf eol="lf"/> </filterchain> </copy>
关键注意事项
- 一定要确保二进制文件不会被包含在经过fixcrlf的fileset里,否则换行符转换会损坏文件内容。如果有二进制文件,记得在fileset里明确排除它们(比如
<exclude name="**/*.bin"/>之类的)。 - 如果你想使用独立的
<fixcrlf>任务(而不是作为filterchain的一部分),那才需要srcdir、includes、excludes参数,比如:
<fixcrlf srcdir="target" includes="**/*.sh,**/*.properties" excludes="**/*.xml" eol="lf"/>
这种方式是直接修改目标目录里的文件,不需要结合copy任务,你可以根据自己的需求选择。
内容的提问来源于stack exchange,提问作者armagedescu
相关产品推荐
相关产品推荐

