Создание пустого набора файлов-заполнителей в Ant - PullRequest
7 голосов
/ 26 января 2012

Итак, вот такая ситуация: у меня есть родительский файл сборки, который определяет задачу компиляции, и я хочу, чтобы дочерние файлы сборки могли дополнительно добавлять JAR-файлы (которые могут быть где угодно) в путь к классам, используемый этой задачей компиляции.

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

(Очевидно, есть другие обязательные свойства, которые настраивают исходный каталог и т. Д., Но они не входят в это. Такжепроблема собственно включения / наследования немного сложнее, но, надеюсь, что в простом случае все, что нужно для простого случая, будет работать и в сложном случае.)

У меня есть кое-что, что работает: Задача компиляции вродительский файл сборки ссылается на дополнительный набор файлов зависимостей независимо от:

<target name="compile" depends="init-additional-dependencies">
  <fileset id="global.dependency.fileset" dir="${global.library.directory}">
     <include name="**/*.jar"/>
  </fileset>
  <javac ...>
    <classpath>
      <!-- should be the same for all buildfiles -->
      <fileset refid="global.dependency.fileset"/>

      <!-- should be populated by child buildfiles -->
      <fileset refid="additional.dependency.fileset"/>
    </classpath>
  </javac>
</target>

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

<target name="init-additional-dependencies">
  <!-- override me! -->
  <fileset id="additional.dependency.fileset" dir=".">
    <include name="placeholder.does.not.exist.so.fileset.is.empty"/>
  </fileset>
</target>

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

Ответы [ 2 ]

3 голосов
/ 28 января 2012

Я не думаю, что было много дискуссий по этому поводу, поэтому никакого «соглашения» как такового не существует. То, как работает этот набор файлов, исключает «козырные» включения, таким образом

<fileset refid="additional.dependency.fileset" dir="." excludes="**" />

всегда должно быть пустым. Это кажется немного более предпочтительным как для вашей техники имен файлов-заполнителей, так и для имени каталога-заполнителя и метода erroronmissingdir.

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

<filelist id="additional.dependency.filelist" />

Обобщая, вы можете смешивать наборы файлов и списки файлов, если вы измените свой путь к классу для использования resources:

<filelist id="additional.dependency.resources" />

...

<classpath>
      <!-- should be the same for all buildfiles -->
      <fileset refid="global.dependency.fileset"/>

      <!-- should be populated by child buildfiles -->
      <resources refid="additional.dependency.resources"/>
</classpath>

ссылка additional.dependency.resources может быть либо набором файлов, либо списком файлов (включая пустой список файлов), либо любым другим набором ресурсов на основе файлов .

0 голосов
/ 03 мая 2013

В родительском файле сборки добавьте:

<fileset id="additional.dependency.fileset" erroronmissingdir="false" dir="noop" />

Для дочерних элементов, требующих добавления дополнительных артефактов, определите набор файлов в дочернем файле сборки:

<fileset id="additional.dependency.fileset" dir="..." includes="..." />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...