使用VSIX安装程序和Nuget包的Visual Studio 2012多项目/解决方案模板

16
我希望有一个多项目模板,可以创建子项目,并安装Nuget依赖项,同时还带有一个VSIX安装程序,可以安装这个模板。
已尝试方法的问题: - 没有VSIX、没有Nuget的多项目模板:能够创建多项目模板,并且功能正常,但当包含Nuget引用时出现了问题。没有简单/优雅的Nuget支持,不涉及VSIX就无法完成。 - 带有VSIX、没有根模板的多项目模板:所以我试着使用VSIX,看起来非常直观。将模板项目添加为Zip文件或从解决方案中添加,构建vsix安装程序。但是当我添加第二个项目模板,以创建多项目模板时,安装该模板并尝试创建项目时,我意识到它不支持主-子项目设置,在此设置下,主项目创建子项目。这是一个大问题,因为开发人员必须按依赖关系顺序创建每个项目。
1个回答

19

最终我已经让设置工作起来了。经过多天的实验和拼凑不同的MSDN文章和博客,我终于弄清楚了。

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

最终结果是:

  • Visual Studio 2012 VSIX项目,其中包含一个packages文件夹,其中存放所有的nuget依赖项。
  • 一个Zip文件,其中包含将多个项目链接在一起的根/主模板,这些项目也在zip文件中的相应文件夹中。
  • 已构建的vsix安装程序,它将安装一个具有子项目的单个项目模板。
  • 这将允许您使用“文件-导出模板”功能轻松维护来自正在不断增长的项目的模板。
  • 使用自动生成和可定制化的参数来重命名您的模板命名空间和文件以匹配您的新项目名称。

使用此模板创建项目时,它会自动创建多个子项目,但是这些子项目本身不能作为新项目菜单中的模板使用(但可用)。如果您尝试模板化依赖于许多项目共同工作的企业设计之类的东西,则这很棒,但您不希望用户能够创建这些子项目,或者您希望它们在不同的项目模板区域/类别中可用。

步骤:

  1. 创建一个名为“MyTemplate”的文件夹
  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. 打开您希望用作“子项目”模板的第一个项目,从“文件”->“导出模板”中导出模板。

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

  8. <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>
    
  9. 将整个根文件夹 MyTemplate 压缩成 MyTemplate.zip,使其包含 MyTemplate 文件夹的所有内容。

  10. 创建一个 VSIX 项目(需要安装 Visual Studio 2012 SDK 模板),在 C# 下的 Extensibility 模板类别中创建。

  11. 创建一个名为 packages 的文件夹。

  12. 将 nuget 包(仅 .nupkg 文件)添加到子项目 vstemplate 中引用的 packages 文件夹,并在文件属性中将其生成操作设置为 content,并将 Include in VSIX 设置为 true。在我的情况下,我添加了 Newtonsoft.Json.5.0.6.nupkg。

  13. 在 source.extension.vsixmanifest 文件中设置作者名称。

  14. 在 Assets 标签中,点击 "新建" 并选择下拉菜单中的项目模板,然后在下一级下拉菜单中选择文件系统上的文件。

  15. 浏览并选择你创建的 zip 文件,然后点击 "确定"。这将在 ProjectTemplates 文件夹中创建一个 zip 文件。

  16. 复制 source.extension.vsixmanifest 文件顶部的 Product Id。

  17. 使用诸如 WinRar 这样的程序打开 zip 文件(默认的 Windows zip 应用程序不允许这样做)。

  18. 将 Product id 粘贴到 repositoryid 部分中。

  19. 保存更改到 zip 文件中(确保你已经返回使用 WinRar,因为它会检测到更改并询问是否要更新)。

  20. 构建解决方案,然后转到 bin/debug 文件夹运行 vsix 安装程序。

  21. 创建你的项目。

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

  • 打开每个子项目 vstemplate 文件,并在 DefaultName 元素中添加 $safeprojectname$。例如:

<DefaultName>$safeprojectname$.Domain</DefaultName>

你有一个可以分享的带有示例的压缩文件吗? - Mihai
1
我按照您所描述的步骤进行了操作,但是当我想要创建一个新项目时,出现了以下错误信息: 包安装错误 此模板向导仅适用于单项目或项目项模板。 您知道这里出了什么问题吗? - WhiteIntel
如果ProjectA引用了ProjectB怎么办?我尝试过$safeprojectname$和$projectname$,但都没有起作用。 - hakan
1
@WhiteIntel:不要在root.vstemplate文件中添加包。只需将它们添加到相关的project.vstemplate中即可解决异常。 - Chamika Sandamal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接