Как я могу рассматривать предупреждение MSB3245 (не может разрешить ссылку) как ошибку?

Мой вопрос основан на другом , но я хочу сделать обратное : скажите msbuild, чтобы обработать предупреждение как ошибку, а не подавлять определенное предупреждение msbuild.

Тем не менее, все, что я вижу до сих пор, говорит /p:WarningsAsErrors принимает только предупреждения csc и ошибки. Я попытался просто отбросить MSB и googling за то, что число может пойти туда, чтобы работать, но не повезло.

Есть ли способ обработать предупреждение «assembly ссылок не найдено» из msbuild (командной строки) в качестве ошибки?

Недавно мне было нужно что-то подобное (действуя на определенные события журнала), но я не мог найти чистого решения в основном потому, что я не понял, как программно обращаться к регистраторам в процессе msbuild. Я придумал это, хотя, адаптированный к вашей проблеме, принцип:

  • установить собственное сканирование регистратора для предупреждения
  • строить
  • установить статический флаг, если возникает предупреждение
  • иметь настраиваемую задачу, проверить этот флаг и поднять ошибку, если он включен

Может показаться сложным, но код достаточно прост:

 using Microsoft.Build.Framework; using Microsoft.Build.Utilities; namespace Foo { public static class Common { public static bool errorsOccurred = false; } public class ScanLogger : Logger { public override void Initialize( IEventSource eventSource ) { eventSource.MessageRaised += ( s, e ) => Common.errorsOccurred |= e.Message.Contains( "MSB3245" ); } } public class CheckErrors : Task { public override bool Execute() { if( Common.errorsOccurred == false ) return true; Log.LogError( "errorsOccurred = true" ); return false; } } } 

Вот пример скрипта msbuild, использующий его:

        

И вы вызываете это так:

 msbuild /logger:Foo.dll my.proj 

Я просто нуждался в этом снова, но больше не мог найти исходную dll, файл проекта и т. д. Я решил сохранить только код и простую инструкцию по сборке в git и построить его на лету, когда это необходимо, возможно, более чистым. Поэтому в основном сохраните код выше в файле customlogger.cs, а затем где-нибудь в процессе сборки, прежде чем эффективно вызвать msbuild с помощью настраиваемого регистратора, постройте его, используя

    Список    

update В ответ на комментарии: повторив это снова сегодня, я не уверен, что исходный код на самом деле когда-либо работал (ну, он показывает примерное сообщение, но не для фактического предупреждения MSB3245), поскольку он перехватывает события сообщений только тогда, когда ResolveAssemblyReference испускает фактическое предупреждение, и, кроме того, номер предупреждения обычно не содержится в сообщении. Это делает трюк, хотя:

 public class ScanLogger : Logger { public override void Initialize( IEventSource eventSource ) { eventSource.WarningRaised += ( s, e ) => Common.errorsOccurred |= e.Code == "MSB3245"; } } 

Похоже, что сообщение, связанное с этим предупреждением, не является предупреждением:

Если эта ссылка требуется для вашего кода, вы можете получить ошибки компиляции

, не совсем корректно. Если отсутствующая ссылка является темой WPF, вы получите ошибку времени выполнения (System.IO.FileNotFoundException).

В стороне, если вы специально ищете MSB3245, вы получите:

CSC: предупреждение CS1691: «MSB3245» не является допустимым номером предупреждения

  • Как я могу заставить TFS2010 запускать MSDEPLOY для меня через MSBUILD?
  • Как получить проекты .NET Core для копирования ссылок NuGet для сборки вывода?
  • MSBuild не копирует ссылки (файлы DLL) при использовании зависимостей проекта в решении
  • Team Build: публиковать локально с помощью MSDeploy
  • Где я могу найти Microsoft.TeamFoundation.Build.Client в Visual Studio 2015?
  • Как установить PreProcessorDefinitions как задачу для задачи msbuild
  • Powershell вызывает msbuild с вложенными кавычками
  • Есть ли хороший учебник по сценариям MSBuild?
  • MSDeploy пропускает правила при использовании MSBuild PublishProfile с Visual Studio 2012
  • Почему MSBuild выглядит в C: \ для Microsoft.Cpp.Default.props вместо c: \ Program Files (x86) \ MSBuild? (ошибка MSB4019)
  • Список встроенных переменных MSBuild
  • Давайте будем гением компьютера.