2013-12-11 2 views
2

Я использую следующее (сильно упрощенный) 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'" /> 

Это не совсем идеально, но это, конечно, остановить сборку от отделки успешно. Надеюсь, у кого-то будет полезное предложение для этого.

+0

Вы можете создать специальную задачу MSBuild для оболочки, которая создает и выполняет задачу TransformXml, и если какие-либо предупреждения регистрируются, переустановите их как ошибки. Это также может помочь декомпилировать класс TransformXml и посмотреть, есть ли способ обработать предупреждения как ошибки (особенно если они происходят из ToolTask). – makhdumi

+0

Да, это в значительной степени подход, с которым я столкнулся - я завернул его в сценарий Powershell. Ваш путь, безусловно, «чище», и в будущей версии моих сценариев развертывания я вполне могу это реализовать. –

ответ

4

TreatWarningsAsErrors

Используется для указания различных компиляторов языка для лечения предупреждения как ошибки

CodeAnalysisTreatWarningsAsErrors

Используется для указания анализа кода для лечения предупреждения как ошибки ,

Нет общего переключателя для обработки всех предупреждений MsBuild как ошибок. Как правило, invoke of MsBuild передает регистратор в MsBuild, чтобы обнаружить, что это предупреждение произошло, например, Team Build. Затем вызывающий инструмент может либо пройти, либо не выполнить общий результат сборки.

+0

Да, я думаю, так и должно быть. Я просто завернул вызов задачи сборки с помощью Powershell, и я генерирую исключение всякий раз, когда вижу токен ': warning:' - кажется, работает до сих пор довольно хорошо. Вряд ли идеальный, но это лучше, чем ничего. –