Как я могу сказать, что nant должен вызывать csc только когда есть cs файлы для компиляции? - PullRequest
2 голосов
/ 17 июня 2010

В моем скрипте NAnt у меня есть цель компиляции, которая вызывает csc.В настоящее время происходит сбой, потому что входные данные не указаны:

  <target name="compile">
    <csc
      target="library"
      output="${umbraco.bin.dir}\Mammoth.${project::get-name()}.dll">
      <sources>
        <include name="project/*.cs" />
      </sources>
      <references>
      </references>
    </csc>    
  </target>

Как я могу сказать NAnt не выполнять задачу csc, если нет файлов CS?Я читал об атрибуте if, но не уверен, какое выражение использовать с ним, так как $ {file :: exist ('*. Cs')} не работает.

Сценарий сборки является шаблоном дляUmbraco (CMS) проектирует и может иметь или не иметь когда-либо исходные файлы .cs в проекте.В идеале мне бы не хотелось, чтобы разработчики помнили, что нужно изменить скрипт NAnt, чтобы включить задачу компиляции при добавлении файлов CS в проект (или исключить ее, когда все файлы CS удалены).

1 Ответ

2 голосов
/ 18 июня 2010

Это примерно наборов файлов NAnt .<sources> имеет тип набора файлов.Обработка этих наборов файлов часто затруднительна в NAnt.Поскольку нет функции fileset::is-empty, нам нужно это явно проверить:

<fileset id="sourcefiles">
  <include name="project/*.cs" />
</fileset>
<property
  name="sourcefiles.count"
  value="0" />
<foreach item="File" property="filename">
  <in>
    <items refid="sourcefiles" />
  </in>
  <do>
    <property
      name="sourcefiles.count"
      value="${int::parse(sourcefiles.count) + 1}" />
  </do>
</foreach>
<if test="${int::parse(sourcefiles.count) > 0}">
  <csc
    target="library"
    output="${umbraco.bin.dir}\Mammoth.${project::get-name()}.dll">
    <sources refid="sourcefiles" />
    <references>
    </references>
  </csc>
</if>

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

Обновление: Только вчера я нашел альтернативу: если вы не возражаете против использования NAntContrib есть функция fileset::has-files.Это код:

<fileset id="sourcefiles">
  <include name="project/*.cs" />
</fileset>
<if test="${fileset::has-files('sourcefiles')}">
  <csc
    target="library"
    output="${umbraco.bin.dir}\Mammoth.${project::get-name()}.dll">
    <sources refid="sourcefiles" />
    <references>
    </references>
  </csc>
</if>
...