Запрет MSBuild от построения проекта в.sln без использования конфигураций решений

Я хочу запретить сборку определенных проектов в рамках решения (в рамках конфигурации TeamCity Build, чтобы оптимизировать скорость обратной связи Commit Build, если вы должны знать).

Мне известен механизм Конфигураций решений, но я не хочу заставлять много .sln файлы, чтобы в конечном итоге с каждой перестановкой вещей, которые я хочу иметь возможность отключить. У меня есть правило, основанное на Конвенции, где я хочу сказать: "Если я делаю компоновку коммитов, я не хочу делать финальную упаковку установщика". (И я не хочу разбивать это на отдельное решение).

Я бы предпочел не использовать решение, включающее поиск и замену в .sln файл или в .proj файл создан с помощью [MsBuildEmitSolution][1], Мне известны вопросы, которые касаются готового решения и этого слегка связанного вопроса.

Я вижу MSBuild /v:diag говорит:

 2>Target "Build" in file "Z.sln.metaproj" from project "Z.sln" (entry point):
   Using "MSBuild" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
   Task "MSBuild"
     Global Properties:
       BuildingSolutionFile=true
         CurrentSolutionConfigurationContents=<SolutionConfiguration>
   <ProjectConfiguration Project="{C83D035D-169B-4023-9BEE-1790C9FE22AB}" AbsolutePath="X.csproj" BuildProjectInSolution="True">Debug|AnyCPU</ProjectConfiguration>
   <ProjectConfiguration Project="{15E7887D-F1DB-4D85-8454-E4EF5CBDE6D5}" AbsolutePath="Y.csproj" BuildProjectInSolution="True">Debug|AnyCPU</ProjectConfiguration>
 </SolutionConfiguration>

Итак, вопрос:

Есть ли хороший способ заставить меня заменить XPath или что-то подобное, чтобы получить эффект измененияBuildProjectInSolution="True"вBuildProjectInSolution="False"для проекта Y выше

Если это не так, есть ли сравнительно простое редактирование, которое я могу сделать в .ccproj (Пакет Azure 1.4) или .csproj Файл (общий проект), позволяющий включить эффекты (включая запуск зависимых проектов) проекта в командной строке msbuild Z.sln Построение решения обнуляется?

3 ответа

Решение

Не уверен, что он квалифицируется как аккуратный, но вы можете установить CustomAfterMicrosoftCommonTargets импортировать msbuild файл, чтобы перегрузить BuildDependsOn свойство, указывая его на вашу собственную задачу сборки. В основном, установив CustomAfterMicrosoftCommonTargets Вы получаете msbuild для импорта файла msbuild, содержащего следующее:

<PropertyGroup>
    <OldBuildDependsOn>$(BuildDependsOn)</OldBuildDependsOn>
    <BuildDependsOn>MyBuild</BuildDependsOn>
</PropertyGroup>

<Target Name="OldBuild" DependsOnTargets="$(OldBuildDependsOn)" />

<Target Name="MyBuild">
    <CallTarget Targets="OldBuild" Condition="<IfIWantThis>" /> 
</Target>

редактировать

Вы можете использовать следующее MyBuild цель включить / исключить проекты на основе регулярных выражений, переданных как IncludeInBuild а также ExcludeFromBuild свойства. (Если вам нужны сложные регулярные выражения, вы можете не справиться с выходом специального символа MSBuild, но этого достаточно для простого сопоставления)

> msbuild / p: ExcludeFromBuild = "Тесты | Установить |Azure"

<Target Name="MyBuild">
    <CallTarget Targets="OldBuild" Condition="('$(IncludeInBuild)'=='' OR
    '$([System.Text.RegularExpressions.Regex]::IsMatch($(MSBuildProjectFullPath),
    $(IncludeInBuild), 
    System.Text.RegularExpressions.RegexOptions.IgnoreCase))'=='True') AND 
    ('$(ExcludeFromBuild)'=='' OR 
    '$([System.Text.RegularExpressions.Regex]::IsMatch($(MSBuildProjectFullPath), 
    $(ExcludeFromBuild),  
    System.Text.RegularExpressions.RegexOptions.IgnoreCase))'=='False')" /> 
</Target>

Вы всегда можете передать конкретные проекты, которые вы хотите построить, в качестве параметров MSBuild.

Командная строка MSBuild будет выглядеть так:

MSBuild /t:<Project Name>:Rebuild;<Another Project Name>:Rebuild

В TeamCity вы бы поставили <Project Name>:<Target Action> в целевом поле в бегуне MSBuild.

Я добавляю системный параметр под Параметры

  • Название: system.ExcludeFromBuild
  • Вид: Системное свойство (system.)
  • Значение: путь к вашему csproj

передача параметров

Другие вопросы по тегам