Нужно к некоторым файлам в определенной папке применить какое-либо (произвольное) действие. Как это сделать в NAnt?
Как в nant пакетно обработать файлы?
2
Спросил
Новые ответы
1
Обычно делается следующим образом:
- Создается задача (target A), которая будет выполняться для каждого файла. Путь к файлу, и другие данные, которае могут понадобиться, считываются из специальных свойств (property).
- Создается задача (target B), которая перебирает все файлы по определенному пути, и вызывает для каждого из них задачу target A, предварительно задав необходимые свойства.
Пример такого скрипта можно увидеть, в проекте CommonLogging. Вот target, который запускает модульные тесты для каждой сборки из папки bin:
<target name="TestAllAssemblies">
<foreach item="File" property="filename">
<in>
<items basedir="${build.dir}">
<exclude name="net/**" />
<include name="**/*.Tests.dll" />
</items>
</in>
<do>
<property
name="test.assemblyfile"
value="${filename}" overwrite="true" />
<call target="common.run-tests.nunit" />
</do>
</foreach>
</target>
Вот дочерний target, который вызывается для каждой найденной сборки тестов:
<target name="common.run-tests.nunit">
<property name="test.assemblyname" value="${path::get-file-name-without-extension(test.assemblyfile)}" overwrite="true" />
<property name="test.bin.dir" value="${directory::get-parent-directory(test.assemblyfile + '/')}" overwrite="true" />
<echo message="Unit Testing ${test.assemblyname}, File='${test.assemblyfile}', WorkingDir='${test.bin.dir}'" />
<exec program="${tool.dir}/nunit/nunit-console.exe" workingdir="${test.bin.dir}" verbose="true">
<arg value="/xml:${test.assemblyname}.dll-TestResults.xml" />
<arg value="/nologo" />
<arg value="/noshadow" />
<arg value="/framework:${nant.settings.currentframework}" />
<arg line="${test.assemblyfile}" />
</exec>
</target>
Как видно, дочерний элемент target использует свойство test.assemblyfile
, хранящее путь к текущему файлу и устанавлеваемое родительским таском.