ASP.NET

使用 SideWaffle 创建您自己的 Visual Studio 模板

Sayed Hashimi
Tyler Hughes

下载代码示例

多亏了新的 Visual Studio 社区版的发布,过去使用速成版的开发人员现在可以使用他们早已耳闻的扩展程序。如果您还不知道的话,这些扩展程序是指可以扩展 Visual Studio 功能的各种插件。有各种类型的扩展程序可供使用。

我们始终在寻找更加有效的编码方法,大概在一年前,我们遇到了称为 SideWaffle (sidewaffle.com) 的扩展程序。SideWaffle 可以将其他开发人员创建的新项目和项模板添加到 Visual Studio,并且可以让您创建自己的模板和代码段。我们将在本文中探索 SideWaffle 并向您展示如何创建自己的模板和代码段。

为什么要使用 SideWaffle?

如前所述,SideWaffle 可将新项目和项模板添加到 Visual Studio。您可能想知道“这如何帮助我?”假设您是为客户端开发网站的自由 Web 开发人员。您可能会有一些特定的重复内容适用于每个网站,也许是使用第三方 JavaScript 库(如 Knockout.js)或设置特定的项目文件夹结构。不管您如何设置一个项目,SideWaffle 都会将该项目变成可重复使用的模板。此外,SideWaffle 包括可重复使用的 NuGet 程序包 TemplateBuilder,其可将模板构建到扩展程序中。

创建模板包

在创建模板之前,您需要对开发环境进行相关设置。当然,您需要的第一个项是 Visual Studio。对于本文而言,我们使用了 Visual Studio 2013 (bit.ly/1GUTLo3) 的社区版。接下来,您需要 Visual Studio 2013 SDK (bit.ly/1NZVkD9)。最后,从 sidewaffle.com 中下载并安装 SideWaffle 扩展程序。

随着所有工具安装到位以及各项准备工作就绪以后,开始打开 Visual Studio,然后新建项目。您可以使用两种类型的项目来创建模板包。第一个是 VSPackage 项目,可以让您在 Visual Studio 中添加上下文菜单或菜单项等功能。第二个是 VSIX 项目,它只是一个容器,可以保留项目文件和资源,而且不提供其他功能。您可以在“扩展性”节点下的“新项目”对话框中找到这两种类型。今天,我们只想要一个基本模板,因此使用 VSIX 项目即可。您可以保留默认项目名称不变。

项目创建以后,它的清单文件会自动打开。“作者”字段是必填字段,因此在此处添加您的姓名(或公司名称)。“说明”是 Visual Studio 扩展程序对话框中将要显示的内容,因此,请务必添加一些有用的文本。然后保存该文件,并将其关闭。下一步是将 TemplateBuilder NuGet 程序包添加到项目,该操作可通过“管理 NuGet 程序包”或“程序包管理器控制台”来完成。

让我们暂停片刻并到后台看一下。当您将 TemplateBuilder 安装到项目后,以下是将会发生的情况:

  1. 添加了对 TemplateBuilder.dll 的引用。此程序集包含自定义向导(可在模板创建过程期间使用)以及其他帮助器。
  2. 修改该项目文件以导入额外的 MSBuild 目标文件,同时构建相应流程以支持向生成的 VSIX 中添加模板。由于这是通过 MSBuild 进行实施的,因此您可以在连续集成服务器上以及从命令行中创建扩展程序。
  3. 属性文件已被添加到 Properties\template-builder.props。您可以指定应包含您模板的节点的默认叶名称。您还可以使用此文件来控制 TemplateBuilder 的特定方面。
  4. 修改 VSIX 清单文件(通常名称为 source.exten­sion.vsixmanifest),为生成的模板添加资产标记。

安装 TemplateBuilder 以后,您便可以开始创建模板。在创建 VSIX 项目时,TemplateBuilder 会自动介入并开始处理模板。

向该项目中添加 TemplateBuilder 将完成所有初始要求。现在,我们可以将该项目模板添加到当前打开的解决方案。

创建首个项目模板

我们打算使用现有的项目,它恰巧是一个泛型 Contoso ASP.NET Web 窗体/MVC 项目。此项目会使用 Bootstrap 3、jQuery 和 Modernizr,它们有助于每次我们根据此模板新建项目时加快开发速度。一般说来,将项目添加到解决方案后,首先运行任意项目不失为一个好主意。这只是一项预防措施,以确保项目可以像预期一样正常工作,然后再创建模板。因此,运行此项目 (Ctrl + F5),并确保它可以正常工作。

