2013-07-29 11 views
6

Próbuję przenieść nasze niestandardowe reguły FxCop (= Analiza kodu) z Visual Studio 2010 do Visual Studio 2012.Reguły niestandardowe FxCop nie mają nazwy w VS2012 (ale "oficjalne" reguły mają nazwę)

tej pory działają dobrze z wyjątkiem jednej rzeczy: ich nazwa jest pusty w oknie wyników (View ->Other windows ->Code Analysis), tylko CheckId i Resolution pojawi się, gdy nazwa jest pokazany na zasadach Microsoft:

The name isn't visible on the right of the CheckId on the custom rule, but is visible on the Microsoft rule.

Co to jest nieznajomy ge, jest to, że nazwa jest widoczne w edytorze zestawu reguł:

The name is visible on both rules in the ruleset editor

Co jest nie tak z moimi zasadami?

Szczegóły

Oto jak obie reguły pojawiają się na wyjściu msbuild za (jest podejrzany coś tam, ale nie rozumiem, dlaczego mam inny komunikat):

6>c:\Users\Me\MySolution\MyProject\Program.cs(15): warning : CA1804 : Microsoft.Performance : 'Foo<T>.SomeMethod()' declares a variable, 'z', of type 'int', which is never used or is only assigned to. Use this variable or remove it. 
6>MSBUILD : warning : CF1001 : CustomRules.ThreadSafety : The public Public Field "Tests.Program.Foo" must be preceded of readonly 

Oto deklaracja reguły w pliku XML dla mojej reguły:

<?xml version="1.0" encoding="utf-8" ?> 
<Rules FriendlyName="CustomRules"> 
    <Rule TypeName="PublicFieldsMustBeReadonly" Category="CustomRules.ThreadSafety" CheckId="CF1001"> 
    <Name>Public Fields must be readonly or must be replaced with a Getter/Setter Method.</Name> 
    <Description>Public Fields must be readonly or must be replaced with a Getter/Setter Method.</Description> 
    <GroupOwner>MyCompany</GroupOwner> 
    <DevOwner>Me</DevOwner> 
    <Owner>Me</Owner> 
    <Url>http://example.com</Url> 
    <Resolution>The public Public Field "{0}" must be preceded of readonly</Resolution> 
    <Email>[email protected]</Email> 
    <MessageLevel Certainty="100">Warning</MessageLevel> 
    <FixCategories>Breaking</FixCategories> 
    </Rule> 
</Rules> 

I tutaj jest deklaracja reguły w XML dla reguły Microsoftu.

<Rules FriendlyName="Performance Rules"> 
    <Rule TypeName="RemoveUnusedLocals" Category="Microsoft.Performance" CheckId="CA1804"> 
    <Name> 
     Remove unused locals 
    </Name> 
    <Description> 
     Remove locals that are not used or are only assigned to in method implementations. 
    </Description> 
    <Url> 
     @ms182278(VS.100).aspx 
    </Url> 
    <Resolution> 
     {0} declares a variable, {1}, of type {2}, which is never used or is only assigned to. Use this variable or remove it. 
    </Resolution> 
    <Email /> 
    <MessageLevel Certainty="95"> 
     Warning 
    </MessageLevel> 
    <FixCategories> 
     NonBreaking 
    </FixCategories> 
    <Owner /> 
    </Rule> 
</Rules> 

Odpowiedz

6

Dzieje się tak dlatego, że nazwa reguły (w przeciwieństwie do swojej nazwy typu klasy) nie jest zawarta w wiadomości naruszenie w sprawozdaniu FxCop generowanego przez metę Code Analysis. Teoretycznie Visual Studio może (i prawdopodobnie powinno) szukać nazwy reguły pod węzłem <Rules> zanim zacznie szukać gdzie indziej. Jednak nie ma to miejsca w VS 2012. Zamiast tego pobiera tylko nazwy reguł od informacji o regułach uzyskanych z załadowanych zestawów reguł.

Trudne jest to, że w przypadku wyświetlania interfejsu użytkownika program Visual Studio wykonuje całkowicie oddzielne wyszukiwanie i ładowanie zestawów reguł, niż w przypadku wykonywania analiz kodu. Ta ostatnia jest wykonywana przez uruchomienie fxcopcmd.exe z wiersza polecenia wygenerowanego z właściwości MSBuild. Ta pierwsza używa całkowicie oddzielnej logiki osadzonej w wtyczkach Visual Studio do Analizy Kodów i nie bierze pod uwagę lokalizacji reguł na poziomie projektu ani plików reguł. (Wydaje się odbywać za pomocą klasy Microsoft.VisualStudio.CodeAnalysis.ManagedRuleProvider w zespole CodeAnalysis.dll, jeśli jesteś ciekawy o krwawych szczegółów.)

Więc ... w zasadzie są dwie opcje, jeśli chcesz zobaczyć nazwy zasada:

  1. Umieść zestaw reguł w folderze <VS install directory>\Team Tools\Static Analysis Tools\FxCop\Rules, aby został pobrany przez program Visual Studio.

  2. Dodaj węzeł rejestru HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\Code Analysis\FxCopRulePath (utwórz nowy klucz o nazwie Code Analysis, z miejsca, zamiast korzystania z istniejącej CodeAnalysis) o wartości jak poniżej, aby umożliwić zarówno twoje zasady i wbudowanej zasady mają swoje nazwy wyświetlane: %FxCopDir%\Rules;C:\Foo\Bar\YourRulesFolder

+0

W moim przypadku użyłem 'tag RuleHintPaths' katalogu' .ruleset' pliku, aby dać drogę do mojego DLL, ale jak mówisz plugin VS wydaje się je ignorować. Dziękuję za odpowiedź, nawet jeśli nie jest to ta, którą chciałbym zobaczyć :). –

+0

Kopiowanie plików do ' \ Team Tools \ Static Analysis Tools \ FxCop \ Rules' ale jest nieoptymalne, ponieważ często dodajemy lub modyfikujemy reguły. Klucz rejestru był nieobecny w moim systemie, więc próbowałem go utworzyć, ale wydaje się, że nie działa. Mam 64-bitowy system Windows 7, czy klucz mógł zostać umieszczony w innym miejscu? Dzięki! –

+0

Czy ponownie uruchomiłeś program Visual Studio po dodaniu klucza rejestru? Czy próbowałeś dodać wartość FxCopRulePath do istniejącego klucza 'HKEY_CURRENT_USER \ Software \ Microsoft \ VisualStudio \ 11.0 \ CodeAnalysis', czy też utworzyłeś nowy klucz' Code Analysis' zawierający spację między słowami? (To ostatnie jest konieczne.) –