ANT“替换”任务不扩展“replacetoken”标记中的属性

时间:2012-06-14 06:56:45

标签: ant replace

构建之后,我需要修改一个HTML文件,指向客户端下载新应用程序。

我搜索一个令牌;用链接和令牌替换它:

<replace file="index.html" >

    <!-- this searches for literal text ${MyTOKEN} -->
    <!-- does not "expand" ${MyTOKEN} before searching -->
    <replacetoken>${MyTOKEN}</replacetoken>

    <replacevalue>"some link" <br> ${MyTOKEN}</replacevalue>
</replace>

此代码无法移动到模板构建脚本中,因为replacetokenreplacevalue标记将文本视为文字 - 它们在我的ANT版本中不expandproperties

我想使用属性来定义"some link"MyTOKEN值。


"some link"中使用属性的解决方法是使用filterchain并在替换后复制文件:

<copy file="index.html" tofile="index2.html" >
    <filterchain>
        <!-- this converts the ${xxx} properties into their values -->
        <expandproperties />
    </filterchain>
</copy>

但是在replace完成之后仍然有效 - 这意味着我仍然需要将MyTOKEN值直接硬编码到构建脚本中。

  • 我想在构建脚本的之外定义我的令牌,在构建脚本中引用
  • 我该怎么做?

更新:我应该使用replacecopyfilterreader创建自己的filterchain任务吗?我并没有真正理解这种方法,但看起来就是这样。


根据已接受的答案更新扩展:我最初使用的是<replacetoken>&amp; <replacevalue>方法,因为我需要跨越多行的值。

使用token&amp; value,我无法找到换行的方法。

放置换行符的解决方案是使用${line.separator}作为换行符。请参阅Echo Task上的文档。

另外,这是一个更有用(非主题)ANT属性的页面:Built-in Ant Properties

2 个答案:

答案 0 :(得分:8)

使用tokenvalue属性可以在此处运行。这适用于Ant 1.7.1:

build.properties

token=FOO
tokval=some ${token}

的build.xml

<project>
  <property file="build.properties" />
  <target name="repl">
    <replace file="test.txt" token="${token}" value="${tokval}" />
  </target>
</project>

希望有所帮助。

答案 1 :(得分:0)

您可以使用需要执行属性的标记进行多行替换:@__relative_url_to_doc_root__@

     <replace dir="${dir_build_docs_javadoc}">
        <replacetoken><![CDATA[</head>]]></replacetoken>
       <replacevalue><![CDATA[<meta name="viewport" content="width=device-width"/>
<!-- Required for syntax highlighting (1/2)...START -->
  <script type="text/javascript" src="@__relative_url_to_doc_root__@resources/shCore.js"></script>
  <link href="@__relative_url_to_doc_root__@resources/shCore.css" rel="stylesheet" type="text/css"/>
  <link href="@__relative_url_to_doc_root__@resources/shThemeDefault.css" rel="stylesheet" type="text/css"/>
  <script type="text/javascript" src="@__relative_url_to_doc_root__@resources/shBrushJava.js"></script>
<!-- Required for syntax highlighting (1/2)...END -->
</HEAD>]]></replacevalue>
     </replace>

然后为属性运行另一个单行替换:

<target name="-replace_all_javadoc_headers">
   <antcall target="-javadoc_replace_headers_in_one_dir">
     <param name="directory_to_replace" value="${dir_build_docs_javadoc}"/>
     <param name="relative_url_to_doc_root" value=""/>
   </antcall>
   <antcall target="-javadoc_replace_headers_in_one_dir">
     <param name="directory_to_replace" value="${dir_build_docs_javadoc}${cg_xbn_codelet}"/>
     <param name="relative_url_to_doc_root" value="../../../../"/>
   </antcall>
   <antcall target="-javadoc_replace_headers_in_one_dir">
     <param name="directory_to_replace" value="${dir_build_docs_javadoc}${cg_xbn_codelet}type${fs}"/>
     <param name="relative_url_to_doc_root" value="../../../../../"/>
   </antcall>
   <antcall target="-javadoc_replace_headers_in_one_dir">
     <param name="directory_to_replace" value="${dir_build_docs_javadoc}${cg_xbn_codelet}taglet${fs}"/>
     <param name="relative_url_to_doc_root" value="../../../../../"/>
   </antcall>
</target>

<target name="-javadoc_replace_headers_in_one_dir">
  <replace dir="${directory_to_replace}" 
        token="@__relative_url_to_doc_root__@" 
        value="${relative_url_to_doc_root}">
     <include name="*.html"/>
  </replace>