Запрет 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