Переменная Ant @ не разрешена

Вот мой фрагмент build.xml

<target name="compile">
  <for param="rsync.destination.host" list="${file}" delimiter="${line.separator}">
    <sequential>
    <echo message="${rsync.ssh.user}@@{rsync.destination.host}:${rsync.destination.base.dir}/"/>
    </sequential>
  </for>
</target>

Я получил следующий вывод,

compile:
     [echo] root@{rsync.destination.host}:/tmp/
     [echo] root@{rsync.destination.host}:/tmp/

BUILD SUCCESSFUL
Total time: 0 seconds

Так вот @{rsync.destination.host} переменная не интерпретируется из-за двойного символа @@. Если я поставлю пространство между ними

    <echo message="${rsync.ssh.user}@ @{rsync.destination.host}:${rsync.destination.base.dir}/"/>

тогда переменная разрешается, как и ожидалось.

compile:
     [echo] root@ server1:/tmp/
     [echo] root@ server2:/tmp/

BUILD SUCCESSFUL
Total time: 0 seconds

Так как в имени пользователя и на сервере есть место, будет исключение, если мы выполним здесь ssh. Есть идеи, как решить эту проблему.

2 ответа

Решение

В (основном) муравье нет переменных, но есть свойства и атрибуты. @{foo} - это синтаксис для доступа к значению атрибута macrodef внутри macrodef. Так как antcontrib для задачи использует задачу ant macrodef, она имеет тот же синтаксис.
Попробуйте с:

...
<echo message="${rsync.ssh.user}@@@{rsync.destination.host}:${rsync.destination.base.dir}/"/>
...

означает использовать 3x @ вместо 2x @
Парам @{rsync.destination.host} должен быть замаскирован вторым @, так что на самом деле вам нужно использовать @ 3 раза.

Вы можете поставить буквальный знак в свойстве:

<property name="at" value="@"/>
<echo message="${rsync.ssh.user}${at}@{rsync.destination.host}:${rsync.destination.base.dir}/"/>
Другие вопросы по тегам