若要创建项目模板,您需要执行以下操作:

  • 将项目添加到解决方案并禁止其创建。
  • 向 VSIX 项目中添加模板引用。
  • 将元数据文件添加到源项目,作为模板信息。

若要使此解决方案中的 Visual Studio 不再创建该模板项目(您仍可以在其他解决方案中创建和运行此项目),请单击创建配置的下拉菜单,然后从列表中选择“配置管理器”。此时,系统会打开“配置管理器”对话框。若要阻止该项目的创建,请在“创建”列中取消选中该项目。为“调试”配置完成上述操作后,选择“活动”解决方案配置下拉列表,然后为“发布”配置重复该过程。

有时,您可能想要创建包含多个项目的模板。如果您最终处理一个类似的复杂项目并且进入到此步骤,那么请注意,针对“调试”和“发布”配置唯一需要检查的是 VSIX 项目或 VSPackage 项目,具体取决于您之前选择了哪一个。图 1 显示了停止创建项目后的“配置管理器窗口”。

禁止创建调试配置
图 1 禁止创建调试配置

接下来,您想要将 VSIX 项目连接到主项目,此操作可以通过添加模板引用来完成。右键单击 VSIX 项目并从选项中选择“添加 | 添加模板引用”(SideWaffle 项目)。

此时,系统会显示“项目选择器”对话框。从列表中选择您要用作模板的项目,然后单击“确定”。这将对您的 VSIX 项目进行一些更改,并将提示您重新加载项目。您可以选择“全部重新加载”选项,然后等待 SideWaffle 进行完成。

现在,让我们将该模板元数据文件添加到 Web 项目。右键单击您的主项目,然后从列出的选项中选择“添加 | 新建项目”。在出现的“添加新项目”对话框中,转到“扩展性”部分,然后选择“SideWaffle 项目模板文件”。您可以使用 Visual Studio 提供的默认名称。选择“项目模板文件”项目模板以后,单击“添加”按钮。

该项目模板文件项目会将两个新文件添加到主项目。首先,它会添加 _preprocess.xml,从而告知 Visual Studio 在打开“新建项目”对话框时将您的模板放在哪里。下面是此文件的默认内容:

<?xml version="1.0" encoding="utf-8" ?>
<Preprocess>
  <TemplateInfo Path="CSharp\Web\SideWaffle"/>
  <Replacements Include="*.*" Exclude="*.vstemplate;
    *.jpg;*.png;*.ico;_preprocess.xml;_project.vstemplate.xml">
    <add key="ContosoWebFormsMvc" value="$safeprojectname$"/>
  </Replacements>
</Preprocess>

在此文件中,您将发现以下信息:

  • 节点(其中该模板将显示在“新建项目”对话框中)的路径。
  • 有关源替换内容的信息。

TemplateInfo 元素上的 Path 属性指定了相应位置(其中该模板将显示在“新建项目”对话框中)。

在 Replacements 元素中,您可以声明在模板创建过程期间可以应用的所有替换内容。您会获取该项目名称的默认替换内容,其将被替换为生成模板中的 $safeprojectname$。通常,这将更新命名空间声明。在 Visual Studio 中使用该模板时,通过使用 $safeprojectname$,命名空间声明将更新为该用户指定的名称。您不限于使用一个替换内容;您可以根据需要添加更多替换内容。有时,您可能需要修改源以使选择具有唯一性,从而使替换内容不发生冲突。

现在,让我们继续转移到添加到该项目的其他文件 _project.vstemplate.xml,它包含有关该模板的元数据。图 2 显示该文件的默认内容,其中 ContosoWebFormsMvc 是该项目的名称。

图 2 Generic _project.vstemplate.xml 文件

