【问题标题】:Treat all warnings as errors将所有警告视为错误
【发布时间】:2013-07-06 03:52:29
【问题描述】:

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

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

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

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

<TreatWarningsAsErrors>true</TreatWarningsAsErrors>

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

private int unused;

错误 3 警告为错误:从未使用字段“XXXX.unused”

但整个问题是,我无法解决程序集参考问题。如果我引用了未知程序集,编译器(devenv 或 msbuild)会抛出警告,但我想要一个错误。

最终,我正在尝试配置门控签入 TFS 构建配置,因此 TFS 将拒绝提交以防“找不到引用的组件“XXXX”。 “ 警告。比修改构建过程模板更简单的东西会很棒。

【问题讨论】:

标签: c# .net tfs msbuild warnings


【解决方案1】:

MSBuild 警告(均以 MSB* 开头)与 CSC 警告相反,不能被抑制或升级为错误。因为ResolveAssemblyReference 任务会即时打印其消息并且不聚合任何消息。

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

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

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 上对此进行了测试,但它也应该适用于 TFS 2010。

【讨论】:

  • 这就是我所害怕的......我知道来自 MSBuild 本身的警告不能升级为错误。我不明白为什么 unknown assembly reference 不是 CSC 警告。无论如何,自定义活动确实是要走的路,即使乍一看对于我拥有的(显然)简单用例来说听起来有点矫枉过正。 +1,感谢您的回答。
  • 要使 KMoraz 发布的解决方案起作用,我必须执行以下操作: 1. 如果在文件中找不到字符串,则在 CodeActivity 的 Result 中添加空字符串。 2. 将构建模板中的 readStringFromFileResult.Count 更改为 readStringFromFileResult.Length。否则,当找不到字符串时,我会得到一个空异常。
【解决方案2】:

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

MSBuild 15 与 Visual Studio 2017 一起安装,但也可以是 downloaded from GitHub

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 2010-09-20
    • 2012-01-13
    • 2022-08-03
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多