Как использовать одинаковый целевой объект в нескольких файлах проектов
Обновлен: Ноябрь 2007
Если вы создали несколько файлов проектов MSBuild, то наверняка заметили, что в файлах различных проектов приходится использовать одинаковые задачи и целевые объекты. Вместо того чтобы включать полное описание этих задач и целевых объектов в каждый файл проекта, можно сохранить целевой объект в отдельном файле проекта, а затем импортировать этот проект в любой другой проект, где требуется использовать этот целевой объект.
Использование элемента Import
Элемент Import служит для вставки одного файла проекта в другой файл проекта. Импортируемый файл проекта должен представлять собой допустимый MSBuild файл проекта и являться корректным документом XML. Атрибут Project задает путь к импортированному файлу проекта. Дополнительные сведения об элементе Import см. в разделе Элемент Import (MSBuild).
Чтобы импортировать проект:
определите в файле импортируемого проекта все свойства и элементы, которые используются в качестве параметров для свойств и элементов в импортированном проекте.
Используйте элемент Import для импортирования проекта. Например:
<Import Project="MyCommon.targets"/>
Отслеживая элемент Import, определите все свойства и элементы, значения которых необходимо применить вместо значений по умолчанию для свойств и элементов в импортированном проекте.
Порядок вычислений
Когда MSBuild доходит до элемента Import, выполняется эффективная вставка импортированного проекта в импортируемый проект в месте расположения элемента Import. Следовательно, местоположение элемента Import может влиять на значения свойств и элементов. Важно понимать, какие свойства и элементы задаются импортированным проектом, и какие свойства и элементы используются импортированным проектом.
Когда выполняется сборка проекта, сначала вычисляются все значения свойств, а затем — значения элементов. Например, следующая XML-схема определяет файл импортированного проекта MyCommon.targets:
<Project xmlns=”https://schemas.microsoft.com/developer/msbuild/2003”>
<PropertyGroup>
<Name>MyCommon</Name>
</PropertyGroup>
<Target Name="Go">
<Message Text="Name="$(Name)""/>
</Target>
</Project>
А эта XML-схема определяет файл MyApp.proj, с помощью которого импортируется файл MyCommon.targets:
<Project
DefaultTargets="Go"
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Name>MyApp</Name>
</PropertyGroup>
<Import Project="MyCommon.targets"/>
</Project>
При построении проекта выводится следующее сообщение:
Name="MyCommon"
Поскольку проект импортируется после того как свойство Name было определено в MyApp.proj, определение Name в файле MyCommon.targets заменяет собой определение в файле MyApp.proj. Если проект импортируется до того как определено свойство Name, при построении появится следующее сообщение:
Name="MyApp"
При импортировании проектов воспользуйтесь следующим подходом.
Определите в файле проекта все свойства и элементы, которые используются в качестве параметров для свойств и элементов в импортированном проекте.
Импортируйте проект.
Определите в файле проекта все свойства и элементы, которые должны заменить значения свойств и элементов по умолчанию в импортированном проекте.
Пример
В следующем примере кода представлен файл MyCommon.targets, который импортируется вторым примером кода. Файл в формате .targets вычисляет свойства импортирующего проекта, чтобы настроить построение.
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Flavor Condition="'$(Flavor)'==''">DEBUG</Flavor>
<Optimize Condition="'$(Flavor)'=='RETAIL'">yes</Optimize>
<appname>$(MSBuildProjectName)</appname>
<PropertyGroup>
<Target Name="Build">
<Csc Sources="hello.cs"
Optimize="$(Optimize)"
OutputAssembly="$(appname).exe"/>
</Target>
</Project>
Следующий пример кода импортирует файл MyCommon.targets.
<Project DefaultTargets="Build"
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Flavor>RETAIL</Flavor>
</PropertyGroup>
<Import Project="MyCommon.targets"/>
</Project>