2013-12-02 2 views
0

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

<fileset dir="d:\test" id="onlyinbar"> 
    <not> 
     <present targetdir="A_DIR"/> 
    </not> 
</fileset> 
<echo>these files are only in bar : ${toString:onlyinbar}</echo> 
<fileset dir="A_DIR" id="differentbarfoo"> 
    <different targetdir="d:\test" ignoreFileTimes="true"/> 
</fileset> 
<echo>these files are different in bar compared to foo : ${toString:differentbarfoo}</echo> 

Однако, мне нужно выдать другую задачу, если любой из них истинны. Таким образом, тег <condition>, похоже, поддерживает только сравнение файлов с файлами, и я не вижу, как назначить свойство в теге <fileset>. Помощь будет оценена.

ответ

2

Нам нужно, чтобы избежать какого-либо стороннего вклада для этого решения. Моя главная проблема заключалась в сочетании тегов. Мы знали, что наши «тесты», т. Е. Теги набора файлов, должны были быть в состоянии, но не знали, как это сделать. Resourcecount хотя замкнуть вопрос:

<target name="export-report-icons" description="A description"> 
    <condition property="test2" else="false"> 
     <or> 
      <resourcecount when="gt" count="0" property="flength"> 
       <fileset dir="d:\test" id="onlyinbar"> 
        <present targetdir="DIRs_A" present="srconly"/> 
       </fileset> 
      </resourcecount> 
      <resourcecount when="gt" count="0" property="flength"> 
       <fileset dir="DIR_A" id="differentbarfoo"> 
        <different targetdir="d:\test" ignoreFileTimes="true"/> 
       </fileset> 
      </resourcecount> 
     </or> 
    </condition> 
</target> 

<target name="copyThis" depends="export-report-icons" if="${test2}"> 
.... 
</target> 

Так что это делает, устанавливает OR для случая, когда один из двух наборов файлов преуспевают, счетчик оборачивает набор файлов ресурсов, так что он может быть размещен под условием и условие имеет свойство true или false в зависимости от количества ORed. Цель «copy-This» выполняется, если значение $ {test2} истинно. Обратите внимание: если вы установите id = test2, он всегда будет считаться истинным, поскольку в этом случае он проверяет наличие значения.

1

<union> set operator группы ресурсов из нескольких коллекций в одну коллекцию.

Аналогичным образом взгляните на <intersect> и <difference>.

Вы упоминаете «если», который, как я полагаю, относится к задаче <if> из сторонней библиотеки Ant-Contrib. Вот пример, который повторяет, если наборы файлы, объединенные <union> сопрягать любые файлы:

<if> 
    <resourcecount when="gt" count="0"> 
     <union id="Check"> 
      <resources refid="onlyinbar"/> 
      <resources refid="differentbarfoo"/> 
     </union> 
    </resourcecount> 
    <then> 
     <echo>There are differences: ${toString:Check}</echo> 
    </then> 
</if> 
+0

Я не уверен, как это решит проблему. Как вы подразумеваете объединить две наборы файлов, как: <объединение ID = "Проверка"> <ресурс RefID = "onlyinbar" /> <ресурс RefID = "differentbarfoo" /> , а затем попытаться создать новую задачу с if? – janagn

+0

Просьба пояснить, что вы имеете в виду под «заданием другой задачи, если любое из них истинно». Что такое «правда» в этом случае? Что есть файлы в «баре», которые не находятся в «foo» * OR *, есть файлы в обоих «барах» и «foo» с тем же именем, но с другим содержимым? –

+0

Итак, первый набор файлов вернет имена файлов, отсутствующие в A_DIR. Вторая часть будет возвращать файлы, которые отличаются или отсутствуют в d: \ test. Поэтому, если любой из этих двух возвращает что-нибудь, что мне нужно сделать, например, echo (но только IF). – janagn

Смежные вопросы