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),那并不容易。

  1. 在哪里能够找到扩展?
  2. 如何管理扩展的生命周期,包括安装、更新和卸载?

在过去,想要找到针对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扩展会提升开发的生产力。

查看英文原文:Extension Manager in Visual Studio 2010

This entry was posted in IDE. Bookmark the permalink.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s