带有VSIX Installer和Nuget包的Visual Studio 2012的多项目/解决方案模板
我想有一个多项目模板,它将创建子项目,并将安装nuget依赖项,并有一个将安装此模板的vsix安装程序。
方法问题已经尝试过
没有VSIX的多项目模板,没有nuget
我能够创建一个多项目模板,它工作正常,除非是时候包括nuget引用,它不起作用。 对于没有涉及VSIX的nuget,没有简单/优雅的支持。
具有VSIX的多项目模板,没有根模板
所以我尝试使用VSIX,看起来非常简单。 将模板项目添加为zip或解决方案,构建vsix安装程序。 但是当我添加第二个项目模板,创建一个多项目模板,构建它,安装模板并尝试创建一个项目时,我意识到它不支持主 – 子项目设置,其中一个主项目创建子项目。 这是一个很大的问题,因为开发人员必须按依赖顺序创建每个项目。
我终于让设置工作了。 我花了很多天的时间来试验和修补不同的MSDN文章和博客来解决这个问题。
结合多项目模板(与根模板)和VSIX
最终的结果是
- Visual Studio 2012 VSIX项目,它包含具有所有nuget依赖项的packages文件夹。
- 带有root / master模板的Zip文件,它将多个项目链接在一起,这些项目也位于相应文件夹的zip文件中。
- 一个内置的vsix安装程序,它将安装一个包含子项目的项目模板。
- 这将允许您使用“文件 – 导出模板”function从项目中维护模板,该模板可以轻松地继续增长。
- 使用自动生成和可自定义的参数重命名模板名称空间和文件以匹配新项目名称。
使用此模板创建项目时,它会自动创建多个子项目,但子项目不是(但可以)在新项目菜单中作为模板提供。 如果您尝试模拟依赖于许多项目一起工作的企业设计,但您不希望用户能够创建这些子项目,或者您希望它们可以在不同的项目中使用,那么这非常有用。项目模板区域/类别。
脚步:
- 创建一个文件夹“MyTemplate”
- 创建一个root.vstemplate文件
-
将以下内容添加到文件中:
NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a NuGet.VisualStudio.TemplateWizard -
打开您希望用作“子项目”模板的第一个项目,从文件 – >导出模板导出模板。
- 将zip内容解压缩到MyTemplate文件夹,最终得到MyTemplate / Project1
- 从刚提取的内容中打开Project1.vstemplate。
-
并粘贴在TemplateContent块下面的下面(例如,如果你想添加一个Json nuget包)
NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a NuGet.VisualStudio.TemplateWizard -
压缩整个根文件夹MyTemplate,最终得到MyTemplate.zip,其中包含MyTemplate文件夹的内容。
- 从C#下的可扩展性模板类别创建一个VSIX项目(您需要Visual Studio 2012 SDK才能拥有此模板)。
- 创建一个包文件夹
- 将您在子项目vstemplate中引用的nuget包(仅限.nupkg文件)添加到packages文件夹和files属性中,将其构建操作设置为content,并将VSIX中包含为true。 在我的情况下,我添加了Newtonsoft.Json.5.0.6.nupkg。
- 在source.extension.vsixmanifest中设置作者名称
- 在Assets选项卡中,单击new并从下拉列表中选择项目模板,然后在下一个下拉列表中文件系统上的文件。
- 浏览并选择您创建的zip,点击确定。 这将创建一个带有zip的ProjectTemplates文件夹。
- 从source.extension.vsixmanifest的顶部复制Product Id。
- 使用WinRar等程序打开zip,允许您直接将更改保存到zip(默认的Windows zip应用程序不允许这样)。
- 将Product id粘贴到repositoryid部分
- 将更改保存到zip文件(确保你回到WinRar,如果那是你正在使用的,因为它会检测到更改,并会询问你是否要更新)
- 构建解决方案并转到bin / debug文件夹以运行vsix安装程序
- 创建您的项目
可选步骤让您的主项目重命名您的文件和名称空间
- 打开每个子项目vstemplate文件,并将$ safeprojectname $添加到DefaultName元素。 例如
$safeprojectname$.Domain