我目前正在编写一个工具来解析大型代码库上的FxCop日志文件。我的目标是提供有关最常见警告的图形信息,按命名空间(应用程序的子系统)排序。
然后可以用它来开始讨论我们关心哪些FxCop规则以及应该采取哪些措施来删除它们。
日志文件包含两种类型的条目。可以从行本身推导出命名空间,而不是从行本身推导出命名空间。请参阅以下示例:
[Any CPU/Release] LoggerWrapper.cs(647,28): warning CS1574: XML comment on 'CompanyName.Utilities.Logging.Internal.LoggerWrapper.WarningException(System.Exception, short, long)' has cref attribute 'CompanyName.Common.Services.Logging.LoggerWrapper.Warning(string)' that could not be resolved
您可以看到此警告属于名称空间CompanyName.Common。
[Any CPU/Release] d:\Bld\CompanyName\2010_MAIN_F\Sources\CompanyName\Utilities\Logging\Store\EventViewer\NativeHelper.cs(254,0): warning : CA1307 : Microsoft.Globalization : 'NativeHelper.GetSid(string, out IntPtr)' makes a call to 'string.IndexOf(string)' that does not explicitly provide a StringComparison. This should be replaced with a call to 'string.IndexOf(string, StringComparison)'.
[Any CPU/Release] (-1,0): warning : CA1823 : Microsoft.Performance : It appears that field 'NativeHelper.IIsApplicationPoolSettingProperty' is never used or is only ever assigned to. Use this field or remove it.
[Any CPU/Release] (-1,0): warning : CA1823 : Microsoft.Performance : It appears that field 'NativeHelper.IIsSettingProperty' is never used or is only ever assigned to. Use this field or remove it.
在此条目中,您无法解析命名空间的最后两个警告。您必须回溯到第一行才能推断出它涉及CompanyName.Utilities命名空间。
您如何处理这种情况? 我不是在寻找100%万无一失的识别标识,但我希望能够将大多数警告解决为相应的命名空间。
到目前为止我的策略: 我正在考虑一个两遍解析器。首先,我将解析可以从同一行推导出命名空间信息的行。在第二遍中,我将搜索没有名称空间信息的行,并将从该位置回溯到具有名称空间信息的第一行。
我没有能力让FxCop生成XML。 Team Foundation Server确实为每个程序集创建XML的单个FxCop文件,但包含ENTIRE日志文件的文件格式如上所述。
有更好的想法或建议吗?
到目前为止的好建议!有关日志文件的一些额外信息。此日志文件由Team Foundation Server teambuild生成。我不知道是否可以从中创建XML版本。
答案 0 :(得分:1)
运行FxCop以便获得XML报告,将其与XSL配对并获得图形表示。我认为有一些XSL表可供选择,但I think this one does the trick。
通常我让CruiseControl.NET使用相关项目的msbuild文件为我做这个。
答案 1 :(得分:0)
您可以以XML格式获取输出,通过嵌套报告来解决此问题。
那加上一剂XSLT,可以为你提供一个格式良好的HTML页面 - 理想情况下应该只是看起来像
Collated style report for solution: 0 messages
Generated: 13/07/2009 11:23:49
答案 2 :(得分:0)
答案很好,但我只能访问ASCII中的普通日志文件,所以XSLT在这里不起作用。
我通过编写自己的解析器来解决它,该解析器尝试从每一行推导出命名空间。如果带有警告的行不包含命名空间,则需要找到最后找到的命名空间。
效果很好。