将所有警告视为错误

这应该是显而易见的,但我不能使其工作…

我想要做的事情很简单: 如果出现警告,我希望我的编译失败并显示错误 。 是的,着名的TreatWarningsAsErrors

我configuration它在我的C#项目属性

将警告视为错误

这导致在我的csproj例外TreatWarningsAsErrors部分:

 <TreatWarningsAsErrors>true</TreatWarningsAsErrors> 

到目前为止,如果我在代码中添加一个无用的privatevariables,会导致编译错误:

 private int unused; 

错误3警告错误:字段'XXXX.unused'从不使用

但是,整个问题是,我不能使它适用于程序集引用问题 。 如果我有一个未知程序集的引用,编译器(devenv或msbuild)会引发警告,但是我想要一个错误。

最终,我试图configuration一个门控登记TFS生成configuration,所以TFS将拒绝提交,以防万一有一个“ 被引用的组件'XXXX'找不到 ”警告。 比修改构build过程模板更简单的事情会很好。

MSBuild警告(全部以MSB *开始)而不是CSC警告不能被抑制,也不能被提升为错误。 因为ResolveAssemblyReference任务在运行中打印它的消息,并且不会聚合它们中的任何一个。

唯一可行的解​​决scheme是读取在TFS构build期间创build的MSBuild日志文件。 我认为最优雅的解决scheme是实现一个自定义的Build CodeActivity 。 以下是一个简单的活动,将输出结果的任何文件包含给定的SearchString

 using System; using System.Activities; using System.Collections.Generic; using System.IO; using System.Linq; using Microsoft.TeamFoundation.Build.Client; namespace MyBuildActivities.FileSystem { [BuildActivity(HostEnvironmentOption.Agent)] public sealed class ReadStringFromFile : CodeActivity { [RequiredArgument] public InArgument<IEnumerable<string>> Files { get; set; } [RequiredArgument] public InArgument<string> SearchString { get; set; } public OutArgument<string> Result { get; set; } protected override void Execute(CodeActivityContext context) { var files = context.GetValue(Files); var searchString = context.GetValue(SearchString); var list = (files.Where(file => File.ReadAllText(file).Contains(searchString)) .Select(file => string.Format("{0} was found at {1}", searchString, file))).ToList(); if(list.Count > 0) Result.Set(context, string.Join(Environment.NewLine, list)); } } } 

在构build过程模板中声明如下所示:

 xmlns:cfs="clr-namespace:MyBuildActivities.FileSystem;assembly=MyBuildActivities" 

Compile and Test for Configuration序列结束时调用:

 <Sequence DisplayName="Handle MSBuild Errors"> <Sequence.Variables> <Variable x:TypeArguments="scg:IEnumerable(x:String)" Name="logFiles" /> <Variable x:TypeArguments="x:String" Name="readStringFromFileResult" /> </Sequence.Variables> <mtbwa:FindMatchingFiles DisplayName="Find Log Files" MatchPattern="[String.Format(&quot;{0}\**\*.log&quot;, logFileDropLocation)]" Result="[logFiles]" mtbwt:BuildTrackingParticipant.Importance="Low" /> <cfs:ReadStringFromFile Files="[logFiles]" SearchString="MSB3245" Result="[readStringFromFileResult]" /> <mtbwa:WriteBuildMessage DisplayName="Write Result" Message="[readStringFromFileResult]" Importance="[Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.High]" /> <If Condition="[readStringFromFileResult.Count > 0]" DisplayName="If SearchString Was Found" mtbwt:BuildTrackingParticipant.Importance="Low"> <If.Then> <Throw DisplayName="Throw Exception" Exception="[New Exception(readStringFromFileResult)]" mtbwt:BuildTrackingParticipant.Importance="Low" /> </If.Then> </If> </Sequence> 

我已经在TFS 2012上进行过testing,不过它也适用于TFS 2010。

MSBuild 15现在支持/warnaserror标志,强制MSBuild警告被视为错误。

MSBuild 15与Visual Studio 2017一起安装,但也可以从GitHub下载

这个GitHub问题解释了为什么不能通过MSBuild属性来设置(tl; dr属性太晚了)