在什么情况下StyleCop会选择跳过文件?

时间:2013-01-11 14:31:04

标签: stylecop

我有一个包含20个c#项目的解决方案。直到最近,StyleCop将跨所有项目运行除自动生成的文件之外的所有文件,并报告它发现的任何问题。最近(目前尚不清楚何时)它会对哪些文件报告问题变得挑剔。

在给定的项目中,我故意将相同的缺陷添加到多个源文件中,而StyleCop会在某些情况下报告该问题,但不报告其他情况。

同一代码的早期分支,自10月以来基本未改变,不会显示此行为。除了源代码之外什么也不做更改我可以演示最新代码中存在的问题,但不会出现在10月的代码中。

跳过的文件不包含任何"我是自动生成的"我期望让MarkCop跳过它们的标记,我发现跳过的文件或分析的文件之间没有共性。

解决方案文件在分支之间不变,对csproj文件的唯一更改是添加/删除源文件。

有没有人有任何想法可能导致这种行为?

1 个答案:

答案 0 :(得分:3)

因此,在大量巧克力消费和大量宣誓之后,我有答案:

我们最近在所有源文件的顶部插入了版权声明。事实证明,我们的一些源文件在文件开头有一个byte order mark(U + FEFF),并且通知最终被插入到该字符之前。

StyleCop对此角色的存在感到冒犯,并默默地忽略文件的其余部分。

鉴于Visual Studio IDE没有正确呈现该字符,我花了三天时间才发现它:(

EDIT(2013.01.14):我创建了一个Perl脚本来从源文件中删除BOM:

#!/usr/bin/perl -w
use strict; 
use warnings;
use File::Find;

my @dir = "C:/TopLevelSourceCodeDirectory";

find(\&edits, @dir);

sub edits() {

    my $file = $_;

    if( (-f $file) 
        && 
        (
            ($file =~ /.*\.cs$/)
            ||
            ($file =~ /.*\.xaml$/)
            ||
            ($file =~ /.*\.whatever$/)
        )
      ) {

        #Open the file and read in the data
        open (my $in, '<', $file) or die "Can't open $file: $!\n";
        my @lines = <$in>;
        close $in;

        #Open same file for writing
        open (my $out, '>', $file) or die "Can't open $file: $!\n";

        #Walk through lines, putting into $_, and remove BOMs
        for ( @lines ) {
            s/\xef\xbb\xbf//g;
            print $out $_;
        }

        close $out;
    }
}

最后一点说明;我编写这个脚本时遇到了所有问题,因为当我粘贴某些字符串时(即使这些字符串最初不包含BOM),记事本似乎在我的文件中间添加了BOM(当然,它们是不可见的) 。找出为什么你的正则表达式不匹配,当你不能告诉它在匹配器字符串中间有一个看不见的BOM时是不愉快的。