我有一个包含20个c#项目的解决方案。直到最近,StyleCop将跨所有项目运行除自动生成的文件之外的所有文件,并报告它发现的任何问题。最近(目前尚不清楚何时)它会对哪些文件报告问题变得挑剔。
在给定的项目中,我故意将相同的缺陷添加到多个源文件中,而StyleCop会在某些情况下报告该问题,但不报告其他情况。
同一代码的早期分支,自10月以来基本未改变,不会显示此行为。除了源代码之外什么也不做更改我可以演示最新代码中存在的问题,但不会出现在10月的代码中。
跳过的文件不包含任何"我是自动生成的"我期望让MarkCop跳过它们的标记,我发现跳过的文件或分析的文件之间没有共性。
解决方案文件在分支之间不变,对csproj文件的唯一更改是添加/删除源文件。
有没有人有任何想法可能导致这种行为?
答案 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时是不愉快的。