【问题标题】:Multi Project / Solution Templates for Visual Studio 2012 with VSIX Installer and Nuget Packages带有 VSIX 安装程序和 Nuget 包的 Visual Studio 2012 多项目/解决方案模板
【发布时间】:2013-09-22 08:56:27
【问题描述】:

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

已经尝试过的方法存在问题

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

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

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

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

【问题讨论】:

    标签: c# visual-studio templates visual-studio-2012 vsix


    【解决方案1】:

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

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

    最终结果是

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

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

    步骤:

    1. 创建一个文件夹“我的模板”
    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. 在“资产”选项卡中,单击“新建”并从下拉列表中选择项目模板,然后在下一个下拉列表中的文件系统中归档。
    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>
    

    【讨论】:

    • 你有可以分享的例子吗?
    • 我完全按照您的描述做了,但是当我想创建一个新项目时,我收到以下错误消息:包安装错误此模板向导只能应用于单个项目或项目项目模板。你知道这里有什么问题吗?
    • 如果 ProjectA 引用了 ProjectB 怎么办?我尝试了 $safeprojectname$ 和 $projectname$ 但没有成功。
    • @WhiteIntel:不要在root.vstemplate 文件中添加包。只需在相关的project.vstemplate 中添加它们即可解决异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多