详解Visual Studio 2010中的扩展管理器
扩展能够为核心应用程序提供附加的功能或者自定义设置。在很多应用程序中这都是很流行的,包括流行的web浏览器IE和Firefox、微软的Office、媒体播放器、Photoshop、Eclipse、Visual Studio等等。其中有些可能比较新奇,而针对开发工具——像Eclipse和Visual Studio——的扩展让开发者的生产力得到了显著提高。
Visual Studio早期的版本是构建在COM技术之上的。而Visual Studio的主要扩展方式插件是通过COM接口实现的。随着时间的变化,插件机制已经得到了改善。在2002年,随着Visual Studio .NET的发布,微软引入了.NET和COM之间的互操作性。在Visual Studio 2005中,插件支持使用XML的简化部署方式。之后不久,微软发布了Visual Studio SDK开发包,这是一种更为新式的机制,通过底层的API提供了与Visual Studio的IDE更深层次的整合。
随着时间的推移,Visual Studio扩展的部署技术也得到了改善。在Visual Studio 2005中引入了Visual Studio 内容安装器(Content Installer VSI),它可以用于部署宏、插件、工具箱控件、代码片段以及模板。而更广泛地用于应用程序安装的Windows安装包(MSI),则成为针对Visual Studio包的主要部署技术。 VSI和MSI格式的文件中都包含了完整的分发包。
这种设计导致了一些交付问题。为了获得扩展,用户需要在不计其数的网络站点中搜索、下载和安装。管理扩展的依赖关系和更新既不简单,也不易懂。
在Visual Studio 2010增加的多种新特性中,新的扩展管理器就是为了解决扩展部署问题的。它遵循了一种新的用于发布和部署第三方扩展的趋势,这种趋势是由于像Firefox和Eclipse这样的项目而变得流行。
本文会向你介绍Visual Studio 2010的扩展管理器。你会了解到如何构建简单的扩展,并把它部署到Visual Studio Gallery中。
崭新的用户体验
应用程序扩展是与核心应用程序分别发布的。传统上认为它们更像是独立的应用程序。尽管随着时间的推移,Visual Studio扩展性的很多方面都得到了改善,然而交付机制还是没有太多的改变。它遵循的是双击工作流(double-clicking workflow),那并不容易。
在哪里能够找到扩展?
如何管理扩展的生命周期,包括安装、更新和卸载?
在过去,想要找到针对Visual Studio的正确的扩展,我们需要做大量的搜索工作。开发者可以在Internet上搜索扩展,或者可以从杂志的文章中、论坛的帖子中或者博文中获得扩展的信息。但我们很难发现所有可用的选择,而且也很难对类似的扩展进行比较。
有了Visual Studio Gallery之后,这种状况已经得到了改变。这个站点是Visual Studio扩展的官方和集中资源所在。你可以浏览并且订阅扩展的RSS。你还可以阅读评论,并提供你的反馈,对扩展打分。
Visual Studio 2010的扩展管理器是与Visual Studio Gallery结合使用的。它把Visual Studio Gallery带到了Visual Studio IDE中(如图1所示)。我们不再需要使用web浏览器来搜索或者运行安装程序了。在Visual Studio 2010中,我们可以通过Tools | Extension Manager菜单来打开扩展管理器。当扩展管理器打开之后,它会列出已经安装了的扩展。如果对于扩展有更新可用,也会在其中列出来。在左边的面板中,点击“Online Gallery”标签页,你就可以浏览和搜索在“Visual Studio Gallery”中可用的扩展了。当你选择一项扩展,相关的描述就会显示在右侧的面板中。点击“下载”按钮,扩展管理器马上就会开始下载选中的扩展。
图1 Visual Studio 2010的扩展管理器
有时,安装一项扩展需要重启Visual Studio。这也没关系。 IDE会返回之前的样子,载入最新的解决方案。删除扩展同样很容易。通过Tools | Extension Manager 菜单打开扩展管理器,选择扩展,然后点击“Uninstall”按钮。
它不仅提供了简单的方式,让我们可以在Visual Studio IDE中搜索和安装扩展。还提供了对扩展完整的生命周期管理。我们还可以在Visual Studio IDE中对扩展进行启用/禁用、更新和卸载。
在扩展管理器中启用和禁用扩展的能力是值得一提的。正如你将在本文的下一部分将会看到的,创建扩展并把它上传到Visual Studio Gallery中要比之前容易得多。再也没有批准流程。上传的内容马上就可以访问。这可能有些风险。某些扩展会有质量问题,或者与其它扩展冲突。在那种情况下,禁用特性会为其提供帮助。
自动的扩展更新通知也是很棒的特性。每次你打开VS 2010的一个实例的时候,它就会自动检查已经安装的扩展的更新。当找到更新的时候,它就会在系统托盘中显示通知图标。点击通知,它就会载入扩展管理器来安装新的更新。这确保你能够拥有最新的扩展更新,而不需要手动地搜索更新。
有一些扩展对于开发者是必需的。在Internet上,人们会告诉你他们最喜欢的扩展。在此我列出了我所选择的部分。建议你尝试使用它们。那很容易,并且如果你不喜欢,总是可以禁用并卸载它们。
Visual Studio Productivity Power Tool,这是一组用于提高生产力的工具,像解决方案导航器、带有改良的标签页的用户界面、可搜索的添加引用对话框,等等。
· Snippet Designer,这种扩展让你可以在Visual Studio中创建代码片段。
· Spell Check,这种扩展为纯文本文件、注释、字符串和HTML/ASP代码提供了拼写检查功能。
· Tangible T4 Editor,这种扩展为T4模板提供了智能提示和语法的突出显示。
· GhostDoc,这是一种能够为C#生成XML文档注释的扩展。
· Feature Builder Power Tool,这种扩展会帮助你创建扩展。
· PowerGUI,这种扩展为PowerShell 脚本提供了智能提示和语法的突出显示。
· IronPython IronRuby Console,这种扩展让你能够在IronPython/IronRuby中与Visual Studio交互。
扩展管理器的体验让我们想到了一些直观的流程,像下载软件到iPhone、下载插件到Firefox、以及从Amazon下载书籍到Kindle上等等。这可能就是消费软件部署的趋势。它是基于Internet或者云,并且与应用程序整合的部署方式。根据最近在网上泄露的“Windows Store for Windows 8”,我们可能会在下一版本的Windows中看到这种软件部署方式。
现在,Visual Studio 2010扩展管理器和Visual Studio Gallery更加以扩展为中心。将来,它会更加以用户为中心。我希望它会记住我所选择的扩展,并在所有我登陆的计算机中应用那些扩展。
在“创建简单的扩展”部分中,我会一步一步地创建Hello World扩展。
在尝试这些步骤之前,你需要确保已经下载并安装了Visual Studio SDK。
创建Visual Studio Package项目
首先,使用“Other Project Types | Extensibilities”下面的Visual Studio Package Project模板创建新的项目。
图2 Visual Studio Package Project 模板
它会载入Visual Studio Package向导,它有七页,我们可以在其中为Hello World包填写基本的信息。这是很简单的过程。在第三步中,我选择了“Menu Command”和“Tool Window”选项,从而展现最初针对菜单项和工具窗口的代码。(图3)
图3 创建菜单命令和工具窗口
检查项目结构
在创建了项目之后,让我们来检查其中都有什么。有些东西是值得注意和说明的。
其中有一个source.extension.vsixmanifest文件。在这个文件中,会生成我们在新建项目向导中输入的信息,还有包的引用和内容。它拥有属于自己的编辑器(图4)。
图4 编辑器中的source.extension.vsixmanifest文件
在项目的属性页中,有一个新的VSIX标签页,让Visual Studio在调试扩展的时候,构建和/或部署VSIX的过程中创建VSIX文件。
图4.1 项目属性页中的VSIX标签页
在Visual Studio 2010之前,扩展是作为安装包部署的,这多少和单独的应用程序有些类似。它们是在Visual Studio之外使用VSI或者MSI分别安装和维护的。开发者经常会认为编写Visual Studio扩展很难,或者那不是一般开发者所能够完成的。那是对的。此外,为Visual Studio扩展创建安装包更困难。
为了给Visual Studio 2008扩展创建安装包,MSDN上的一篇文章“教程:简单的VSPackage部署”建议使用xcopy、安装项目,或者使用Windows Installer XML Toolset (WiX)。在所有情况下,开发者都不得不学习MSI、WiX,或者理解注册表的键值以注册扩展。
使用安装项目的方法,开发者需要编写自定义的安装动作来注册扩展。使用WiX既耗时又容易出错,因为那需要手动编辑XML文件,并且维护很多GUID值。默认情况下,WiX安装只有最少的功能。开发者需要操作更多的XML文件来提供功能,像定义安装文件夹以及显示许可信息等等。
在Visual Studio 2010中,对于开发扩展至少在两个方面做出了改进。使用VSIX来对扩展打包更容易。 VSIX是在Visual Studio 2010中引入的针对扩展的部署单元。VSIX文件是一种使用了开放打包协议(Open Packaging Convention)的压缩文件。我们可以从本地硬盘中像VSI和MSI的方式安装VSIX。 Visual Studio会识别出VSIX的文件扩展名,把它解压并把文件安装在正确的位置中。它还可以通过Visual Studio Gallery进行发布和升级。当你构建扩展项目的时候,Visual Studio 2010扩展项目模板就会生成VSIX文件。
在Visual Studio 2010中,开发者需要处理XML文件。但是开发者不需要编辑原始的XML文件,Visual Studio 2010为其提供了编辑器。那就是新的VSIX说明文件编辑器(图3)。你所需要做的就是指定相同的VSIX ID——唯一的标识符,以及新的版本号。然后把它上传到Gallery中,这样拥有旧版本的用户就可以下载更新。
VSIX本质上是一种简单的xcopy部署方式。安装就是要对包进行复制和解压。卸载只是删除文件夹。它不支持高级的安装特性,像为GAC添加程序集或者创建桌面快捷方式等等。它也不会在Visual Studio之外写入注册表。它不支持自定义的动作。 MSDN上名为“Visual Studio 扩展部署”的文章对VSIX和MSI能做的和不能做的做了详细的说明。
VSIX主要是为了Visual Studio扩展部署而设计的,并且使用Visual Studio Gallery来发布。
构建项目
在构建了项目之后,构建的输出包括封装后的DLL、包定义文件(pkgdef)以及VSIX文件(图5)。
VSIX文件是包的部署文件,你可以把它发送给用户来进行安装,或者上传到Visual Studio Gallery中。
图5 构建输出
调试和运行扩展
在项目的属性页中,调试选项被设置为载入Visual Studio实验环境。(图6)
图6 项目的调试设定
按下F5,就会载入部署了VSIX的Visual Studio实验环境的新实例。 Visual Studio实验环境会与Visual Studio开发环境并行运行。它是用于开发和测试Visual Studio包的沙盒环境。部署在实验环境中的包不会影响你的主开发环境。实验环境拥有自己的设定、注册表项和扩展。我们可以使用开始菜单中的“重置微软Visual Studio 2010实验实例”选项,把它重置为干净的状态。
我们创建的简单扩展会在Tools菜单下添加“Hello World”菜单项(图7),并在“View| Other Windows”下添加“Hello World Tool Window”菜单(图8),我们可以使用它来显示工具窗口(图9)。
图7 Toos菜单下的“Hello World”菜单
图8 “View| Other Windows”下的“Hello World Tool Window”菜单
图9 扩展的工具窗口
包的主要入口点在于Microsoft.VisualStudio.Shell.Package的子类中。它拥有多个与包的注册相关的属性,我们会在安装和注册的过程中使用它们。(图10)
图10 Package类
你可以在名为Initialize的重载函数中编写代码,从而在载入你的包时与Visual Studio交互。在我们简单的包中,“Hello World”和“Hello World Tool Window”菜单都是在这个初始化函数中创建的。
图11 Initialize函数
菜单的回调函数是MenuItemCallBack和ShowToolWindow。当点击“Hello World”菜单的时候,就会触发MenuItemCallBack 函数。默认的代码是要显示一个消息框。它是你的包逻辑的起始点。当点击“Hello World Tool Window”菜单的时候,就会触发ShowToolWindow函数。默认的代码是以标准的方式弹出工具窗口。
工具窗口是Visual Studio IDE的子窗口。和工具箱、解决方案管理器和属性窗口一样,它可以停靠、浮动或者以标签的形式显示在文档框架中。它们是动态的(或者说是自动可见的)。有了Visual Studio 2010对多显示器的支持,工具窗口也可以脱离开来,并拖拽到第二台显示器中。 Visual Studio Package Project模板默认情况下会为工具窗口创建WPF的用户控件。
现在我们已经有了Visual Studio Package的骨架,可以构建他来生成可以分发的VSIX文件,我们或者可以通过复制的形式或者通过Visual Studio Gallery来分发它。
发布到Visual Studio Gallery
想要通过Visual Studio Gallery来发布扩展,只需要三步,就可以发布你的扩展,从而让全世界的开发者都能够访问到它。
·选择你的扩展的类型
·上传VSIX文件
·添加附加的类别和描述。
Visual Studio Gallery会从VSIX中取得元数据,包括名称、ID、版本、公司、许可以及产品的图片。扩展管理器会使用版本号来自动管理扩展的更新。
图12 Visual Studio Gallery
当你的扩展有新版本时,你所需要做的就是在VSIX的说明文件编辑器中更改版本号,构建新的VSIX文件并上传到Visual Studio Gallery中。这样,更新就马上可以提供给用户下载了。当用户启动Visual Studio新的实例时,Visual Studio就会在系统托盘显示新的更新通知。
有时这是很方便的,因为Visual Studio Gallery没有验证过程。发布扩展就像在推特上发布一条消息一样简单。对扩展开发者的一项提示是,你应该尽可能地测试以保证质量。你不应该先上传扩展,然后才开始测试,因为它马上会被大家所发现。 VSIX支持双击安装,就像VSI和MSI一样。如果其中有bug,那么就使用扩展管理器来卸载它,创建新构建的VSIX,然后双击它来安装并进行测试。在开发过程中,你不需要提升版本号。记着在完整地测试之后在把它上传到Visual Studio Gallery中。
这会带来另一种提示。 Visual Studio Gallery不支持私有分发。如果你的扩展只在你的公司的开发者中使用,那么你就不应该把它上传到Visual Studio Gallery中。相反,你应该在公司内部发布VSIX文件。在这种情况下,想要更新扩展,你需要手动地与扩展用户沟通。
Visual Studio Gallery的目的之一就是要创建Visual Studio扩展的生态系统。自从几年之前它可以用于Visual Studio 2008开始,人们已经上传了上千个扩展。与其说是一种商业集市,不如说是一种社区分享站点,就像Apple的App Store和Windows Phone Marketplace一样。如果开发者想要销售他们的扩展,那么就需要找到其它厂商和付费服务,就像旧式的共享软件发布一样。用户无法通过扩展管理器付费。结果是,扩展管理器和Visual Studio Gallery为开源和免费的扩展项目提供了优秀的支持。
总结
Visual Studio 2010的扩展管理器和Visual Studio Gallery提升了扩展用户和扩展开发者的用户体验。你应该始终记着,那里有成千上万的扩展可供你扩充Visual Studio的特性。还应该始终记着,你可以在Visual Studio中搜索和管理扩展的生命周期。如果你对于扩展Visual Studio有什么好主意,那么我建议你试着创建一些Visual Studio扩展。 Visual Studio扩展会提升开发的生产力。