用于StyleCop增量检查的Msbuild CreateItem的筛选器输出

用于StyleCop增量检查的Msbuild CreateItem的筛选器输出,msbuild,stylecop,incremental-build,Msbuild,Stylecop,Incremental Build,我试图修改stylecop目标,以支持仅对已更改的文件进行增量检查 调试时,我看到@(Compile)是要检查的文件列表;但是,我希望仅将此列表筛选到已更改的文件(即,时间戳晚于目标dll的文件,我知道可以将其引用为$(TargetPath)) 如何在createitem的输出“StyleCopFiles”上递归并删除那些未更改的文件 下面是我想添加过滤条件的目标: <Target Name="SetUpStyleCopProperties"> <!-- Det

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

调试时,我看到@(Compile)是要检查的文件列表;但是,我希望仅将此列表筛选到已更改的文件(即,时间戳晚于目标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>

使用自定义MSBuild任务可以实现您的建议。然而,增量StyleCop分析可能不会像您预期的那样工作,因为失败的StyleCop分析不一定会阻止编译。设想在您建议的增量分析下发生以下事件序列:

  • 文件A.cs被修改,包括引入一个可能导致StyleCop警告的问题
  • 该项目已建成
  • 文件B.cs被修改,包括引入一个可能导致StyleCop警告的问题。(文件A.cs未修改。)
  • 该项目已建成
  • 在#2处,您将在a.cs中看到针对该问题的StyleCop警告。然而,在第4点,你只会看到B.C.中的问题,而不是A.C.中的问题。这真的是你想要的吗


    如果您真的发现StyleCop在开发人员本地构建期间造成了有问题的延迟,那么还有另一种选择:创建一个省略StyleCop的替代构建配置。例如,我经常创建一个“DebugCompileOnly”解决方案配置,它忽略了StyleCop和FxCop分析。开发人员可以在本地机器上随意使用它,但在提交之前,他们应该在调试配置(包括这两种工具)下编译。构建服务器上的持续集成构建使用调试配置,从而确保可以非常快地识别任何未能执行此操作的故障。

    是否有某些特殊原因使您不想使用StyleCop的内置结果缓存功能?每当我更改1个文件时,它都会在整个项目上重新执行StyleCop。我们的项目非常大,StyleCop目标需要10秒。这是否启用了StyleCop结果缓存?是的。我已经设置好了。为什么不在调试配置中禁用stylecop呢。我怀疑每次编译时都需要运行它。