web-dev-qa-db-ja.com

すべての警告をエラーとして扱う

これは明らかなはずですが、動作させることができませんでした...

私がやろうとしているのは簡単です:警告がある場合、エラーでコンパイルが失敗するようにしたい。はい、有名なTreatWarningsAsErrors...

C#プロジェクトのプロパティで設定しました

treat warnings as errors

これにより、csprojのTreatWarningsAsErrorsセクションが予期されます。

<TreatWarningsAsErrors>true</TreatWarningsAsErrors>

これまでのところ、コードに無駄なprivate変数を追加すると、コンパイルエラーが発生します。

private int unused;

エラー3エラーとしての警告:フィールド 'XXXX.unused'は使用されません

しかし、問題は、アセンブリ参照の問題で機能させることができないことです。不明なアセンブリへの参照がある場合、コンパイラ(devenvまたはmsbuildのいずれか)は警告をスローしますが、代わりにエラーが必要です。

最終的に、ゲートチェックインTFSビルド構成を構成しようとしています。そのため、「参照コンポーネント 'XXXX'が見つからなかった場合、TFSはコミットを拒否します。"警告。ビルドプロセステンプレートを変更するよりも簡単なものがいいでしょう。

39
ken2k

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"

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 2010でも動作するはずですが、TFS 2012でこれをテストしました。

18
KMoraz

MSBuild 15は/warnaserrorフラグをサポートするようになりました。これにより、MSBuild警告がエラーとして扱われます。

MSBuild 15はVisual Studio 2017に組み込まれていますが、 GitHubからダウンロード

このGitHubの問題 MSBuildプロパティを介して設定できない理由を説明しています(tl; drプロパティが遅すぎます)

12
Richard Szalay