Visual Studio 2008 代码审查插件 ReviewPal






4.59/5 (17投票s)
ReviewPal 是一个 Visual Studio 2008 IDE 插件,用于辅助代码审查。它能帮助用户收集审查意见,并在 IDE 中轻松导航和报告这些意见。

引言
代码审查对于软件项目/产品维护代码质量(间接提高整体质量)和通过指出最佳实践等来分享知识是必不可少的。市面上用于代码审查的工具并不多,而且并非所有工具都符合组织的需求。这个工具的作用是让代码审查和处理审查意见变得非常容易,并且付出更少的努力。
背景
代码审查或由代码所有者处理审查意见,即使没有工具也可以进行。甚至可以使用 Excel 文件来完成,审阅者在 Excel 文件中记录他的意见,然后将其传递给代码所有者,代码所有者通过在 Excel 文件中提到的代码区域进行导航来处理意见。但是,作为为他人提供软件解决方案的专业人士,我们应该这样做吗?
这个过程应该与开发 IDE 紧密集成,并且在代码审查过程中,审阅者或开发人员都不需要切换到其他不相关的应用程序(除非真正需要,而不是仅仅为了阅读意见和导航到正确的位置)。
所以我的想法是寻找一个 IDE 插件来帮助解决这个问题,这样审查就可以完全在 IDE 内部完成。由于找不到完全符合我期望的工具,我考虑自己开发一个。
Using the Code
这是一个 Visual Studio IDE 的插件,所以你需要做的就是部署插件并启用它来使用。如果你不关心代码,只想尝试一下,你只需要下载“ReviewPal Add-In binaries”并将其复制到插件目录。
插件位置:C:\Users\Chathuranga\Documents\Visual Studio 2008\Addins (我在 Windows 7 上的机器)。
Visual Studio 插件的工作原理是通过“.AddIn”文件。在 VS IDE 启动时,它会查找插件位置,通常是当前用户文档文件夹下的“Visual Studio 2008”文件夹,并加载这些插件。这些 .AddIn 文件只是 XML 文件,如下所示:
<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<Extensibility xmlns="http://schemas.microsoft.com/AutomationExtensibility">
<HostApplication>
<Name>Microsoft Visual Studio</Name>
<Version>9.0</Version>
</HostApplication>
<Addin>
<FriendlyName>ReviewPal</FriendlyName>
<Description>ReviewPal - Code review companion.</Description>
<AboutBoxDetails>For more information about </AboutBoxDetails>
<AboutIconData>000001000600200</AboutIconData>
<Assembly>E:\VS.Net\ReviewPal\ReviewPal\bin\ReviewPal.dll</Assembly>
<FullClassName>ReviewPal.Connect</FullClassName>
<LoadBehavior>0</LoadBehavior>
<CommandPreload>0</CommandPreload>
<CommandLineSafe>0</CommandLineSafe>
</Addin>
</Extensibility>
这里重要的标签是 <Assembly>
,它包含插件的 DLL 位置。仅供使用:此项可以设置为与 .AddIn 文件相同目录中的 DLL 的发布版本,或者安装文件夹中的 DLL。如果你要开发插件或进行调试,可以将其指向 DLL 的调试文件夹。
Visual Studio 插件的起点是“Connect
”类,它实现了“IDTExtensibility2
”和“IDTCommandTarget
”这两个接口。这个类在创建“Visual Studio Add-In”模板(位于“Other project types --> Extensibility”下)的项目时会自动生成。然后,需要在“Connect
”类的“OnConnection
”方法上进行关键的更改。
public void OnConnection(object application,
ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
visualStudioInstance = (DTE2)application;
_addInInstance = (AddIn)addInInst;
try
{
object programmableObject = null;
String guidstr = "{858C3FCD-8B39-4540-A592-F31C1520B174}";
EnvDTE80.Windows2 windows2 = (EnvDTE80.Windows2)visualStudioInstance.Windows;
System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
_windowToolWindow = windows2.CreateToolWindow2
(_addInInstance, asm.Location, "ReviewPal.UI.ReviewWindow", "Review List",
guidstr, ref programmableObject);
_windowToolWindow.Visible = true;
ReviewWindow rCommentControl = (ReviewWindow)_windowToolWindow.Object;
rCommentControl.VisualStudioInstance = visualStudioInstance;
}
catch (Exception ex)
{
Utils.HandleException(ex);
}
}
在这里,我们通过对 Visual Studio 实例的引用获得了 VS 扩展的强大功能,我们将其作为插件内的引用对象(代码中的 visualStudioInstance
变量),这样我们就可以访问 IDE 并控制它。然后,我们加载实现的 UI 元素,“ReviewPal.UI.ReviewWindow
”。请注意,我们通过“windows2.CreateToolWindow2
”方法加载自定义 UI 元素,该方法在 IDE 中创建一个窗口,就像其他内置的 Visual Studio 窗口(如 Solution Explorer 或 Task List)一样。这样,我们就天然地获得了典型 VS IDE 窗口的所有行为,如停靠、浮动等。
设置好之后,开发过程就变得非常类似于开发 Windows Forms 应用程序,这意味着你可以做任何 Windows Forms 应用程序可以做的事情,并在需要时与 IDE 进行交互。所以我在这里所做的是,提供一个像网格控件一样的审查列表,用户可以填写审查意见。添加新的审查意见时,我们可以通过在初始 OnConnecttion
方法中分配的“VisualStudioInstance
”引用来获取当前的 IDE 属性,如下所示:
TextSelection textSelection =
(TextSelection)VisualStudioInstance.ActiveDocument.Selection;
int line = textSelection.CurrentLine;
int col = textSelection.CurrentColumn;
string file = VisualStudioInstance.ActiveDocument.Name;
string project = VisualStudioInstance.ActiveDocument.ProjectItem.ContainingProject.Name;
启用 Visual Studio 2008 解决方案上的插件后,您可以导航浏览源代码并为代码添加审查意见,这些意见将在您单击保存时保存到 XML 文档中(我选择了 XML 序列化以方便实现)。您可以将审查意见(保存的文件)以任何您喜欢的方式(可能是通过 SVN)传递给代码所有者。然后,代码所有者需要使用相同的插件加载审查文件,他可以轻松地导航到代码位置来处理它们。目前在审查期间收集的数据如下所示:
关于 Visual Studio 中的 Solution Items hierarchy,需要注意的一点是:
VisualStudioInstance.Solution
--Project
----ProjectItems
------ProjectItem
------SubProject
在解决方案中导航以搜索位置时(实现了 ReviewPal.Common.ScanForProjectItems
方法),首先我们需要遍历解决方案中的项目(Projects),然后是项目中的 ProjectItems
。ProjectItem
可能包含内部的 ProjectItems
(例如 ASP.NET 页面包含三个项目:.aspx, .aspx.cs, designer.cs)或者它可能包含 SubProject 或不包含任何内部项。因此,在搜索项目时,为了处理这种情况,我们以递归方式实现。
通过一点 XSLT 的努力,XML 可以变得对没有插件的用户友好,例如:点击这里。

关注点
编写 Visual Studio 插件很有趣,但文档并不多,至少不容易找到。
Visual Studio 2005 Automation Samples 是一个很好的起点。
所以任何人都可以使用这个插件作为样本来开始编写 Visual Studio 插件。作为 Jetbrains Resharper 的粉丝,我尝试用 Resharper 开发插件,也研究了 DX Core,但两者似乎都没有多少文档来帮助上手,最后我想到为什么我要依赖另一个第三方库来实现这种简单(但非常有用:))的插件。
历史
- v .1.0.1 ... 这是初始版本,我将进行更新... 也许会根据您的宝贵意见(当我有一些时间时)