使用 Ant build 在 xml 中替换 value/version/date 的占位符

Placeholder for value/version/date replacement in xml using Ant build

我有 30 多个 odx-d 文件(odx-d 只是 xml 具有不同扩展名的文件)。 所有文件都有共同的标签:

<DOC-REVISION>
    <REVISION-LABEL>01.02.03-04</REVISION-LABEL>
    <STATE>RELEASE</STATE>
    <DATE>2018-11-14T16:26:00+01:00</DATE>
</DOC-REVISION>

在每次发布时,我都需要更改所有文件中的这些值。

注意:使用 Java 进行操作是不可能的,因为构建时只是对所有这些文件进行压缩,而不是使用 Java 来操作这些文件。

请建议一种方法来拥有一个文件(您建议的任何文件类型),我可以在其中拥有所有这些文件中标签的这些值和占位符。

谢谢!

这可以通过以下步骤实现:

  1. 用占位符替换常用标签值,例如@revision@, @state@@date@

  2. 将每个文件复制到临时位置

  3. 使用具有嵌套 <replacefilter .../> 元素的 <replace file="${dest.file}"> 任务在复制的文件中执行替换

  4. 将转换后的文件压缩到临时位置

例如,使用这样的模板文件"template.xml":

<DOC-REVISION>
    <REVISION-LABEL>@revision@</REVISION-LABEL>
    <STATE>@state@</STATE>
    <DATE>@date@</DATE>
</DOC-REVISION>

您可以使用此 ant 目标设置实际值(跳过 zip 部分):

  <target name="test">
    <property name="my.revision" value="01.02.03-04"/>
    <property name="my.state" value="RELEASE"/>
    <tstamp>
      <format property="my.date" pattern="yyyy-MM-dd hh:mm z"/>
    </tstamp>
    <property name="template.file" value="./template.xml"/>
    <property name="dest.file" value="./doc.odx"/>
    <delete file="${dest.file}" quiet="true"/>
    <copy toFile="${dest.file}" file="${template.file}"/>
    <replace file="${dest.file}">
      <replacefilter token="@revision@" value="${my.revision}"/>
      <replacefilter token="@state@" value="${my.state}"/>
      <replacefilter token="@date@" value="${my.date}"/>
    </replace>
  </target>

多个文件的解决方案。

  1. 用占位符@revision@、@state@、@date@替换值并放入模板文件夹。

  2. 使用filterset从模板到目标目录执行复制操作。

示例: 模板目录:'fromDir',目标:'toDir'

1) 模板文件:

<DOC-REVISION>
    <REVISION-LABEL>@revision@</REVISION-LABEL>
    <STATE>@state@</STATE>
    <DATE>@date@</DATE>
</DOC-REVISION>

2) 声明属性并执行测试目标操作。

<!-- Properties -->
<property name="version" value="01.02.03-04" />
<property name="state" value="RELEASE" />
<tstamp>
    <format property="now" pattern="yyyy-MM-dd'T'HH:mm:ss.SSSXXX"/>
</tstamp>

<!-- Target -->
<target name="test">
    <copy todir="${toDir}">
        <fileset dir="${fromDir}" />
        <filterset>
            <filter token="revision" value="${version}" />
            <filter token="state" value="${state}" />
            <filter token="date" value="${now}" />
        </filterset>
    </copy>
</target>

谢谢!