Ant: условное копирование
Я хочу перезаписать файл hosts на компьютере под управлением Windows, если пользователь разрешает его:
<input message="Do you want to overwrite the HOSTS file?"
addproperty="overwrite.hosts" validargs="yes,no" />
<copy tofile="${env.WINDIR}/system32/drivers/etc/hosts.backup">
<fileset file="${env.WINDIR}/system32/drivers/etc/hosts" />
</copy>
<copy todir="${env.WINDIR}/system32/drivers/etc">
<fileset file="${trainer.dir}/hosts" />
</copy>
Как сделать копии только в том случае, если пользователь говорит "да"?
EDIT:
Я пробовал это:
<input message="Do you want to overwrite the HOSTS file?" addproperty="overwrite.hosts" validargs="yes,no" />
<if>
<equals arg1="${overwrite.hosts}" arg2="yes" />
<then>
<copy tofile="${env.windir}/system32/drivers/etc/hosts.backup">
<fileset file="${env.windir}/system32/drivers/etc/hosts">
</fileset>
</copy>
<copy todir="${env.windir}/system32/drivers/etc">
<fileset file="${trainer.dir}/hosts">
</fileset>
</copy>
</then>
</if>
и я получаю этот вывод:
C:\trainer\build.xml:16: Problem: failed to create task or type if
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place.
Я новичок ant... Что мне нужно сделать?
Ответы
Ответ 1
Вы можете использовать параметр "if" для цели, чтобы сделать его условным для устанавливаемого свойства.
Я никогда не использовал задачу "ввода" - я не знал, что она существует до сих пор (спасибо за головы!), но быстрый просмотр документации указывает, что она задает именованное свойство введенное значение, т.е. после "ввода" свойство всегда задано. Поэтому, я думаю, вам понадобится "условие", чтобы проверить значение и установить или не установить другое свойство.
Что-то вроде этого. Я только что проверил быстрый тест, и это действительно работает. А именно, если вы ответите на вопрос "y", он распечатает сообщение, и если вы ответите "n", это не так.
<project name="test" default="do.whatever">
<target name="decide.do.whatever">
<input message="So you wanna do this or not?" validargs="y,n" addproperty="wanna"/>
<condition property="wanna.yes">
<equals arg1="${wanna}" arg2="y"/>
</condition>
</target>
<target name="do.whatever" depends="decide.do.whatever" if="wanna.yes">
<echo message="Yeah he wannas."/>
</target>
</project>
Ответ 2
Вы можете использовать condition
или if
task для этого. (Последний является частью проекта ant-contrib.)