14

我想要一个多项目模板来创建子项目,并安装 nuget 依赖项以及安装此模板的 vsix 安装程序。

已经尝试过的方法的问题

没有 VSIX 的多项目模板,没有 nuget

我能够创建一个多项目模板,并且它运行良好,但当需要包含 nuget 引用时,它不起作用。对于不涉及 VSIX 的 nuget,没有简单/优雅的支持。

带有 VSIX 的多项目模板,没有根模板

所以我尝试使用 VSIX,它看起来非常简单。将模板项目添加为 zip 或来自解决方案,构建 vsix 安装程序。但是当我添加第二个项目模板,创建一个多项目模板,构建它,安装模板并尝试创建一个项目时,我意识到它不支持主子项目设置,主项目创建子项目。这是一个大问题,因为开发人员必须按依赖顺序创建每个项目。

4

1 回答 1

18

我终于让设置工作了。我花了很多天的时间试验和修补不同的 MSDN 文章和博客来解决这个问题。

结合多项目模板(带有根模板)和 VSIX

最终结果是

  • Visual Studio 2012 VSIX 项目,它包含一个包含所有 nuget 依赖项的包文件夹。
  • 一个带有根/主模板的 Zip 文件,它将多个项目链接在一起,这些项目也在相应文件夹中的 zip 文件中。
  • 一个内置的 vsix 安装程序,它将安装具有子项目的单个项目模板。
  • 这将允许您使用 File-Export Template 功能维护一个持续增长的项目中的模板,只需很少的努力。
  • 使用自动生成和可自定义的参数来重命名您的模板命名空间和文件以匹配您的新项目名称。

使用此模板创建项目时,它会自动创建多个子项目,但是,子项目不(但可以)作为新项目菜单本身的模板提供。如果您尝试对依赖于多个项目协同工作的企业设计之类的模板进行模板化,但您不希望用户能够创建这些子项目,或者您希望它们在不同的项目中可用,这非常有用项目模板区域/类别。

脚步:

  1. 创建一个文件夹“我的模板”</li>
  2. 创建一个 root.vstemplate 文件
  3. 将以下内容添加到文件中:

    <WizardExtension>
      <Assembly>NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly>
      <FullClassName>NuGet.VisualStudio.TemplateWizard</FullClassName>
    </WizardExtension>
    <WizardData>
      <packages repository="extension" repositoryId="fill this in">
        <package id="Newtonsoft.Json" version="5.0.6" />
      </packages>
    </WizardData>
    
  4. 打开您希望用作“子项目”模板的第一个项目,从 File->Export Template 导出模板。

  5. 将 zip 内容提取到您的 MyTemplate 文件夹,因此您最终得到 MyTemplate/Project1
  6. 从您刚刚提取的内容中打开 Project1.vstemplate。
  7. 并在 TemplateContent 块下方粘贴以下内容(例如,如果要添加 Json nuget 包)

    <WizardExtension>
      <Assembly>NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly>
      <FullClassName>NuGet.VisualStudio.TemplateWizard</FullClassName>
    </WizardExtension>
    <WizardData>
      <packages repository="extension" repositoryId="fill this in">
        <package id="Newtonsoft.Json" version="5.0.6" />
      </packages>
    </WizardData>
    
  8. 压缩整个根文件夹 MyTemplate,因此您最终会得到包含 MyTemplate 文件夹内容的 MyTemplate.zip。

  9. 从 C# 下的可扩展性模板类别创建一个 VSIX 项目(您需要 Visual Studio 2012 SDK 才能拥有此模板)。
  10. 创建包文件夹
  11. 将您在子项目 vstemplate 中引用的 nuget 包(仅限 .nupkg 文件)添加到包文件夹和文件属性中,将其构建操作设置为内容,并将 VSIX 中的包含设置为 true。就我而言,我添加了 Newtonsoft.Json.5.0.6.nupkg。
  12. 在 source.extension.vsixmanifest 中设置作者名称
  13. 在 Assets 选项卡中,单击新建并从下拉列表中选择项目模板,然后在下一个下拉列表中的文件系统上归档。
  14. 浏览并选择您创建的 zip,点击确定。这将使用 zip 创建一个 ProjectTemplates 文件夹。
  15. 从 source.extension.vsixmanifest 的顶部复制产品 ID。
  16. 使用 WinRar 之类的程序打开 zip,它允许您将更改直接保存到 zip(默认的 windows zip 应用程序不允许这样做)。
  17. 将产品 ID 粘贴到 repositoryid 部分
  18. 将更改保存到 zip 文件(如果您正在使用,请确保返回 WinRar,因为它会检测到更改并询问您是否要更新)
  19. 构建解决方案并转到 bin/debug 文件夹以运行 vsix 安装程序
  20. 创建您的项目

让您的主项目重命名文件和命名空间的可选步骤

  • 打开每个子项目 vstemplate 文件,并将 $safeprojectname$ 添加到 DefaultName 元素。例如
<DefaultName>$safeprojectname$.Domain</DefaultName>
于 2013-09-17T19:41:58.773 回答