回显到文件时,Ant不会创建NL

时间:2012-08-06 22:10:47

标签: windows macos windows-7 file-io ant

我最初有这个:

<echo file="${my.file}"
     message="This is line #1"/>
<echo file="${my.file}"
     append="true"
     message="This is line #2"/>
<echo file="${my.file}"
     append="true"
     message="This is line #3"/>

在我的文件中得到了这个:

 This is line#1This is line #2This is line#3

所以,我试过了:

 <echo file="${my.file}">
     This is line #1
     This is line #2
     This is line #3
 </echo>

得到了:

 This is line#1This is line #2This is line#3

我这样做了:

 <echo file="${my.file}">
     This is line #1${line.separator}
     This is line #2${line.separator}
     This is line #3${line.separator}
 </echo>

得到了:

 This is line#1This is line #2This is line#3

我这样做了:

  <echo file="${my.file}">
     This is line #1&#13;&#10;
     This is line #2&#13;&#10;
     This is line #3&#13;&#10;
 </echo>

得到了:

 This is line#1This is line #2This is line#3

我甚至试过这个:

 <concat destfile="${my.file}">
     This is line #1&#13;&#10;
     This is line #2&#13;&#10;
     This is line #3&#13;&#10;
 </concat>

仍然有:

 This is line#1This is line #2This is line#3

如果我对控制台执行任何操作,则会在不同的行上打印。将它们保存到文件中,并且不会显示这些行。

我在Win7,Ant 1.8上。

有什么想法吗?


Windows Thing?

我在Mac上试过了这些。第一个给了我相同的结果。但是,第二种方式在文件中给了我三行。添加了${line.separator}的第三种方法会跳过每隔一行。第四种方式使用&#13;&10;给了我最后一行^M(毕竟,Mac是Unix,不使用CRLF结尾,只是LF)。

并且,使用<concat>也创建了单独的行。


更多信息

我已将此问题追溯到build.xml文件中的以下代码段:

这与宣传的一样。也就是说,空格和NL显示在生成的文件中:

<target name="package"
    depends="-resolve,compile"
    description="Packaging of the artifact">

    <!-- Build version.txt and let the user figure out how to use it -->
    <mkdir dir="${target.dir}"/>
    <echo file="${version.file}">
        Jenkins Project: ${env.JOB_NAME}
        Jenkins Build Number: ${env.BUILD_NUMBER}
        Build Date: ${build.date}
    </echo>

    <!--
    <antcall target="jar"/>
    <antcall target="war"/>
    <antcall target="ear"/>
    -->
</target>

这不是:

<target name="package"
    depends="-resolve,compile"
    description="Packaging of the artifact">

    <!-- Build version.txt and let the user figure out how to use it -->
    <mkdir dir="${target.dir}"/>
    <echo file="${version.file}">
        Jenkins Project: ${env.JOB_NAME}
        Jenkins Build Number: ${env.BUILD_NUMBER}
        Build Date: ${build.date}
    </echo>

    <antcall target="jar"/>
    <antcall target="war"/>
    <antcall target="ear"/>
</target>

这些片段之间的唯一区别在于我在编写文件后执行了三个<antcall>任务。这三个antcall任务都有一个if子句,因此它们可能会也可能不会根据设置的属性运行。这是我们开发团队的构建模板,所以我真的很想让它工作。

为什么<antcall>会导致问题。顺便说一下,有时候它会破碎,我需要重新打开一个新的控制台窗口才能使NL内容起作用。

之前我遇到过类似的问题,这是一个Windows代码页问题。

2 个答案:

答案 0 :(得分:2)

下面的Ant项目使用echo任务创建了四个文件:

  • echo1.txt
  • echo2.txt
  • echo3.txt
  • echo4.txt

使用Ant 1.8.x在Windows 7上运行项目时,每个文件的十六进制视图如下:

// echo1.txt
// HEX                         // TEXT
6c 69 6e 65 20 23 31           line #1
6c 69 6e 65 20 23 32           line #2
6c 69 6e 65 20 23 33           line #3

// echo2.txt
// HEX                         // TEXT
6c 69 6e 65 20 23 31 0a        line #1  (0a => line feed)
6c 69 6e 65 20 23 32 0a        line #2
6c 69 6e 65 20 23 33 0a        line #3

// echo3.txt
// HEX                         // TEXT
6c 69 6e 65 20 23 31 0d 0a 0a  line #1  (0d => carriage return)
6c 69 6e 65 20 23 32 0d 0a 0a  line #2
6c 69 6e 65 20 23 33 0d 0a 0a  line #3

// echo4.txt
// HEX                         // TEXT
6c 69 6e 65 20 23 31 0d 0a     line #1
6c 69 6e 65 20 23 32 0d 0a     line #2
6c 69 6e 65 20 23 33 0d 0a     line #3

只有echo4.txt [将message属性中的所有三行分隔为${line.separator}]才会生成以Windows结尾的正确行(回车符+换行符)。在记事本中编辑项目文件(使用回车符+换行符)以及保留Unix行结尾(单行换行)的编辑器时,输出相同。看来,当Ant解析XML文件时,行结尾被标准化为单个换行符。

Ant Project

<?xml version="1.0" encoding="UTF-8"?>
<project name="echo-project" basedir="." default="echo-all">

  <target name="echo-test1">
    <property name="echo1.file" location="${basedir}/echo1.txt" />
    <echo file="${echo1.file}" message="line #1" />
    <echo file="${echo1.file}" message="line #2" append="true" />
    <echo file="${echo1.file}" message="line #3" append="true" />
  </target>

  <target name="echo-test2">
    <property name="echo2.file" location="${basedir}/echo2.txt" />
    <echo file="${echo2.file}">line #1
line #2
line #3
</echo>
  </target>

  <target name="echo-test3">
    <property name="echo3.file" location="${basedir}/echo3.txt" />
    <echo file="${echo3.file}">line #1${line.separator}
line #2${line.separator}
line #3${line.separator}
</echo>
  </target>

  <target name="echo-test4">
    <property name="echo4.file" location="${basedir}/echo4.txt" />
    <echo file="${echo4.file}" message=
"line #1${line.separator}line #2${line.separator}line #3${line.separator}" />
  </target>

  <target name="echo-all"
      depends="echo-test1, echo-test2, echo-test3, echo-test4" />
</project>

答案 1 :(得分:1)

您是否尝试\n作为换行符?