Могу ли я создать в NAnt набор файлов, перечисленных в проекте VS?

Я переписываю наши сценарии сборки NAnt, чтобы сделать их более понятными и простыми, а также более общего назначения.

Одним из шагов в нашем процессе сборки является упаковка определенных файлов в zip-файл. Прежде чем мы создали fileset с большим количеством включенных типов файлов, пытаясь поймать все, что может быть в проекте. Это иногда вызывало проблемы, когда мы хотели включить нестандартный тип файла в проект.

Я надеялся, что смогу найти способ создать fileset на основе файлов (а также подмножества файлов), перечисленных в файле проекта Visual Studio (.csproj). Затем я мог бы использовать этот набор файлов в zip задача. Я не нашел ничего, что делает это автоматически (хотя сейчас устарела SLiNgshoT задание в NAntContrib выглядело немного перспективным).

Я начал пытаться сделать это вручную, но застрял. У меня есть цель, которая получает проект из решения (используя regex), затем пытается получить каждый файл содержимого в проекте, используя xmlpeek (с помощью запроса XPath /n:Project/n:ItemGroup/n:Content/@Include). Проблема здесь в том, что xmlpeek не возвращает каждое значение, только первое. И, даже если бы он возвращал каждое значение, я не уверен, как бы получить его в fileset отсюда.

Есть ли способ спасти этот путь мышления? Могу ли я выполнить то, что я хочу, с помощью пользовательской задачи NAnt (я бы предпочел, чтобы каждый проект не зависел от пользовательской задачи)? Есть ли какой-то встроенный способ сделать это, которого я не нахожу?

Пожалуйста, не стесняйтесь задавать вопросы в комментариях, если что-то о моей цели или методе неясно.

Спасибо!


ОБНОВЛЕНИЕ: чтобы уточнить, моя цель во всем этом состоит в том, чтобы сделать весь процесс намного более плавным. Хотя я легко могу добавить все XML-файлы в пакет, часто получаются XML-файлы, которые находятся в одной папке, но на самом деле не являются частью проекта. Когда у меня уже есть список файлов, которые использует проект (даже разделенных между Контентом и другими типами), кажется, стыдно не использовать эту информацию. В конечном счете, никто не должен прикасаться к файлу сборки, чтобы изменить то, что входит в пакет. Для меня это не похоже на несбыточную мечту...

3 ответа

Решение

Смотрите этот связанный вопрос. Интерфейс microsoft.build.buildengine должен позволить вам получить гораздо лучший доступ к необходимой информации, но, к сожалению, я думаю, вам придется создавать пользовательские задачи.

Но я думаю, что синтаксический анализ файла проекта для генерации набора файлов, который используется в другом месте - это... немного больше, чтобы поместить все в ваш скрипт сборки. И поскольку вы, кажется, хотите использовать это повторно, я не думаю, что зависимость от пользовательской задачи хуже, чем любая другая форма повторного использования (даже если вы можете сделать все это в существующих задачах Nant, вам все равно нужно, чтобы каждый проект как-то наследовал этот процесс).

Насколько чтение файлов вашего проекта. Я сделал что-то подобное раньше. В итоге я написал программу, которая считывала файлы проекта и строила собственный проект по файлу сборки проекта.

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

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

Таким образом, вы могли бы иметь что-то вроде этого:

<fileset id="project.source.objects">
  <include name="**/*.cs"/>
  <include name="**/*.xml"/>
  <include name="**/*.resx"/>
</fileset>

<fileset id="project.misc.sources">
  <include name="MyFile1.someext"/>
</fileset>

Тогда в вашей цели zip просто поместите:

<zip zipfile="myzip.zip">
  <fileset refid="project.source.objects"/>
  <fileset refid="project.misc.sources"/>
</zip>

Теперь, если вы хотели специфику проекта. Есть еще одна вещь, которую вы могли бы сделать. Если вы используете VS2005 или выше, ищите на T4. Это шаблонная структура для создания плагинов, которые позволяют создавать дополнительные файлы, когда вы что-то делаете. В некотором роде, когда вы делаете диаграмму классов или имеете XSD (и он получает свой код за файлом, это делается таким образом).

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

Надеюсь, это поможет. Если бы вы могли предоставить немного больше деталей, я мог бы помочь в дальнейшем.

Мне нравится первая часть идеи Джоша.

Напишите небольшое консольное приложение для извлечения файлов из.csproj (так как там только XML) и запишите список в файл.

Вместо задачи NAnt по zip я бы использовал 7-zip для создания архива со списком, который вы создали на предыдущем шаге:

(Я создаю самораспаковывающийся архив здесь)

<target name="ZipBuild">
  <exec program="${SevenZip}" workingdir="${SolutionPath}/Installation/Build.Staging">
    <arg value="a" />
    <arg value="-sfx" />
    <arg value="ReferenceBuild-${build.number}.exe" />
    <arg value="@mycustomfilelist.txt" />
  </exec>
</target>

Надеюсь, это поможет,

Джейсон

Другие вопросы по тегам