将所有警告视为错误

ken*_*n2k 42 .net c# msbuild tfs warnings

这应该是显而易见的,但我无法让它工作......

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

我在我的C#项目属性中配置它

将警告视为错误

这导致TreatWarningsAsErrors我的csproj 中的预期部分:

<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
Run Code Online (Sandbox Code Playgroud)

到目前为止private一切顺利,如果我在我的代码中添加一个无用的变量,它会导致编译错误:

private int unused;
Run Code Online (Sandbox Code Playgroud)

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

但整个问题是,我无法使其适用于装配参考问题.如果我有一个未知程序集的引用,编译器(devenv或msbuild)会发出警告,但我想要一个错误.

最终,我正在尝试配置一个gated check-in TFS构建配置,因此如果找不到 " 引用的组件'XXXX',TFS将拒绝提交. "警告.比修改构建过程模板更简单的东西会很棒.

KMo*_*raz 19

与CSC警告相反的MSBuild警告(全部以MSB*开头)不能被抑制也不能被提升为错误.由于该ResolveAssemblyReference任务即时打印其消息并且不聚合它们中的任何一个.

唯一可行的解​​决方案是读取在TFS构建期间创建的MSBuild日志文件.我认为最优雅的解决方案是实现自定义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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在构建过程模板中声明如下:

xmlns:cfs="clr-namespace:MyBuildActivities.FileSystem;assembly=MyBuildActivities"
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

我已经在TFS 2012上对此进行了测试,尽管它也适用于TFS 2010.


Ric*_*lay 13

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

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

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