Я использую следующее (сильно упрощенный) MSBuild скрипт:Как включить функцию «Обработать предупреждения как ошибки» для моей задачи TransformXml?
<?xml version="1.0"?>
<Project DefaultTargets="Transform" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="Transform">
<TransformXml Source="../web.config"
Transform="Config\Production\webapp.xml"
Destination="Config\Build\Production\web.config" />
</Target>
</Project>
Это прекрасно работает для преобразования одного файла конфигурации без необходимости проходить через MSDeploy.
Однако, скажем, в моем преобразовании я пропускаю переменную. Я получил предупреждение:
C: \ MyApp \ DevOps \ Config \ Производство \ webapp.xml (15,6): Предупреждение: Ни один элемент в исходном документе не соответствует «/ конфигурации/AppSettings/добавить [@ ключ = «MyUnknownVariable»] '[C: \ MyApp \ DevOps \ ConfigBundle.msbuild]
Хотя приятно, что мы получим предупреждение для этого, мне действительно нужно, чтобы это было ошибкой, поскольку это станет частью наш автоматизированный процесс сборки и развертывания, поэтому маловероятно, что кто-нибудь обнаружит его, пока приложение не перестанет работать.
Мне хотелось бы, чтобы мы рассматривали эти предупреждения как ошибки. Основа некоторых вещей, которые я видел в Интернете, я попробовал PropertyGroup с двумя различными TreatWarningsAsErrors символов:
<PropertyGroup>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
</PropertyGroup>
Я попытался установить это в командной строке (который я подозреваю, это то же самое, выше):
C:\MyApp\DevOps>msbuild /p:TreatWarningsAsErrors="true" ConfigBundle.msbuild
Ничего из этого не работает; предупреждение продолжает отправляться. Исходя из этого, я предполагаю, что задача отдельного MSBuild заключается в уважении директивы TreatWarningsAsErrors, и в этом случае TransformXml этого не делает.
Если бы я мог найти способ, чтобы узнать, если последняя задача кинул предупреждение, например, я мог бы сделать что-то вроде:
<Message Text="##teamcity[message text='Config Transform Failed!' status='ERROR']" Condition="$WarningOccurred == 'true'" />
Это не совсем идеально, но это, конечно, остановить сборку от отделки успешно. Надеюсь, у кого-то будет полезное предложение для этого.
Вы можете создать специальную задачу MSBuild для оболочки, которая создает и выполняет задачу TransformXml, и если какие-либо предупреждения регистрируются, переустановите их как ошибки. Это также может помочь декомпилировать класс TransformXml и посмотреть, есть ли способ обработать предупреждения как ошибки (особенно если они происходят из ToolTask). – makhdumi
Да, это в значительной степени подход, с которым я столкнулся - я завернул его в сценарий Powershell. Ваш путь, безусловно, «чище», и в будущей версии моих сценариев развертывания я вполне могу это реализовать. –