2016-12-13 2 views
1

У меня есть файл свойств, который содержит несколько свойств. Несколько действительны для нескольких (наших) продуктов, некоторые только для одного продукта (не различимые по имени свойства). Следовательно, во время процесса сборки на основе ANT для одного продукта я хочу скопировать исходный файл, содержащий все свойства, в файл продукта, пропускающий разделы, относящиеся к другим продуктам. Я могу представить, как использовать маркеры начала и конца, например.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 вспомогательный класс ?

+0

Проверьте, что это полезно - https://ant.apache.org/manual/Types/filterchain.html#prefixlines – Rao

+0

Я уже проверил FilterChain, тоже, но я не мог найти что-нибудь полезное для эта операция. –

ответ

1

Возможно, вы сможете использовать это как отправную точку «vanilla Ant» и настроить в соответствии с вашими потребностями.

Предполагается, что вы хотите обрабатывать один продукт за раз и задавать номер продукта, загружать свойства этого продукта в текущую сборку.

Подход заключается в реализации macro, который делает это. Приведенными атрибутами являются имя файла свойств и номер продукта. Макрос читает файл, дважды извлекающий общую часть, а затем часть, относящуюся к конкретному продукту, затем конкатенируется и загружается как свойства Ant.

Вы можете адаптировать этот макрос, например, для получения фрагментов файла, необходимых для продукта, и выписать файл свойств продукта (используя задачу Ant <echo>). Строки, разделяющие различные разделы, также могут быть абстрагированы по свойствам или параметрам макроса, если это необходимо. В примере я включил маркеры begin/end в строку, специфичную для продукта, переданную в задание <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="^.*(# [email protected]{product}\b.*?# [email protected]{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" /> 
Смежные вопросы