2010-02-22 2 views
0

Я хотел бы установить некоторые свойства в файле сборки муравьев, имена которых основаны на свойствах ant. В частности, я хотел бы задать свойство, как:Valid <property> names in Ant

<property name="${ant.project.name}.compiled" value="true" /> 

Однако, когда я попытался это за $ {} ant.project.home часть не была расширена.

Возможно ли использовать свойства свойств как имена других свойств, и если да, то как?

+0

вопрос отредактирован, чтобы правильно избежать xml – avjaz

ответ

0

Я думаю, что единственный способ - отбросить ваши значения в файл .properties, а затем загрузить их обратно. Однако вы должны спросить себя, действительно ли вам это нужно; когда я последний раз использовал муравей, я пытался сделать то же самое, но пришел к выводу, что мне действительно не нужно.

Является

$ ant.project.home.compiled

не столь же полезным?

+0

к сожалению $ ant.project.home.compiled, вероятно, не будет полезен для меня.Мне просто нужно установить флаг, который был скомпилирован проектом (имя которого я не знаю заранее), поэтому я могу избежать накладных расходов на его компиляцию – avjaz

+0

Ant достаточно интеллектуальный, чтобы не перекомпилировать файлы. Он проверяет даты в источниках и сравнивает их с классами и только при необходимости перекомпилирует. –

0

Это может быть сделано, немного уродливо. Для этого вам нужна задача < propertycopy> от ant-contrib. Ниже приведен пример

<property name="projectNameCompiled" value="${ant.project.name}.compiled" /> 
<property name="${projectNameCompiled}" value="true" /> 
<propertycopy property="final" from="${ant.project.name}.compiled" /> 

свойство Окончательный содержит значение истинно.

2
<property name="name.holder" value="iamholder" /> 
<property name="${name.holder}.flag" value="true" /> 
<echoproperties></echoproperties> 

результат:

[echoproperties] iamholder.flag=true 

это, безусловно, действует муравей код и свойство iamholder.flag получает значение истина. Если $ {name.holder} не расширяется, значит, он еще не установлен (например, если первая строка в моем примере отсутствовала). В любом случае, это все еще не совсем решает вашу проблему, так как у вас практически нет возможности получить значение этого свойства, поскольку вы не знаете его имя, и вы не можете сделать вложенное решение в чистом муравье. В зависимости от того, что вы пытаетесь сделать, все равно может быть полезно для вас. Это одна будет работать (имейте в виду, что до 1.8 значение не имеет значения до тех пор, как свойство установлено):

<target name="compile_stuff" unless="${name.holder}.flag"> 
    <echo>compiling...</echo> 
</target> 

Чтобы действительно получить значение такого свойства вы должны использовать propertycopy АНТ-вно в как предложено в одном из ответов. Таким образом, вы можете получить значение в свойстве, имя которого вы знаете. Просто убедитесь, что вы сделали трюк перед использованием, и установите параметр переопределить в true (ваше сообщение подразумевает, что вы будете устанавливать больше таких свойств, но без переопределения ваше окончательное свойство не может быть изменено). Другим вариантом для работы с такими свойствами является использование макросов ant.

0

Есть несколько способов достижения этой цели, см Ant FAQ
Одно из возможных решений с помощью macrodef имитирует/задачу propertycopy antcontrib но не нуждается в каких-либо внешних библиотек.