2015-09-04 51 views
5

所以在VS2013我們有一個選項「從生成的代碼(僅託管)禁止結果排除C#SONAR分析生成的代碼

做通過SONAR進行分析時,我們有一個類似的選項?

當上述選項未選中時,下面的代碼報告違規,但在SONAR中看不到任何選項可使用上述選項。 我確實嘗試了Sonar.dotnet.excludeGeneratedCode = true選項,但似乎沒有任何區別。

public IEnumerable<string> YieldTest() 
    { 
     foreach(var num in Enumerable.Range(100, 100)) 
      yield return string.Format("{0}", num); 
    } 
+0

分析儀如何知道它應該從分析中排除該方法?你是否用一些特殊的屬性標記了它,是在一個特定的文件中,還是在特殊的項目類型中? –

+0

嗨Dinesh,我試着用[GeneratedCode]屬性標記方法,但它沒有幫助。 – PankajH

+0

如果您在Visual Studio中分析上述方法並取消選中上述選項,則會得到CA1305的違規問題,並且選中時不會違規。 – PankajH

回答

2

MSBuild SonarQube Runner(至少在版本1.0和1.0.1中)始終強制在生成過程中啓動FxCop時檢查「生成代碼的抑制結果(僅限管理)」標誌。見SonarQube.Integration.targets#L342

您可以在構建日誌驗證此行爲,通過看在RunCodeAnalysis:階段推出的命令:

RunCodeAnalysis: 
    Running Code Analysis... 
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\FxCop\FxCopCmd.exe 
    /outputCulture:1033 
    /out:"bin\Debug\ConsoleApplication1.exe.CodeAnalysisLog.xml" /file:"bin\Debug\ConsoleApplication1.exe" /ruleSet:"=C:\Users\dinesh\Desktop\tmp\ConsoleApplication1\.sonarqube\conf\\SonarQubeFxCop-cs.ruleset" 
    [... references ...] 
    /rulesetdirectory:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\\Rule Sets" 
    /rule:"-C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\FxCop\\Rules" 
    /searchgac /ignoreinvalidtargets /forceoutput /successfile **/ignoregeneratedcode** /saveMessagesToReport:Active /timeout:120 /reportMissingIndirectAssemblies 

您應該看到/ignoregeneratedcode傳遞給FxCopCmd.exe。

現在,只有FxCop規則將被該標誌抑制。例如,StyleCop和ReSharper規則不會理解此標誌,並且仍會報告該方法。

僅供參考,由於存在yield語句,似乎FxCop排除了此方法:C#編譯器爲此語句在程序集中生成相當複雜的IL代碼。 FxCop分析程序集(而不是源代碼),這就是爲什麼它必須將yield語句視爲生成的代碼。

因此,在SonarQube中,無論您是否在項目中選中了「抑制生成代碼的結果(僅管理)」,您都不會看到CA1305的問題。

+0

嗨Dinesh,我只是檢查日誌和FxCop被調用只是「/ forceoutput/searchgac」標誌,我沒有看到/ ignoregeneratedcode :(。我必須做任何配置更改爲SONAR,使此標誌有效? – PankajH

+0

正如您在MSBuild SonarQube Runner資源中看到的那樣,它確實試圖強制這個標誌爲'true'。我可以想象的是,其他一些定製目標將在稍後再次設置爲'false'。把這個方法放在一個新的控制檯應用程序項目中(使用默認的.csproj文件)?如果這樣做沒有幫助,你可以嘗試從另一臺機器運行分析嗎?你還可以提供你正在使用構建項目的MSBuild版本嗎?我們正在密集測試12&14。 –

+0

我正在嘗試使用MsBuild Runner,請更新您。謝謝 – PankajH

0

我用這個屬性集運行,它排除了生成的代碼。

sonar.exclusions=**/*.Tests/**,**/*Language.Designer.cs,**/*.generated.cs 

如果我們看看細節,排除包含以下幾個部分:

  • /*.Tests/ ==>排除與.Tests(遞歸)結尾的文件夾中找到的所有代碼
  • **/* Language.Designer.cs ==>排除所有資源ID文件
  • **/*。generated.cs ==>排除所有文件.generated.cs結束

如果您使用其他生成的文件(如winforms設計器文件),您將需要問自己的口罩。

+0

我Filip,我試過這種方法,但它似乎並沒有工作。 – PankajH