Использование одного целевого объекта в нескольких файлах проектов
Если вы уже создали несколько файлов проекта MSBuild, вы могли заметить, что в разных файлах проекта вы иногда используете одни и те же задачи и целевые объекты. Чтобы не включать полное описание этих задач и целевых объектов в каждый файл проекта, вы можете сохранить целевой объект в отдельный файл проекта и импортировать этот проект во все проекты, которые должны использовать этот же целевой объект.
Использование элемента Import
Элемент Import
позволяет вставить один файл проекта в другой файл проекта. Импортируемый файл проекта должен быть допустимым файлом проекта MSBuild и XML-документом правильного формата. Атрибут Project
задает путь к импортированному файлу проекта. Дополнительные сведения об элементе Import
см. в статье Элемент Import (MSBuild).
Процедура импорта проекта
Определите в файле проекта, из которого выполняется импорт, все свойства и элементы, которые требуются в качестве параметров для свойств и элементов, указанных в импортируемом проекте.
Для импорта проекта используйте элемент
Import
. Например:<Import Project="MyCommon.targets"/>
После элемента
Import
определите все свойства и элементы, которые будут переопределять используемые по умолчанию определения свойств и объектов, включенные в импортируемый проект.
Порядок вычислений
Когда MSBuild достигает элемента Import
, импортируемый проект фактически вставляется в проект, из которого выполняется импорт, прямо в точке расположения элемента Import
. Таким образом, расположение элемента Import
может влиять на значения свойств и элементов. Важно понимать, какие свойства и элементы задает импортируемый проект, и какие свойства и элементы он использует.
При сборке проекта сначала вычисляются все свойства, а затем элементы. Например, следующий XML-код определяет импортируемый файл проекта MyCommon.targets:
<Project xmlns="http://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="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Name>MyApp</Name>
</PropertyGroup>
<Import Project="MyCommon.targets"/>
</Project>
При сборке проекта вы увидите следующее сообщение:
Name="MyCommon"
Так как проект импортируется после того, как в файле MyApp.proj определяется свойство Name
, определение Name
из файла MyCommon.targets переопределяет значение, указанное в файле MyApp.proj. Если же проект будет импортирован раньше, чем определяется свойство Name, при сборке появится следующее сообщение:
Name="MyApp"
При импорте проектов мы рекомендуем использовать следующий подход.
Определите в файле основного проекта все свойства и элементы, которые требуются в качестве параметров для свойств и элементов, указанных в импортируемом проекте.
Импортируйте проект.
Затем определите все свойства и элементы, которые будут переопределять используемые по умолчанию определения свойств и объектов, включенные в импортируемый проект.
Пример 1
В следующем примере кода показан файл MyCommon.targets, который импортируется в проект из второго примера. Файл TARGETS использует в качестве параметров сборки значения свойств, указанные в проекте, из которого выполняется импорт.
<Project xmlns="http://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>
Пример 2
В следующем примере кода выполняется импорт файла MyCommon.targets.
<Project DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Flavor>RETAIL</Flavor>
</PropertyGroup>
<Import Project="MyCommon.targets"/>
</Project>