Как использовать подстановочный знак в Ant Доступная команда

Я использую Ant build script для сопоставления моего приложения на основе Eclipse для распространения.

Один шаг сборки - проверить правильность наличия библиотек в папках сборки. В настоящее время для этого используется команда Ant. К сожалению, я должен вносить изменения в script каждый раз, когда я переключаюсь на новую сборку Eclipse (поскольку номера версий будут обновлены).

Мне не нужно проверять номера версий, мне просто нужно проверить, что там файл.

Итак, как я могу проверить:

org.eclipse.rcp_3.5.0.*

вместо:

org.eclipse.rcp_3.5.0.v20090519-9SA0FwxFv6x089WEf-TWh11

с помощью Ant?

веселит, Ian

Ответ 1

Вы имеете в виду, что-то вроде (на основе pathconvert task, после эта идея):

<target name="checkEclipseRcp">
  <pathconvert property="foundRcp" setonempty="false" pathsep=" ">
    <path>
      <fileset dir="/folder/folder/eclipse"
               includes="org.eclipse.rcp_3.5.0.*" />
    </path>
  </pathconvert>
</target>

<target name="process" depends="checkEclipseRcp" if="foundRcp">
  <!-- do something -->
</target>

Ответ 2

Несколько более короткий и более простой подход с resourcecount условие:

<target name="checkEclipseRcp">
    <condition property="foundRcp">
        <resourcecount when="greater" count="0">
            <fileset file="/folder/folder/eclipse/org.eclipse.rcp_3.5.0.*"/>
        </resourcecount>
    </condition>
</target>

<target name="process" depends="checkEclipseRcp" if="foundRcp">
  <!-- do something -->
</target>

Ответ 3

Задача pathconvert, вероятно, является предпочтительным способом в большинстве случаев. Но это создает небольшую проблему, когда дерево каталогов очень велико, и один использует задачу echoproperties. С очень большим деревом каталогов строка, сгенерированная pathconvert, может быть огромной. Затем echoproperties распыляет огромную струну, что затрудняет работу с выходом. Я использую макродекс в Linux, который создает свойство, установленное в "1", если в каталоге есть файлы:

<macrodef name="chkDirContents" >
    <attribute name="propertyName" />
    <attribute name="dirPath" />
    <attribute name="propertyFile" />
    <sequential>
        <exec executable="sh" dir="." failonerror="false" >
            <arg value="-c" />
            <arg value='fyles=`ls -1 @{dirPath} | head -1` ; if [ "$fyles" != "" ] ; then echo @{propertyName}=1 > @{propertyFile} ; fi' />
        </exec>
    </sequential>
</macrodef>

<target name="test" >
    <tempfile destdir="." property="temp.file" deleteonexit="true" />
    <chkDirContents propertyName="files.exist" dirPath="./target_dir" propertyFile="${temp.file}" />
    <property file="${temp.file}" />

    <echoproperties/>
</target>

Выполнение целевой задачи "test" приведет к созданию следующей строки echoproperties, если в каталоге./target_dir/есть файлы:

[echoproperties] files.exist=1

Что такое "тест": Он генерирует временное имя файла, ${temp.file}, которое впоследствии может быть использовано как файл свойства. Затем он выполняет макроопределение, которое вызывает оболочку для проверки содержимого каталога dirPath. Если в каталоге dirPath есть файлы или каталоги, он присваивает свойству propertyName значение 1 во временном файле. Затем он считывает файл и задает свойство, указанное в файле. Если файл пуст, свойство не определено.

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