我有一个包含多个属性的属性文件。多个对多个(我们的)产品有效,有些仅对一种产品有效(无法通过属性名称区分)。因此,在一个产品的基于 ANT 的构建过程中,我想将包含所有属性的原始文件复制到特定于产品的文件,从而跳过适用于其他产品的部分。我可以想象使用一些开始和结束标记,例如
foo.bar=hello
# begin-product1
foo.bazz=world
# end-product1
# begin-product2
woohoo.bart=bla-bla
# end-product2
对于产品 1,我想要获取文件
foo.bar=hello
foo.bazz=world
对于产品 2
foo.bar=hello
woohoo.bart=bla-bla
ANT 可以实现类似的功能吗?还是我应该编写自己的 Java 帮助器类?
最佳答案
您也许可以将其用作“vanilla Ant”起点,并进行调整以满足您的需求。
此处假设您希望一次处理一个产品,并给定产品编号,将该产品的属性加载到当前版本中。
该方法是实现 macro就是这样做的。提供的属性是属性文件名称和产品编号。该宏读取文件两次,提取公共(public)部分,然后提取产品特定部分,然后将它们连接起来并作为 Ant 属性加载。
您可以调整此宏,例如获取产品所需的文件片段并写出特定于产品的属性文件(使用 Ant <echo>
任务)。如果需要,分隔各个部分的字符串也可以抽象为宏的属性或参数。在示例中,我已将开始/结束标记包含在传递到 <loadproperties>
的产品特定字符串中。任务。
<macrodef name="loadProductProperties">
<attribute name="propertiesFile" />
<attribute name="product" />
<sequential>
<local name="config.common" />
<local name="config.product" />
<loadfile property="config.common" srcFile="@{propertiesFile}">
<filterchain>
<tokenfilter>
<filetokenizer/>
<replaceregex pattern="^(.*?)# begin-product.*" replace="\1" flags="s" />
</tokenfilter>
</filterchain>
</loadfile>
<loadfile property="config.product" srcFile="props.txt">
<filterchain>
<tokenfilter>
<filetokenizer/>
<replaceregex
pattern="^.*(# begin-product@{product}\b.*?# end-product@{product}\b).*"
replace="\1" flags="s" />
</tokenfilter>
</filterchain>
</loadfile>
<loadproperties>
<string value="${config.common}${config.product}" />
</loadproperties>
</sequential>
</macrodef>
<loadProductProperties propertiesFile="props.txt" product="2" />
关于java - ANT:复制文本文件的某些部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41116723/