使用 Visual Studio DNX 项目 (.xproj) 的代码分析
Use code analysis with Visual Studio DNX project (.xproj)
在 "ordinary" Visual Studio 项目 (.csproj) 的属性中,可以说 在构建时启用代码分析(以前称为 FxCop) .
自从我开始研究新的 DNX 项目 (.xproj) 以来,我一直在寻找类似的东西。我知道可能没有构建输出,所以旧方法可能不适合这种情况,但我很确定代码分析/FxCop 规则仍然适用。此外,应该有一些方法可以在新的 "actual" 项目文件 (project.json).
中注册自定义规则集 (.ruleset) 文件
也许我忽略了一些基于 Roslyn 等的更现代的东西?
在 ASP.NET 工具 GitHub 网站 here 上存在一个问题。它目前不受支持,但有望很快得到实施。当从 xproj 切换回 csproj 时,代码分析将再次工作。
更新
StyleCop.Analyzers 现在支持 xproj。
终于找到了一个解决方法,在他们(希望)用下一版 .NET Core 和 Visual Studio 修复它之前应该这样做。诀窍是为经典 .NET Framework 构建执行 "good old" FxCop,这是 运行 老式代码分析所必需的。
图书馆的 project.json 应该包含类似的内容:
{
"frameworks": {
"net46": {
"buildOptions": {
"define": [ "CODE_ANALYSIS" ]
}
},
"netstandard1.3": {
"dependencies": {
"NETStandard.Library": "1.6.0"
}
}
},
"scripts": {
"postcompile": "../../CodeAnalysis.cmd %compile:TargetFramework% %compile:Configuration% %compile:OutputFile% %compile:CompilerExitCode%"
}
}
"apps" 的 project.json 应该包括实际的 运行 时间:
{
"scripts": {
"postcompile": "../../CodeAnalysis.cmd %compile:TargetFramework% %compile:Configuration% %compile:OutputFile% %compile:CompilerExitCode% %compile:RuntimeOutputDir%"
}
}
因此,使用 postcompile 事件可以 运行 某种批处理脚本来执行经典的 FxCop (需要 Visual Studio!)。我目前正在使用包含三个文件的设置:
- CodeAnalysis.cmd
- CodeAnalysis.ruleset
- CodeAnalysis.xml(字典)
批处理文件 "supports" 当前 .NET Framework 4.6 版本,如下所示:
@echo off
if not [%4]==[0] (
goto :eof
)
if not [%2]==[Release] (
goto :eof
)
if [%1]==[net46] (
set VERSION=v4.6
) else if [%1]==[net461] (
set VERSION=v4.6.1
) else if [%1]==[net462] (
set VERSION=v4.6.2
) else (
goto :eof
)
if not [%5]==[] (
set FILE=%5\%~nx3
) else (
set FILE=%3
)
set PLATFORM=%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETFramework\%VERSION%
set DIRECTORY=%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETFramework\%VERSION%\Facades
set FXCOP=%VS140COMNTOOLS:Common7\Tools=Team Tools\Static Analysis Tools\FxCop%FxCopCmd.exe
set RULES=%VS140COMNTOOLS:Common7\Tools=Team Tools\Static Analysis Tools\FxCop%Rules
"%FXCOP%" /platform:"%PLATFORM%" /directory:"%DIRECTORY%" /rule:"-%RULES%" /ruleset:"=%~dp0CodeAnalysis.ruleset" /dictionary:"%~dp0CodeAnalysis.xml" /file:"%FILE%" /ignoregeneratedcode /console /culture:de-DE
它不像普通的内置东西那么方便,但是 FxCop 的错误/警告出现在 错误列表 中使用 Visual Studio(有时需要第二次构建)。尽管它们不会导致构建失败(也许还有另一个技巧...)。
CodeAnalysis.ruleset 示例:
<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="All Rules, except a few ones" ToolsVersion="14.0">
<IncludeAll Action="Error" />
<Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
<!-- CLS compliant -->
<Rule Id="CA1014" Action="None" />
<!-- COM visibility -->
<Rule Id="CA1017" Action="None" />
</Rules>
</RuleSet>
在 "ordinary" Visual Studio 项目 (.csproj) 的属性中,可以说 在构建时启用代码分析(以前称为 FxCop) .
自从我开始研究新的 DNX 项目 (.xproj) 以来,我一直在寻找类似的东西。我知道可能没有构建输出,所以旧方法可能不适合这种情况,但我很确定代码分析/FxCop 规则仍然适用。此外,应该有一些方法可以在新的 "actual" 项目文件 (project.json).
中注册自定义规则集 (.ruleset) 文件也许我忽略了一些基于 Roslyn 等的更现代的东西?
在 ASP.NET 工具 GitHub 网站 here 上存在一个问题。它目前不受支持,但有望很快得到实施。当从 xproj 切换回 csproj 时,代码分析将再次工作。
更新
StyleCop.Analyzers 现在支持 xproj。
终于找到了一个解决方法,在他们(希望)用下一版 .NET Core 和 Visual Studio 修复它之前应该这样做。诀窍是为经典 .NET Framework 构建执行 "good old" FxCop,这是 运行 老式代码分析所必需的。
图书馆的 project.json 应该包含类似的内容:
{
"frameworks": {
"net46": {
"buildOptions": {
"define": [ "CODE_ANALYSIS" ]
}
},
"netstandard1.3": {
"dependencies": {
"NETStandard.Library": "1.6.0"
}
}
},
"scripts": {
"postcompile": "../../CodeAnalysis.cmd %compile:TargetFramework% %compile:Configuration% %compile:OutputFile% %compile:CompilerExitCode%"
}
}
"apps" 的 project.json 应该包括实际的 运行 时间:
{
"scripts": {
"postcompile": "../../CodeAnalysis.cmd %compile:TargetFramework% %compile:Configuration% %compile:OutputFile% %compile:CompilerExitCode% %compile:RuntimeOutputDir%"
}
}
因此,使用 postcompile 事件可以 运行 某种批处理脚本来执行经典的 FxCop (需要 Visual Studio!)。我目前正在使用包含三个文件的设置:
- CodeAnalysis.cmd
- CodeAnalysis.ruleset
- CodeAnalysis.xml(字典)
批处理文件 "supports" 当前 .NET Framework 4.6 版本,如下所示:
@echo off
if not [%4]==[0] (
goto :eof
)
if not [%2]==[Release] (
goto :eof
)
if [%1]==[net46] (
set VERSION=v4.6
) else if [%1]==[net461] (
set VERSION=v4.6.1
) else if [%1]==[net462] (
set VERSION=v4.6.2
) else (
goto :eof
)
if not [%5]==[] (
set FILE=%5\%~nx3
) else (
set FILE=%3
)
set PLATFORM=%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETFramework\%VERSION%
set DIRECTORY=%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETFramework\%VERSION%\Facades
set FXCOP=%VS140COMNTOOLS:Common7\Tools=Team Tools\Static Analysis Tools\FxCop%FxCopCmd.exe
set RULES=%VS140COMNTOOLS:Common7\Tools=Team Tools\Static Analysis Tools\FxCop%Rules
"%FXCOP%" /platform:"%PLATFORM%" /directory:"%DIRECTORY%" /rule:"-%RULES%" /ruleset:"=%~dp0CodeAnalysis.ruleset" /dictionary:"%~dp0CodeAnalysis.xml" /file:"%FILE%" /ignoregeneratedcode /console /culture:de-DE
它不像普通的内置东西那么方便,但是 FxCop 的错误/警告出现在 错误列表 中使用 Visual Studio(有时需要第二次构建)。尽管它们不会导致构建失败(也许还有另一个技巧...)。
CodeAnalysis.ruleset 示例:
<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="All Rules, except a few ones" ToolsVersion="14.0">
<IncludeAll Action="Error" />
<Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
<!-- CLS compliant -->
<Rule Id="CA1014" Action="None" />
<!-- COM visibility -->
<Rule Id="CA1017" Action="None" />
</Rules>
</RuleSet>