<VSTemplate Version="3.0.0"
  xmlns="https://schemas.microsoft.com/developer/vstemplate/2005"
  Type="Project">
  <TemplateData>
    <Name>Your name here</Name>
    <Description>Project description here</Description>
    <DefaultName>ContosoWebFormsMvc</DefaultName>
    <ProjectType>CSharp</ProjectType>
    <ProjectSubType></ProjectSubType>
    <SortOrder>1000</SortOrder>
    <CreateNewFolder>true</CreateNewFolder>   
    <ProvideDefaultName>true</ProvideDefaultName>
    <LocationField>Enabled</LocationField>
    <EnableLocationBrowseButton>true</EnableLocationBrowseButton>
    <Icon>sw-file-icon.png</Icon>
    <!-- Indicates how many parent folders this item template should appear in -->
    <NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>
  </TemplateData>
  <TemplateContent>
    <Project TargetFileName="ContosoWebFormsMvc.csproj"
      File="ContosoWebFormsMvc.csproj"
      ReplaceParameters="true">     
    </Project>
  </TemplateContent>
</VSTemplate>

这是一个标准的 .vstemplate 文件;您可以在 bit.ly/18T090m 中找到对此文件的引用。在模板创建过程中,该项目中的文件将合并到此文件中,以创建用于该模板的最终 .vstemplate 文件。此处有几个需要注意的项。您应该更新 TemplateData 下的以下元素:

  • 名称:这是您的模板的名称,如“新建项目”对话框中所示。
  • 描述:当您选择该模板时,这是您项目的描述,它显示在“新建项目”对话框的右侧。
  • DefaultName:这是正在创建的新项目的默认名称。根据目录内容,系统会自动附加一个数字到此默认名称。
  • SortOrder:这决定了该模板相对于其他模板的位置。此数字必须是 10 的倍数;数字越小,相应项目在 Visual Studio 中的排序越靠前。
  • NumberOfParentCategoriesToRollup:这决定了模板中将会显示的父节点的数量。

您还应该仔细检查“Project”标记上的“TargetFileName”和“File”属性的相应值。这些值应该与磁盘上的项目名称匹配。当 TemplateBuilder 处理此文件时,最终 .vstemplate 文件将合并该项目中列出的源文件。如果您需要特殊处理任何特定的文件,可以在“Project”元素下列出这些文件。请参阅以前关联的 .vstemplate 引用。

鉴于您已自定义 _preprocess.xml 和 .vstemplate.xml 文件,现在可以测试该模板了。确保按照 Visual Studio 中的起始项目对 VSIX 项目进行了配置,然后按 Ctrl + F5。这将启动 Visual Studio 的实验实例,并且您的项目模板将自动加载。打开“新建项目”对话框。如果您转到在 _preprocess.xml 文件中设置的位置,则应该查看新创建的模板。继续并使用您的新模板新建项目以对其进行测试。请确保所有内容按预期工作。

如果一切正常工作,那么恭喜您,一切都按照您创建首个项目模板的顺序正常工作。如果您要安装此模板或与其他人共享该模板,转到您的 Bin 文件夹并查找要安装的 VSIX 文件。如果您或您的团队通过 Git 存储库共享您的项目,那么您还需另外执行一个步骤,然后才能上传该项目。

当您创建 VSIX 或 VSPackage 项目时,Visual Studio 会使用 StartProgram 和 StartArguments 标记的相应值更新您的项目文件。这些值用于确保 F5 和 Ctrl + F5 正常工作。但是,仅在每个用户的基础上配置相应更改。当您向存储库中添加项目时,Visual Studio 不会添加这些更改。它们保存在没有签入其中的 .user 文件中,因此,当其他用户打开该解决方案并尝试在实验实例中运行该项目时,它可能无法正常工作。若要修复此问题,直接打开您项目的 .csproj 文件,然后将下列行添加到首个属性组的末尾正前方:

<StartProgram Condition=
    " '$(StartProgram)'=='' ">
    $(DevEnvDir)\devenv.exe
  </StartProgram>
  <StartArguments Condition=
    " '$(StartArguments)'=='' ">
    /rootsuffix Exp</StartArguments>

现在重新运行该项目,以确保没有内容发生混乱。如果该项目按照预期正常工作,您就可以将该项目添加到 Git 存储库并与所有人共享。

您刚刚创建了包含单个项目模板的 Visual Studio 扩展程序。您可以重复此过程,以在扩展程序中添加其他模板。扩展程序中的模板数量没有限制。您可以将您使用的模板与其他人共享,以便于他们也可以尝试使用该模板。为此,您需要分发 Bin 文件夹中的 .vsix 文件。

