65.9K
CodeProject 正在变化。 阅读更多。
Home

在 VSIX 包中部署代码片段

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2014年11月6日

CPOL

7分钟阅读

viewsIcon

27712

downloadIcon

195

通过 VSIX 包分发代码片段的技术。

引言

如果你在 Google 上搜索 “什么是代码片段”,你会很快得到如下答案:

代码片段是预制的代码块,可以快速插入到你的代码中。例如,`for` 代码片段可以创建一个空的 `for` 循环。有些代码片段是“环绕”代码片段,允许你选择几行代码,然后选择一个代码片段来包含这些选定的代码行。

 

我不会深入讲解如何创建代码片段或它们的工作原理。如果你对此感兴趣,可以阅读 MSDN 上的这篇文章:MSDN。我想展示的不是一个显而易见的东西,而是如何通过 VSIX 包部署你的代码片段,并将其作为扩展注册到 Visual Studio 中(享受由此带来的所有好处)。

在我开始这项任务之前,我只找到了一篇讨论此过程的文章。在 Mads Kristensen 的博客上,你可以找到一篇题为 Shipping Visual Studio snippets in an extension 的博文。你可能会问,那你为什么要写这篇文章呢?嗯,首先,(在我写作时)该博客有几个技术问题,图片无法显示,布局也不对,这使得它非常难以遵循。其次,为了成功完成这项任务,该指南缺少几个重要的步骤,我将尝试更详细地描述这些步骤,并提供一个可用的代码示例。

还有另一种部署代码片段的方法,你可以在 MSDN 上找到关于通过 Visual Studio 内容安装程序分发代码片段的文章。我将不详细描述这两种方法的区别以及优缺点。它们都是处理此问题的有效方法,你应该根据自己的情况选择最适合的方向。

背景

在我们开始之前,请确保你已下载并安装了 Visual Studio SDK。它应该与你使用的 Visual Studio 版本相匹配。对于 2013 版本,你可以从 这里 下载。

安装完成后,除了其他功能外,你将在 Visual Studio 中获得一些新的项目模板,如下图所示:

此时,我们将创建一个稍后要部署的代码片段。创建一个具有代码片段扩展名的文本文件,在本例中我将其命名为 `helloworld.snippet`。文件内容如下:

<!--?xml version="1.0" encoding="utf-8"?-->

  
    <Header>
      <Title>Hello World</Title>
      Mario Majcica
      For demo purposes inserts a simple Hello World in your code
      http://blog.majcica.com/2014/10/27/deploying-snip…n-vsix-package/
      
      
      
    </Header>
    
      
      
      
      <![CDATA[Console.WriteLine("Hello, World!")]]>
    
  

这是最简单的代码片段!将其保存在一个方便的位置,因为稍后我们将使用此文件。你可以轻松地通过专用工具创建代码片段。我在 Codeplex 上找到了一个很棒的免费工具,名为 “Snippet Editor”,它做得非常好。伙计们,干得漂亮!

创建部署项目

打开 Visual Studio 并创建一个新的 *VSIX 项目*。点击“确定”后,将生成一个新项目,你会看到如下屏幕:

你看到的是一个典型的 `vsixmanifest` 设计器窗口(如果你使用的不是 Visual Studio 2013,可能会有所不同)。你可以根据自己的需求随意更改这些字段,并且可以通过简单地“谷歌搜索” `vsix` 包来找到大量关于此主题的指南。现在我们可以关闭此窗口。接下来,我们在解决方案中添加一个名为“Snippets”的文件夹。在我的例子中,我将再添加一个名为“My snippets”的子文件夹。在这个子文件夹中,我将添加我们之前创建的文件,即 `helloworld.snippet`。一切看起来应该像这样:

我们还没有完成。对于添加的每个代码片段文件,我们需要确保属性设置正确,否则你的代码片段将不会包含在 VSIX 包中。右键单击你的代码片段,将“Build Action”(生成操作)更改为“Content”(内容),并将“Include in VSIX”(包含在 VSIX 中)更改为“True”。完成后,它应该看起来像这样:

你需要对添加到此项目中的所有代码片段执行相同的操作。请记住,你可以在“解决方案资源管理器”中选择多个文件并一次性完成此操作。完成后,我们唯一缺少的就是一种注册代码片段的方法。包定义(package definition)在此任务中可以非常有用。

使用 pkgdef 注册

