为StyleCop增量检查过滤Msbuild CreateItem的输出

时间:2013-09-11 18:25:36

标签: msbuild stylecop incremental-build

我正在尝试修改stylecop目标,以支持仅对已更改的文件进行增量检查。

调试时,我看到@(编译)是要检查的文件列表;但是,我想将此列表过滤为仅已更改的文件(即那些时间戳晚于目标dll的文件,我知道我可以引用为$(TargetPath))。

如何递归该createitem的输出,“StyleCopFiles”并删除那些未更改的文件?

下面是目标,我想将过滤条件添加到:

<Target Name="SetUpStyleCopProperties">
        <!-- Determine what files should be checked. Take all Compile items, but exclude those that have
        set ExcludeFromStyleCop=true or ExcludeFromSourceAnalysis=true. -->
        <CreateItem Include="@(Compile)" Condition="('%(Compile.ExcludeFromStyleCop)' != 'true') and ('%(Compile.ExcludeFromSourceAnalysis)' != 'true')">
            <Output TaskParameter="Include" ItemName="StyleCopFiles"/>
        </CreateItem>

        <!-- Show list of what files should be excluded. checked. Take all Compile items, but exclude those that have
        set ExcludeFromStyleCop=true or ExcludeFromSourceAnalysis=true. -->
        <CreateItem Include="@(Compile)" Condition="('%(Compile.ExcludeFromStyleCop)' == 'true') or ('%(Compile.ExcludeFromSourceAnalysis)' == 'true')">
            <Output TaskParameter="Include" ItemName="StyleCopExcludedFiles"/>
        </CreateItem>
    </Target>

1 个答案:

答案 0 :(得分:0)

使用自定义MSBuild任务可以提出建议。但是,增量的StyleCop分析可能无法正常工作,因为失败的StyleCop分析不一定会阻止编译。想象一下您提出的增量分析中的以下事件序列:

  1. 文件A.cs已修改,包括引入可能导致StyleCop警告的问题。
  2. 项目已建成。
  3. 修改了文件B.cs,包括引入可能导致StyleCop警告的问题。 (文件A.cs未被修改。)
  4. 项目已建成。
  5. 在#2,你会看到一个关于A.cs中问题的StyleCop警告。但是,在#4,你只会看到B.cs中的问题,而不是A.cs中的问题。这真的是你想要的吗?

    如果您确实发现StyleCop在开发人员本地构建期间导致有问题的延迟,则还有另一种选择:创建省略StyleCop的备用构建配置。例如,我经常创建一个“DebugCompileOnly”解决方案配置,它省略了StyleCop和FxCop分析。开发人员可以在他们的本地机器上随意使用它,但是它们应该在提交之前在Debug配置(包括两个工具)下编译。构建服务器上的持续集成构建使用Debug配置,从而确保很快发现任何失败的情况。