如果您想要让您的扩展程序向公众开放,您可以访问 bit.ly/115mBzm 以将其上传到 Visual Studio 库。如果您的扩展程序包含多个模板(项目或项模板),则该库不接受这些扩展程序。您可以将这些扩展程序作为链接上传到 Visual Studio 库,而不是直接上传它们。如果这样做的话,则需要在面向公众开放的 URL 上托管 .vsix 文件。您可以使用 vsixgallery.com 来托管 .vsix 文件并使用它来托管每夜生成的内容。使用 Windows PowerShell 或 C#,您可以轻松地自动将每夜生成的内容发布到 vsixgallery.com

我们介绍的只是有关创建项目模板的基础知识。还有其他方案,如多项目模板以及使用自定义向导等。有关更多信息,您可以查看 GitHub 上的 SideWaffle Wiki。现在可以创建项模板了。

添加项模板

除了允许您创建自己的项目模板之外,SideWaffle 还可以让您创建您自己的项模板。我们将添加刚才创建的扩展项目。

如我们前面所述,该项目使用 Bootstrap 3、jQuery 和 Modernizr。基本项目创建完成后,只要我们想为网站创建新页面,我们都必须手动新建一个 HTML 文件并添加所有 CSS 和 JavaScript 文件。最好是能够创建一个可为我们实现这一切的自定义项模板。

幸运的是,TemplateBuilder 按照相同的方式处理项目模板和项模板,保证所有内容在两种模板中使用一致,因此,创建项模板的一些步骤与我们已为项目模板执行的步骤相同。在模板创建期间,实际上处理项模板和项目模板的方式是相同的。如果您开始使用新项目,请务必首先添加 TemplateBuilder NuGet 程序包。

接下来,在 VSIX 项目中创建名为 ItemTemplates 的文件夹。如图 3 中所示,该文件夹是存储所有项模板的文件夹。

您的模板将显示在 Web 文件夹中
图 3 您的模板将显示在 Web 文件夹中

直接在 ItemTemplates 文件夹下创建的您项模板文件的目录。默认情况下,ItemTemplates 首个子项的名称是在其中显示模板的节点。例如,在图 3 中,您可以看到我们创建的 Web 文件夹,因此该文件夹中的模板将显示在 Visual C#\Web 或 Visual Basic\Web for VB 下或以其他语言相似显示。您还可以使用 _preprocess.xml 对此进行更改,但是对于此示例,我们将所有项模板放在 Web 文件夹下。

现在,让我们创建首个项模板。对于每个项模板,我们在 Web 下创建唯一一个文件夹,然后添加第一个项模板,即一个基本的引导模板。若要开始,请在名为“Bootstrap 3 基本模板”的 Web 下新建文件夹。此模板将包含两个 HTML 文件(HTMLPage1.html 和 HTMLPage2.html),因此将它们放到名为“视图”的文件夹中。对于此示例,您可以使用图 4 中的内容,这些内容是从 bit.ly/1iKHGX3 中适于这两个文件的 Bootstrap 3 文档中提取而来的。

图 4 A 基本的 HTML5 引导模板

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Basic Bootstrap Template</title>
  <link href="css/bootstrap.min.css" rel="stylesheet">
  <!-- HTML5 shim and Respond.js for IE8 support of -->
  <!-- HTML5 elements and media queries -->
  <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
  <!--[if lt IE9]>
  <script src=
    "https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
  <script src=
    "https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
  <![endif]-->
</head>
<body>
  <h1>Hello, world!</h1>
  <script src=
    "https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js">
    </script>
  <script src="js/bootstrap.min.js"></script>
</body>
</html>

添加用于创建模板的源文件之后,我们将添加包含有关项模板的元数据的文件。为此,请右键单击该“Bootstrap 3 基本模板”文件夹,然后选择“添加新项”。如图 5 中所示,选择“扩展性”节点下的 SideWaffle 项模板。

SideWaffle 项模板位于“添加新项”的“扩展性”节点中
图 5 SideWaffle 项模板位于“添加新项”的“扩展性”节点中

