ANT使用具有属性的文件替换指定文件中的字符串

ANT使用具有属性的文件替换指定文件中的字符串,ant,properties,replace,Ant,Properties,Replace,我在dev.properties文件中有一个属性,它们如下所示: test.url=https://www.example.com/ [...] 在项目文件中有一个标记[[test.url]],我想用它来替换。我只想在dev.properties中定义所有标记并在构建脚本中使用它们,但不需要修改构建脚本,我想在指定的文件(如*.php、*.html等)中替换这些标记 有人能给我一个建议怎么做吗?谢谢。在下面的Ant脚本中,用包含标记化文件的根目录替换src root属性: <projec

我在dev.properties文件中有一个属性,它们如下所示:

test.url=https://www.example.com/
[...]
在项目文件中有一个标记[[test.url]],我想用它来替换。我只想在dev.properties中定义所有标记并在构建脚本中使用它们,但不需要修改构建脚本,我想在指定的文件(如*.php、*.html等)中替换这些标记


有人能给我一个建议怎么做吗?谢谢。

在下面的Ant脚本中,用包含标记化文件的根目录替换
src root
属性:

<project name="ant-replace-tokens-with-copy-task" default="run">
    <target name="run">
        <!-- The <copy> task cannot "self-copy" files. So, for each -->
        <!-- matched file we'll have <copy> read the file, replace the -->
        <!-- tokens, and write the result to a temporary file. Then, we'll -->
        <!-- use the <move> task to replace the original files with the -->
        <!-- modified files. -->
        <property name="src-root" location="src"/>
        <property name="filtered-file.extension" value="*.filtered-file"/>

        <copy todir="${src-root}">
            <fileset dir="${src-root}">
                <include name="**/*.html"/>
                <include name="**/*.php"/>
            </fileset>
            <globmapper from="*" to="${filtered-file.extension}"/>
            <filterchain>
                <filterreader classname="org.apache.tools.ant.filters.ReplaceTokens">
                    <param type="propertiesfile" value="dev.properties"/>
                </filterreader>
            </filterchain>
        </copy>

        <move todir="${src-root}">
            <fileset dir="${src-root}" includes="**"/>
            <globmapper from="${filtered-file.extension}" to="*"/>
        </move>
    </target>
</project>

您指定不希望编辑生成脚本,因此此答案不符合条件,但对其他读者可能仍然有用

如果您愿意编辑目标文件以使用格式${test.url}而不是[[test.url]],那么这将是一个很好的选择。

尝试以下方法:

<copy file="input.txt" tofile="output.txt">
   <filterchain>
   <replaceregex pattern="\$\{" replace="{" />
   <filterreader classname="org.apache.tools.ant.filters.ReplaceTokens">
        <param type="propertiesfile" value="properties.txt"/>
        <param type="tokenchar" name="begintoken" value="{"/>
        <param type="tokenchar" name="endtoken" value="}"/>
    </filterreader>
    </filterchain>
</copy>


在这里成立:

是的,我用过。请看:然而,这可能不是非常优化的方式。如能提出建设性意见,将不胜感激。需要分别指定每个令牌。我在想别的事情。我的意思是,一个文件有一个任务和属性。因此,我可以轻松添加任何属性,而无需更改ant任务。我在文件中的属性存储为:[[My.property]]。我现在做的是:也许有更好的方法。另外,由于注释中的字符数量限制,我无法在此处粘贴代码。这真的很奇怪,限制在很低的数量。请编辑您的问题,并告诉我们您到底在寻找什么。给我们一个尽可能小的例子来说明dev.properties中的内容。给我们举一个可能最小的例子,说明带有标记的*.php文件是什么样子的。将代码板站点上的Ant脚本复制到您的问题中。然后显示替换完成后最终的*.php文件的内容。file dev.properties(或文件名)包含一些必须在源代码文件中替换的属性。dev.properties示例:project.cdn.url=project.cdn.fonts=[…]现在,源代码(不管是html、php还是css;可以是任何文件)可以包含“临时变量”,如示例所示:因此,目标是替换源代码中与指定文件(此处为dev.properties)中编写的属性相匹配的所有“变量”。首先,您应该编辑问题,以明确示例标记类似于[[project.cdn.url]],而不是@test。url@. 是否需要分隔符“[[”和“]]”?我的回答中使用的ReplaceTokens筛选器读取器仅适用于单字符分隔符。“@”是默认值,但“[”和“]”也可以使用。如果无法更改分隔符,请考虑使用将映射属性键的映射。例如,a下的可以将“project.cdn.url”转换为“[[project.cdn.url]]”。问题已经编辑好了。2.分隔符“[]”和“]]”可以替换为“@”。3.让我检查一下你的代码并测试它的工作原理。4.由于字符的限制,我在粘贴代码时遇到了一些问题。此外,我按照StackOverflow的建议使用了4个空格来缩进每一行,但仍然不太好看。我不知道为什么。