Как «развернуть» путь муравья (доступ с помощью refId = ..) ко всем файлам в пути, кроме некоторых? - PullRequest
3 голосов
/ 26 марта 2009

Я пытаюсь заставить ant4eclipse работать, и я немного использовал ant, но не намного выше простого языка сценариев. У нас есть несколько исходных папок в наших проектах Eclipse, поэтому пример в документации ant4eclipse нуждается в адаптации:

В настоящее время у меня есть следующее:

<target name="build">

  <!-- resolve the eclipse output location -->
  <getOutputpath property="classes.dir" workspace="${workspace}" projectName="${project.name}" />

  <!-- init output location -->
  <delete dir="${classes.dir}" />
  <mkdir dir="${classes.dir}" />

  <!-- resolve the eclipse source location -->
  <getSourcepath pathId="source.path" project="." allowMultipleFolders='true'/>

  <!-- read the eclipse classpath -->
  <getEclipseClasspath pathId="build.classpath" 
                          workspace="${workspace}" projectName="${project.name}" />

  <!-- compile -->
  <javac destdir="${classes.dir}" classpathref="build.classpath" verbose="false" encoding="iso-8859-1">
    <src refid="source.path" />
    </javac>

  <!-- copy resources from src to bin -->
  <copy todir="${classes.dir}" preservelastmodified="true">
    <fileset refid="source.path">
        <include name="**/*"/>
        <!--
        patternset refid="not.java.files"/>
        -->
    </fileset>
  </copy>
</target>

Задача выполняется успешно, но я не могу заставить ее работать - она ​​должна также копировать все не-Java-файлы, чтобы эмулировать поведение eclipse.

Итак, у меня есть pathId с именем source.path, который содержит несколько каталогов, которые мне как-то нужно втиснуть в нечто вроде задачи копирования. Я попробовал вложение, которое является недопустимым, и некоторые другие дикие догадки.

Как мне это сделать - заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 04 октября 2010

Вы можете рассмотреть возможность использования pathconvert для построения шаблона, с которым fileset includes может работать.

<pathconvert pathsep="/**/*," refid="source.path" property="my_fileset_pattern">
    <filtermapper>
        <replacestring from="${basedir}/" to="" />
    </filtermapper>
</pathconvert>

Это заполнит ${my_fileset_pattern} строкой вроде:

1/**/*,2/**/*,3

, если source.path состоит из трех каталогов 1, 2 и 3 под основанным. Мы используем pathsep для вставки подстановочных знаков, которые позже будут расширены до полного набора файлов.

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

<fileset dir="." id="my_fileset" includes="${my_fileset_pattern}/**/*">
    <exclude name="**/*.java" />
</fileset>

Копия всех файлов, не являющихся Java, становится:

<copy todir="${classes.dir}" preservelastmodified="true">
    <fileset refid="my_fileset" />
</copy>

При этом будут скопированы исходные файлы с сохранением структуры исходного каталога в todir. При необходимости можно установить атрибут flatten задачи копирования, чтобы все исходные файлы копировались непосредственно в todir.

Обратите внимание, что пример pathconvert здесь для файловой системы unix, а не для windows. Если требуется что-то переносимое, то для построения шаблона следует использовать свойство file.separator:

<property name="wildcard" value="${file.separator}**${file.separator}*" />
<pathconvert pathsep="${wildcard}," refid="source.path" property="my_fileset">
...
2 голосов
/ 26 марта 2009

Вы можете использовать задачу foreach из библиотеки ant-contrib :

<target name="build">
    ...

    <!-- copy resources from src to bin -->
    <foreach target="copy.resources" param="resource.dir">
        <path refid="source.path"/>
    </foreach>
</target>

<target name="copy.resources">
    <copy todir="${classes.dir}" preservelastmodified="true">
        <fileset dir="${resource.dir}" exclude="**/*.java">
    </copy>
</target>

Если ваш source.path также содержит пути к файлам, вы можете выполнить задачу if (также из ant-contrib), чтобы предотвратить попытку копирования файлов по пути к файлу, например

<target name="copy.resources">
    <if>
        <available file="${classes.dir}" type="dir"/>
        <then>
            <copy todir="${classes.dir}" preservelastmodified="true">
                <fileset dir="${resource.dir}" exclude="**/*.java">
            </copy>
        </then>
    </if>
</target>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...