0

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

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

自 10 月以来基本未更改的同一代码的早期分支不会显示此行为。只更改源代码我可以演示最新代码中存在的问题,但不能在 10 月的代码中。

跳过的文件不包含任何“我是自动生成的”标记,我希望这些标记会导致 StyleCop 跳过它们,并且我找不到跳过的文件或分析的文件之间的共性。

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

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

4

1 回答 1

3

所以,在大量食用巧克力和咒骂之后,我有了答案:

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

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

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

编辑(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 时,找出您的正则表达式不匹配的原因并不令人愉快。

于 2013-01-11T15:57:50.597 回答