此处会忽略“名称”文本框中的值,因为文件含有硬编码的文件名。当您使用“SideWaffle 项模板”模板时,您会在名为“定义”的新文件夹中获得四个文件(请参阅参见图 6)。这四个文件分别是 CSharp.vstemplat-、VB.vstemplat-、Web.csharp.vstemplat- 和 Web.VB.vstemplat,对应于所支持的顶级语言/项目。CSharp.vstemplate 用于在 C# 项目的 Visual C# 节点下显示的模板。VB.vstemplate 用于在“新建项”对话框中的 Visual Basic 下显示的模板。这两个 Web 文件用于显示 Web 项目的模板。请注意,若要显示您的模板,您需要将扩展名从 CSharp.vstemplat- 更改为 CSharp.vstemplate。您可以删除您不感兴趣的文件。如图 6 中所示,我们将全部保留四个文件并将扩展名更改为 .vstemplate。

SideWaffle 项模板会添加一个“定义”文件夹和四个 vstemplate 文件
图 6 SideWaffle 项模板会添加一个“定义”文件夹和四个 vstemplate 文件

现在,我们需要编辑 .vstemplate 文件以在该模板中包含两个 HTML 源文件,因此我们将向 TemplateContent 元素下的 CSharp.vstemplate 文件中添加一些 ProjectItem 元素。文件的内容看上去应该如图 7 中所示。

图 7 含有添加到项模板的多个文件的示例 _project.vstemplate.xml 文件

<VSTemplate Version="3.0.0"
  xmlns="https://schemas.microsoft.com/developer/vstemplate/2005" Type="Item">
  <TemplateData>
    <ProjectType>CSharp</ProjectType>
    <DefaultName>Bootstrap 3 Basic Template.txt</DefaultName>
    <Name>Bootstrap 3 Basic Template</Name>
    <Description>A basic HTML5 template using Bootstrap 3</Description>   
    <Icon>icon.png</Icon>
    <NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>
  </TemplateData>
  <TemplateContent>
    <References />
    <ProjectItem TargetFileName="View/HTMLPage1.html" >
      View/HTMLPage1.html</ProjectItem>
    <ProjectItem TargetFileName="View/HTMLPage2.html" >
      View/HTMLPage2.html</ProjectItem>
  </TemplateContent>
</VSTemplate>

如您所见,我们已添加了两个 Project­Item 条目,分别对应于已创建的两个文件。该元素的值会指向模板内容所在磁盘上的文件。当调用“新项目”对话框时,TargetFileName 的值将决定显示的文件的名称。

添加项模板以及您的文件之后,您便可以测试该项模板。像上一次一样,请按 Ctrl + F5 打开 Visual Studio 的实验实例,然后创建或打开一个示例项目并试用您的模板。

接下来,我们将讨论代码段,但是首先快速了解一下替换内容。在“项目模板”部分中,您看到 _preprocess.xml 在模板创建过程期间用于更新项目内容的工作方式。如果您需要为项模板执行任何替换,则可以使用同样的技术。和项目模板一样,我们只介绍了创建项模板的基础知识。还有很多方面我们都没有涉及到,如使用自定义向导、将图标作为资源内嵌以及内嵌文件等。有关这些主题的信息,您可以参考标准 Visual Studio 模板的现有内容。您还可以查看 SideWaffle GitHub 项目页面上的 Wiki。

如何添加代码段

我们有在项目中正常使用的代码段。如果您在想是否有方法让 Visual Studio 跟踪您最喜欢的代码段,幸运的是可以做到。与之前一样,首先创建一个 VSIX 项目并更新 source.extension.vsixmanifest 的作者和说明字段。

若要让 Visual Studio 读取您的代码段文件,您需要创建它能够识别的文件夹结构。如果您要为每种编程语言创建代码段,图 8 显示了相应结构。

Visual Studio 会自动识别此处显示的文件夹
图 8 Visual Studio 会自动识别此处显示的文件夹

创建所需的文件夹之后,您可以将您的代码段文件添加到代码段各自语言的 SideWaffle 文件夹中。当您添加每个文件时,请单击该文件并在属性窗口中查看其“生成操作”。每个文件应该含有设置为“内容”的“生成操作”属性,因此 Visual Studio 可自动在创建 VSIX 项目时在其中添加该文件。

接下来,您需要在项目的根目录中添加程序包定义文件。.pkgdef 文件将会设置一些注册表项,同时允许您使用在上一步中添加的代码段。因为 Visual Studio 本身不附带 .pkgdef 文件的项模板,所以您必须要创建一个文本文件并将其重命名以使用 .pkgdef 扩展程序。虽然您可以根据自己的喜好随意命名该 .pkgdef 文件,但是为了使内容简单,我们将其命名为 snippets.pkgdef。如图 9 所示,需要为您使用的每种语言更新不同的注册表项。

