【问题标题】:Filter newline from exec output with Ant使用 Ant 从 exec 输出中过滤换行符
【发布时间】:2026-02-05 09:55:02
【问题描述】:

我们的项目有一个庞大而古老的 Ant 构建文件。

几天前,其中一个靶子坏了。它调用svnversion 并将版本写入.java 文件。突然字符串中出现换行符,编译器报错,原因是:

String version = "Foo
 bar";

我几乎没有使用 Ant 的经验,而且我很难理解文档。我认为某种“过滤器链”可以解决问题,但我无法让它发挥作用。

这里是构建目标:

<target name="svnversion">
  <exec executable="svnversion" dir="${basedir}" outputproperty="svnversion">
    <arg value="${basedir}"/>
    <arg value="/dev/projects/${project.name}/trunk/"/>
  </exec>
<echo message="svnversion ${svnversion}"/>

它在 Windows 上运行。我只是想用任何内容替换任何“\n”或“\n\r”。

奇怪的是,如果我在 cmd 中手动运行svnversion,我在输出中看不到换行符...

【问题讨论】:

    标签: svn ant


    【解决方案1】:
    svnversion --help
    ...
    Valid options:
      -n [--no-newline]        : do not output the trailing newline
    

    只需将-n 添加到命令行选项

    【讨论】:

    • 已接受答案 bc。简单,容易,使用正确的工具。无需通过一些复杂的 Ant 标记。 10/10 会再问一次;)
    【解决方案2】:

    一种通用的方法是使用loadresource 根据更改后的 exec 输出属性 f.e. 创建一个新属性。 :

    <loadresource property="foo">
     <propertyresource name="svnversion"/>
     <filterchain>
      <striplinebreaks/>
     </filterchain>
    </loadresource>
    
    <!-- new property foo without linebreak -->
    <echo>$${foo} => ${foo}</echo>
    

    【讨论】: