这应该是显而易见的,但我无法让它发挥作用......
我想要做的很简单:如果有警告,我希望我的编辑失败并显示错误。是的,着名的TreatWarningsAsErrors
......
我在C#项目属性
中配置了它
这导致我的csproj中的预期TreatWarningsAsErrors
部分:
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
到目前为止,如果我在代码中添加一个无用的private
变量,它会导致编译错误:
private int unused;
错误3警告错误:从不使用字段'XXXX.unused'
但问题是,我无法使其适用于程序集引用问题。如果我有一个未知程序集的引用,编译器(devenv或msbuild)会发出警告,但我想要一个错误。
最终,我正在尝试配置一个gated check-in TFS构建配置,因此如果找不到“引用的组件'XXXX',TFS将拒绝提交。 “ 警告。比修改构建过程模板更简单的事情会很棒。
答案 0 :(得分:18)
MSBuild警告(全部以MSB *开头)与CSC警告相反,无法抑制或提升为错误。因为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));
}
}
}
在构建过程模板中声明如下:
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("{0}\**\*.log", 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。
答案 1 :(得分:10)
MSBuild 15现在支持/warnaserror
标志,强制 MSBuild 警告被视为错误。
MSBuild 15与Visual Studio 2017一起使用,但也可以是downloaded from GitHub
This GitHub issue解释了为什么无法通过MSBuild属性设置它(tl; dr属性为时已太晚)