Visual Studio 2012具有相互依赖性的多个项目模板

时间:2013-10-06 18:36:03

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

我正在为工作创建MVC入门套件,我在创建一个多项目模板时遇到问题,该模板在创建后不需要大量的手动修改。

我所拥有的是4个相互依赖的项目:

  • StarterKit.Common - 没有依赖
  • StarterKit.DAL - 对StarterKit.Common的依赖
  • StarterKit.BL - 与StarterKit.Common和StarterKit.DAL的依赖关系 StarterKit.Web - 依赖于其他三个

我尝试使用“导出模板”向导导出每个项目的路径,创建一个根.vstemplate文件并将其全部压缩。虽然这有效(我可以基于这个模板创建一个新的解决方案),但它有一些严重的问题。

首先,导出用$ safeprojectname $替换每个项目的整个命名空间,即StarterKit.DAL => $ safeprojectname $,StarterKit.Web => $ safeprojectname $ etc。

这意味着当创建新项目时(让我们称之为XXX),以前名称空间StarterKit.Web中的内容现在最终位于XXX名称空间中,之前的StarterKit.BL 也是最终在XXX命名空间!

这显然不起作用。

其次,一些使用语句根本不会被替换。例如,using StarterKit.Common;未在Web项目中替换,因为它没有正确的命名空间(即StarterKit.Web)。

第三,我有一些包含我想要替换的语句的.tt脚本,但即使我在项目中设置了ReplaceParameters="true",也根本没有触及它们。

我也考虑过创建一个VSIX项目,但坦率地说,我不知道如何使用它。对我来说,它看起来很像一个zip工具,为你创建.vstemplate并为我重命名.zip为.vsix。

我需要做的是:

  • 将所有项目打包在一个部署文件中,该文件可用作VS
  • 中的“新建项目”模板
  • 创建新项目时,将.csproj,.cs,.cshtml和.tt文件中的所有“StarterKit”命名空间引用替换为用户选择的任何解决方案名称
  • 找出一个简单的过程,每当基础项目发生变化(添加/删除文件,重命名,更改内容等)时,我都可以轻松更新模板。

有没有人知道这是否可能?

2 个答案:

答案 0 :(得分:3)

完全披露:我是下述项目的创建者。

您可以使用我创建的名为IWizardGlobalParams实现来获得所需的结果。它使解决方案模板级别的信息可用于运行向导的子模板,方法是在所有解决方案级别参数前加上 global ,并将其添加到参数中儿童模板。

如果您将GlobalParams与上述多项目模板一起使用并且用户输入了“StarterKit”,则以下情况属实:

  • StarterKit.Common 可以访问
    • $ safeprojectname $ = StarterKit.Common
    • $ globalsafeprojectname $ = StarterKit
    • $ globalguid1 $ = E8C8A064601844439909D6C33AB90CB3
    • $ globalguid2 $ = 020DB5ABF76040C7BDA19EAC54DFE3D8
    • $ globalguid3 $ = 8392FB760F754C0AB87778845CC28B6D
    • $ globalguid4 $ = 13E07D43F523467587296B2C386DEE50
  • StarterKit.DAL
    • $ safeprojectname $ = StarterKit.DAL
    • $ globalsafeprojectname $ = StarterKit
    • $ globalguid1 $ = E8C8A064601844439909D6C33AB90CB3
    • $ globalguid2 $ = 020DB5ABF76040C7BDA19EAC54DFE3D8
    • $ globalguid3 $ = 8392FB760F754C0AB87778845CC28B6D
    • $ globalguid4 $ = 13E07D43F523467587296B2C386DEE50
  • StarterKit.BL
    • $ safeprojectname $ = StarterKit.BL
    • $ globalsafeprojectname $ = StarterKit
    • $ globalguid1 $ = E8C8A064601844439909D6C33AB90CB3
    • $ globalguid2 $ = 020DB5ABF76040C7BDA19EAC54DFE3D8
    • $ globalguid3 $ = 8392FB760F754C0AB87778845CC28B6D
    • $ globalguid4 $ = 13E07D43F523467587296B2C386DEE50
  • StarterKit.Web
    • $ safeprojectname $ = StarterKit.Web
    • $ globalsafeprojectname $ = StarterKit
    • $ globalguid1 $ = E8C8A064601844439909D6C33AB90CB3
    • $ globalguid2 $ = 020DB5ABF76040C7BDA19EAC54DFE3D8
    • $ globalguid3 $ = 8392FB760F754C0AB87778845CC28B6D
    • $ globalguid4 $ = 13E07D43F523467587296B2C386DEE50

使用GlobalParams,您可以访问100个Guid,其中全局前缀在子模板中是相同的。因此, StarterKit.Common 项目的值为“$ globalguid1 $”作为项目ID,其中 StarterKit.DAL StarterKit.BL 构建项目引用 StarterKit.Common ,使用“$ globalsafeprojectname $ .Common”作为被引用项目的名称,并将“$ globalguid1 $”作为被引用项目的id。我想你可以看到它如何在其他项目之间构建引用。

答案 1 :(得分:0)

我从来没有找到答案,所以我选择了其他路线。

我创建了一个PowerShell脚本,我将其包含在包含解决方案文件的zip文件中。该脚本根据用户选择的项目名称重命名解决方案,项目和类。

令人头疼的是,这必须在Visual Studio外部运行