图 9 程序包定义文件包含每种语言的注册信息

// ---------------------- SNIPPETS ----------------------
// Visual Basic
[$RootKey$\Languages\CodeExpansions\Basic\Paths]
"My Snippets"="$PackageFolder$\Snippets\VisualBasic\My Snippets"
// C++
[$RootKey$\Languages\CodeExpansions\C/C++\Paths]
"My Snippets"="$PackageFolder$\Snippets\C++\My Snippets"
// C#
[$RootKey$\Languages\CodeExpansions\CSharp\Paths]
"My Snippets"="$PackageFolder$\Snippets\CSharp\My Snippets"
// CSS
[$RootKey$\Languages\CodeExpansions\CSS\Paths]
"My Snippets"="$PackageFolder$\Snippets\CSS\My Snippets"
// HTML
[$RootKey$\Languages\CodeExpansions\HTML\Paths]
"My Snippets"=""$PackageFolder$\Snippets\HTML\My Snippets"
// JavaScript
[$RootKey$\Languages\CodeExpansions\JavaScript\Paths]
"My Snippets"="$PackageFolder$\Snippets\JavaScript\My Snippets"
// SQL
[$RootKey$\Languages\CodeExpansions\SQL_SSDT\Paths]
"My Snippets"="$PackageFolder$\Snippets\SQL\My Snippets"
// XML
[$RootKey$\Languages\CodeExpansions\XML\Paths]
"My Snippets"="$PackageFolder$\Snippets\XML\My Snippets"

在测试新代码段之前,您需要执行的最后一步是注册 .pkgdef 文件。打开 source.extension.vsixmanifest 文件,转到“资产”选项卡,然后单击标记为“新建”的按钮。此时,系统会显示“添加新资产”对话框,并为您提供若干个选项。如图 10 中所示,为资产类型选择 Microsoft.VisualStudio.VsPackage。

使用 Visual Studio 注册程序包定义文件
图 10 使用 Visual Studio 注册程序包定义文件

接下来,选择 filesystem 上的“文件”作为源类型。此操作将展开该对话框,同时可让您浏览您创建的 .pkgdef 文件。选择该 .pkgdef 文件,然后单击“确定”。

此时便可以对您的代码段进行测试了。与前面一样,按 Ctrl + F5 打开 Visual Studio 的实验实例。然后打开早前用于测试的项目,并导航到“工具 | 代码段管理器”。如果一切加载正常,那么就大功告成了。

到目前为止,我们已经了解了 SideWaffle 的主要优势:项目和项模板以及代码段。然后该怎么办?

当前,开发团队正在致力于 SideWaffle 的动态模板功能,我们希望该功能可在下次发布时面向公众。通过此功能,创建和维护模板会更加简单。其理念是,您可以将您的模板发布到 Git 存储库或网络文件夹,从而与朋友和同事进行共享。然后,您可以配置 SideWaffle 以从远程位置选择模板。最终用户将能够控制检查更新的频率。若要实时了解此功能,请访问 bit.ly/18DepKM 上的“动态模板”页。

总结

如您在本文中所见,创建您自己的模板非常简单。现在您已经知道了如何进行操作,那么可以告知您的朋友和同事您使用 SideWaffle 节省了多长时间。请记住,当您与社区共享模板包时,您随时可以将模板包上传到 Visual Studio 库,并且 vsixgallery.com 可供您随时使用。如果您想要通过 SideWaffle 与其他人共享您自己的模板,请在 GitHub 上向我们发送一个 Pull 请求。现在,您可以开始创建您的模板包,并告诉我们您是否需要任何帮助。


Tyler Hughes 是杰克森维尔州立大学的应届毕业生,专业是计算机信息系统。他从事业余开发已经有 5 年时间了,并且目前是 SideWaffle 核心开发人员团队的一员。

Sayed Ibrahim Hashimi 是 Microsoft Visual Studio Web 团队的高级项目经理。他已经编写了多本有关 Microsoft 技术的书籍,同时他也是 SideWaffle 和 TemplateBuilder 的创建者以及 OmniSharp 的联合创建者。