c# - 将所有警告视为错误

标签 c# .net tfs msbuild warnings

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

我想做的很简单:如果有警告,我希望编译失败并报错。是的,著名的 TreatWarningsAsErrors...

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

treat warnings as errors

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

<TreatWarningsAsErrors>true</TreatWarningsAsErrors>

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

private int unused;

Error 3 Warning as Error: The field 'XXXX.unused' is never used

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

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

最佳答案

与 CSC 警告相反,MSBuild 警告(全部以 MSB* 开头)不能被抑制或升级为错误。因为 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"

编译和测试配置 序列结束时调用:

<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。

关于c# - 将所有警告视为错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17533008/

相关文章:

c# - 在 LINQ 中获取组的第一条记录?

.net - 如何将 XMLSerializer 与包含 IList<T> 成员的 CaSTLe ActiveRecord 结合使用

.net - 当前的 C++ 最佳实践和 IDE

git-tfs 克隆失败,错误代码为 128

git - TFS git commit 更改工作项状态

c# - 如何更改异步方法调用以防止强制调用堆栈异步

c# - 是否可以在 C# 中使用分支预测提示?

c# - IEnumerable 在与 namespace System.Collections 一起使用时报告编译器错误

c# - 英孚流利 API : Set property for each entity derived from a base abstract class

tfs - 如何使用TFS checkin 策略中的配置?