包定义(`.pkgdef`)文件是一种将应用程序配置信息封装在易于编辑、分发和部署的格式中的方法。它在 Visual Studio 2008 SP1 中引入,用于支持 Isolated Shell 应用程序的配置。从 Visual Studio 2010 开始,`.pkgdef` 文件扮演了更广泛的角色,并且与 IDE 和 Shell(Integrated 和 Isolated)的集成度更高。

包定义文件看起来很像从注册表编辑器导出的 `.reg` 文件。有一个关键区别:注册表项的根目录(例如 `“HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\12.0”`)已被抽象为一个名为 `$RootKey$` 的令牌。这个令牌以及其他一些用于注册表项和路径的令牌化值,允许给定的 `.pkgdef` 文件可重用于多个应用程序并在任何计算机上可移植。VSIX 项目可以轻松利用包文件。一旦 `.pkgdef` 文件被添加到项目中,只需将其作为资产添加到 VSIX manifest 中即可完成任务。这意味着它将在安装过程中被执行。让我们详细看看如何实现这一点。

首先,在项目根目录中创建一个名为 `snippets.pkgdef` 的文本文件。内容指定如下:

// C#
[$RootKey$\Languages\CodeExpansions\CSharp\Paths]
"MySnippets"="$PackageFolder$\Snippets\My Snippets"

如你所见,我使用了一些令牌(替换字符串),例如 `$RootKey$` 和 `$PackageFolder$`。你可以在 以下地址 找到这些字符串的列表。这段代码的作用是在注册表中创建一个名为 `MySnippets` 的键,路径为 `HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0Exp_Config\Languages\CodeExpansions\CSharp\Paths`(在我们的例子中,即 VS2013 和实验版本,因此 `12.0Exp_Config` 键会根据你的环境而有所不同,这也意味着 `$RootKey$` 会根据上下文动态替换为一个不同的字符串)。我的 `MySnippets` 键的值等于 `$PackageFolder$\Snippets\My Snippets`,其中 `$PackageFolder$` 将被替换为文件部署目录的完整路径。文件创建完成后,我们需要将其“连接”到 VSIX 包。打开你的 manifest 设计器并切换到“Assets”(资产)选项卡:

点击“New”(新建)添加一个新资产,并按以下方式进行设置:

该资产应为 `VsPackage` 类型,并且“Source”(源)应设置为“File on filesystem”(文件系统上的文件)。对于“Path”(路径),选择你的 `.pkgdef` 文件的路径。点击“OK”即可完成。如果你更喜欢通过编辑 `vsixmanifest` 而不是使用设计器来完成此操作,你可以在 `PackageManifest` 元素中添加以下内容:


  

部署和测试

我们可以快速检查我们的扩展是否按预期工作。简单地按 F5 键将以实验模式启动 Visual Studio 并部署我们的扩展。让我们试试。首先,我们将检查扩展是否已部署。转到 `TOOLS` -> `Extensions and updates...`(工具 -> 扩展和更新...)菜单。你应该在那里找到你的扩展。它应该看起来与下图类似:

如果一切正常,第二件要做的事是检查代码片段是否已正确注册。转到 `TOOLS` -> `Code Snippets Manager...`(工具 -> 代码片段管理器...)或按 `CTRL + K`,`CTRL + B`。打开“Code Snippets Manager”窗口后,在“Language”(语言)下拉菜单中选择“Visual C#”,你应该会看到你的代码片段已注册并对 Visual Studio 可见,如下图所示:

你现在可以为发布版本构建项目,并分发你的 `SnippetsCollection.vsix` 包。bin 文件夹中的所有其他文件都不是必需的。安装非常简单,如果你决定支持多个 Visual Studio 版本,唯一会提示你的就是你想为其安装扩展的 Visual Studio 版本。

考虑因素

本文展示了一种优雅的分发代码片段的方法。在维护方面,它也是一个很棒的解决方案,因为只需增加 VSIX 包的版本,你就可以部署你的更改。如果你决定通过私有库分发 VSIX 包,你将使所有用户的安装和更新尽可能简单。

你可以 在这里这里 阅读更多关于此主题的信息。你也可以考虑将你的 wsix 作为安装程序的一部分进行部署,我很快就会写更多关于这个主题的文章。如果遇到调试问题,你可以查看我的一篇技巧文章 重置 Visual Studio 实验实例。如果你有任何疑问,请随时评论。

历史

初始版本适用于 Visual Studio 2012 和 Visual Studio 2013。

© . All rights reserved.