使用 Ant 构建在 xml 中替换值/版本/日期的占位符

Posted

技术标签:

【中文标题】使用 Ant 构建在 xml 中替换值/版本/日期的占位符【英文标题】:Placeholder for value/version/date replacement in xml using Ant build 【发布时间】:2019-05-15 09:48:10 【问题描述】:

我有 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 来操作这些文件。

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

谢谢!

【问题讨论】:

是否使用了构建工具? 是的,Ant 构建。在 build.xml 我有 目标来压缩所有这些文件以及一些 JAR。 @J_D 请看上面的评论。 蚂蚁目标:&lt;target name="output" depends="a-dist, b-dist"&gt; &lt;zip destfile="$target" update="false" basedir="$dist" /&gt; &lt;/target&gt; Ant 提供了一种编辑属性文件的机制。请查看here。此属性文件可能用于编辑/填充 odx-d 文件。 【参考方案1】:

多文件解决方案。

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

    使用过滤器集执行从模板到目标目录的复制操作。

示例: 模板目录:'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>

谢谢!

【讨论】:

【参考方案2】:

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

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

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

    使用带有嵌套&lt;replacefilter .../&gt; 元素的&lt;replace file="$dest.file"&gt; 任务在复制的文件中执行替换

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

例如,使用这样的模板文件“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>

【讨论】:

谢谢@lolo。有效。 :) 还找到了带有过滤器集的副本的解决方案。

以上是关于使用 Ant 构建在 xml 中替换值/版本/日期的占位符的主要内容,如果未能解决你的问题,请参考以下文章

如何在构建时设置strings.xml值?

用 pom.xml 中的值替换占位符名称

xml命名空间声明:自动替换包名

xml命名空间声明:自动替换包名

如何在 Ant 目标中使用文件大小

使用 Ant 构建已签名和未签名的版本