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

Я переписываю наши 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 ]

2 голосов
/ 13 февраля 2009

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

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

1 голос
/ 13 февраля 2009

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

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

Учитывая, что задача 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 (и он получает свой код за файлом, это делается таким образом).

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

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

0 голосов
/ 14 февраля 2009

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

Напишите небольшое консольное приложение для извлечения файлов из .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>

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

* 1014 Джейсон *

...