Наверное, каждому программисту, знакомому с системой построения проектов MsBuild, пришла в голову идея не расширять существующий процесс построения, а придумать его «с нуля».
Другими словами, добавьте еще один тип (например, .
myproj или просто .
proj) к существующим типам проектов .
csproj (проект C#) и .
vbproj (проект VB.NET).
А кто-то, возможно, даже пытался реализовать эту идею.
Информации по этой теме вроде бы много, есть даже пошаговое руководство на MSDN .
Но, после создания файла проекта с помощью любого такого руководства, становится ясно, что нас жестоко обманули — созданные таким образом проекты живут «сами по себе» и не могут быть ни включены в решение, ни открыты в Visual Studio. В этой статье я представляю вам собственное исследование на эту тему.
Постановка задачи
Чтобы определить минимальные требования, предъявляемые к «обычным» проектам в смысле Visual Studio 2008, создайте проект, который:- не совершает никаких действий в процессе строительства;
- правильно открывается и отображается в Visual Studio 2008;
- можно добавить в список зависимостей других проектов;
- содержит несколько файлов;
- все файлы проекта считаются выходными, т.е.
должны быть скопированы в выходные каталоги зависимых проектов.
Процесс решения
Процесс решения этой проблемы достаточно сложен и поэтому выходит за рамки данной статьи.Скажу лишь, что в процессе решения использовались следующие инструменты:
- Справочник MsBuild в MSDN ;
- Текстовый редактор;
- содержимое файла %windir%\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets;
- параметры /v:d и /v:diag для msbuild.exe;
- программа 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 ко всем файлам проекта:- файл проекта должен иметь расширение, связанное с языками, использующими MsBuild, то есть .
csproj или .
vbproj, но не .
myproj;
- свойство ProjectGuid должно присутствовать в файле проекта;
- проект должен содержать элемент BuildingProjectOutputGroupKeyOutput с расширением .
dll или .
exe (этот элемент можно импортировать);
- все элементы, указанные в файле проекта (но не импортированные из других файлов!), отображаются в Solution Explorer и должны присутствовать на диске (импортированные из других файлов элементы не отображаются в графическом интерфейсе);
- проект должен иметь цели Build, Rebuild и Clean, а также цели функций GetTargetPath, GetNativeManifest и GetCopyToOutputDirectoryItem;
- Целевые объекты Build и GetTargetPath должны возвращать основной выходной файл проекта (но могут ничего не возвращать, если основного файла нет);
- цель GetNativeManifest должна возвращать манифест проекта в случае, когда в проекте есть этот самый манифест;
- Цель GetCopyToOutputDirectoryItems должна возвращать список выходных файлов проекта;
- Для всех элементов, возвращаемых функциями целей (включая Build), необходимо использовать только полные пути (поскольку эти элементы передаются между проектами);
- Для всех элементов, возвращаемых целевым объектом GetCopyToOutputDirectoryItems, метаданные CopyToOutputDirectory должны иметь значение Always или PreserveNewest;
- Все элементы, возвращаемые целью GetCopyToOutputDirectoryItems, должны иметь метаданные TargetPath, означающие относительное имя файла при его копировании в выходной каталог другого проекта (хорошим значением по умолчанию является %(Filename)%(Extension), т. е.
имя и расширение файла.
исходный предмет).
Теги: #Visual Studio 2008 #msbuild #Visual Studio
-
Бесполезно Плакать Из-За Пролитых Чернил
19 Oct, 24 -
Как Скопировать Dvd В Mpeg
19 Oct, 24 -
Подготовка К Лаборатории Ccie Дома.
19 Oct, 24 -
Новая Жизнь Старому Wi-Fi-Модулю
19 Oct, 24 -
Как Эффективно Перейти На Удаленную Работу?
19 Oct, 24 -
О Русских Сообществах И Монетизации
19 Oct, 24