Как я могу рассматривать предупреждение 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» не является допустимым номером предупреждения

  • Нашли конфликты между разными версиями одной и той же зависимой сборки, которые не могли быть решены
  • Получить Visual Studio для запуска шаблона T4 для каждой сборки
  • Как переопределить параметр CopyLocal (Private) для ссылок в .NET из MSBUILD
  • MSBuild Script и VS2010 публикуют применение преобразования Web.config
  • Как настроить MSBuild для использования сохраненного файла публикации для WebDeploy?
  • Как публиковать Web с помощью msbuild?
  • Как я могу заставить TFS2010 запускать MSDEPLOY для меня через MSBUILD?
  • Событие post build execute powershell
  • Допустимые параметры для MSDeploy через MSBuild
  • Team Build: публиковать локально с помощью MSDeploy
  • Как определить версию приложения в одном месте для нескольких приложений?
  • Давайте будем гением компьютера.