Передача необязательных аргументов пути в ant - PullRequest
3 голосов
/ 25 июля 2011

У меня есть задача ant, которая использует задачу применения для запуска сценария для группы файлов.

У меня есть структура каталогов, похожая на эту: mkdir -p a/{b,c,d,e}/f

Обычно(если я не передаю аргументы), я бы хотел, чтобы ant работал на всех f s.То есть, если я позвонил ant mytask, он должен обработать: a/b/f, a/c/f, a/d/f, a/e/f.Это уже работает с использованием apply и patternsets.

Однако, когда я передаю ему необязательный аргумент, называемый foo, он должен вызывать скрипт только на a/foo/f.

Так что, если я вызвал ant mytask -foo b, он должен обрабатывать только a/b/f, а не остальные.

Я прочитал эту публикацию SO , которая объясняет способы передачи аргументов, и я посмотрел документацию по antотносительно свойств и условных .Но я все еще не могу собрать их вместе таким образом, чтобы это работало.

Кроме того, я не хочу использовать одно из предложений SO, приведенных выше, в котором приводятся такие аргументы:

<arg value="${arg0}"/>
<arg value="${arg1}"/>

Я хочу иметь возможность назвать его как ant mytask -foo valueoffoo для любого произвольного foo.

Спасибо.


Я попробовал предложение Мартина Клейтона ниже, и у меня есть такой код:

<target name="mytask">
  <property name="foo" value="*" />
  <apply executable="perl">
    <arg value="somescript"/>
    <dirset id="them" dir="a">
      <include name="${foo}/*/f" />
    </dirset>
  </apply>
</target>

Вышесказанное делает то, что я хочу.

Примечание 1: В моем реальном коде я использую набор шаблонов вместо dirset, но он должен работать так же.

Примечание2: в моем оригинальном вопросе я сказал, что структура каталога была a/{b,c,d,e}/f.На самом деле все немного сложнее, поэтому * во включенном выше.Я пропустил это в первый раз, потому что это не казалось уместным.

1 Ответ

2 голосов
/ 25 июля 2011

Вы можете сделать это - хотя и с немного другим синтаксисом командной строки - используя свойство 'override'.

Сначала в файле сборки создайте свой набор файлов или dirset из свойства foo, что-токак это:

<property name="foo" value="*" />
<dirset id="them" dir="a">
    <include name="${foo}/f" />
</dirset>

Это даст вам поведение по умолчанию - обработка всех подкаталогов a, которые сами имеют подкаталог f.

Теперь, если вы запустите Ant следующим образом:

ant -Dfoo=d

Будет обработан только каталог a/d/f.

Это работает, потому что свойства Ant не являются изменяемыми - ну, в общем, обычно не так, - поэтому определение командной строки fooпредотвращает использование файла в файле сборки.

...