Минимальный Проект Msbuild

Наверное, каждому программисту, знакомому с системой построения проектов MsBuild, пришла в голову идея не расширять существующий процесс построения, а придумать его «с нуля».

Другими словами, добавьте еще один тип (например, .

myproj или просто .

proj) к существующим типам проектов .

csproj (проект C#) и .

vbproj (проект VB.NET).

А кто-то, возможно, даже пытался реализовать эту идею.

Информации по этой теме вроде бы много, есть даже пошаговое руководство на MSDN .

Но, после создания файла проекта с помощью любого такого руководства, становится ясно, что нас жестоко обманули — созданные таким образом проекты живут «сами по себе» и не могут быть ни включены в решение, ни открыты в Visual Studio. В этой статье я представляю вам собственное исследование на эту тему.



Постановка задачи

Чтобы определить минимальные требования, предъявляемые к «обычным» проектам в смысле Visual Studio 2008, создайте проект, который:
  • не совершает никаких действий в процессе строительства;
  • правильно открывается и отображается в Visual Studio 2008;
  • можно добавить в список зависимостей других проектов;
  • содержит несколько файлов;
  • все файлы проекта считаются выходными, т.е.

    должны быть скопированы в выходные каталоги зависимых проектов.



Процесс решения

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

Скажу лишь, что в процессе решения использовались следующие инструменты:

  1. Справочник MsBuild в MSDN ;
  2. Текстовый редактор;
  3. содержимое файла %windir%\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets;
  4. параметры /v:d и /v:diag для msbuild.exe;
  5. программа grep.exe, входящая в комплект поставки цигвин .



Решение

Следующий файл проекта удовлетворяет всем требованиям (и пригоден для дальнейшего расширения):
   

<Эxml version="1.0" encoding="utf-8"?> <Project ToolsVersion="3.5" DefaultTargets="Build" xmlns=" http://schemas.microsoft.com/developer/msbuild/2003 "> <PropertyGroup> <ProjectGuid>{F4279D30-8B96-4217-B811-D2912FAD2C71}</ProjectGuid> </PropertyGroup> <ItemGroup> <BuiltProjectOutputGroupKeyOutput Include="SuperLibrary.dll" /> </ItemGroup> <ItemGroup> <Content Include="logo.bmp" /> <Content Include="help.html" /> </ItemGroup> <Target Name="Build" Outputs="" /> <Target Name="Rebuild" /> <Target Name="Clean" /> <Target Name="GetTargetPath" Outputs="" /> <Target Name="GetNativeManifest" Outputs="" /> <Target Name="GetCopyToOutputDirectoryItems" Outputs="@(_Content)"> <ItemGroup> <Content Include="@(BuiltProjectOutputGroupKeyOutput)" /> <_Content Include="@(Content->'%(FullPath)')"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <TargetPath>%(Filename)%(Extension)</TargetPath> </_Content> </ItemGroup> </Target> </Project>



выводы

Работая над приведенным выше файлом проекта, мы обнаружили следующие требования, предъявляемые средой Visual Studio 2008 ко всем файлам проекта:
  1. файл проекта должен иметь расширение, связанное с языками, использующими MsBuild, то есть .

    csproj или .

    vbproj, но не .

    myproj;

  2. свойство ProjectGuid должно присутствовать в файле проекта;
  3. проект должен содержать элемент BuildingProjectOutputGroupKeyOutput с расширением .

    dll или .

    exe (этот элемент можно импортировать);

  4. все элементы, указанные в файле проекта (но не импортированные из других файлов!), отображаются в Solution Explorer и должны присутствовать на диске (импортированные из других файлов элементы не отображаются в графическом интерфейсе);
  5. проект должен иметь цели Build, Rebuild и Clean, а также цели функций GetTargetPath, GetNativeManifest и GetCopyToOutputDirectoryItem;
  6. Целевые объекты Build и GetTargetPath должны возвращать основной выходной файл проекта (но могут ничего не возвращать, если основного файла нет);
  7. цель GetNativeManifest должна возвращать манифест проекта в случае, когда в проекте есть этот самый манифест;
  8. Цель GetCopyToOutputDirectoryItems должна возвращать список выходных файлов проекта;
  9. Для всех элементов, возвращаемых функциями целей (включая Build), необходимо использовать только полные пути (поскольку эти элементы передаются между проектами);
  10. Для всех элементов, возвращаемых целевым объектом GetCopyToOutputDirectoryItems, метаданные CopyToOutputDirectory должны иметь значение Always или PreserveNewest;
  11. Все элементы, возвращаемые целью GetCopyToOutputDirectoryItems, должны иметь метаданные TargetPath, означающие относительное имя файла при его копировании в выходной каталог другого проекта (хорошим значением по умолчанию является %(Filename)%(Extension), т. е.

    имя и расширение файла.

    исходный предмет).

Я утверждаю, что любой проект, отвечающий этим требованиям, можно открыть в Visual Studio 2008, добавить в решение вместе с другими проектами, а также добавить в список зависимостей другого проекта.

Теги: #Visual Studio 2008 #msbuild #Visual Studio

Вместе с данным постом часто просматривают: