【问题标题】:Visual Studio 2012 multiple project template with inter-dependencies具有相互依赖关系的 Visual Studio 2012 多项目模板
【发布时间】:2013-10-06 18:36:02
【问题描述】:

我正在为工作创建一个 MVC starterkit,但在创建一个不需要在创建后进行大量手动修改的多项目模板时遇到问题。

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

  • StarterKit.Common - 无依赖性
  • StarterKit.DAL - 对 StarterKit.Common 的依赖
  • StarterKit.BL - 对 StarterKit.Common 和 StarterKit.DAL 的依赖 StarterKit.Web - 对其他三个的依赖

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

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

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

这显然行不通。

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

第三,我有一些 .tt 脚本,其中包含要替换的 using 语句,但即使我在项目中设置了ReplaceParameters="true",这些都没有被触及。

我还研究过创建一个 VSIX 项目,但坦率地说,我不知道如何使用它。对我来说,它看起来更像是一个 zip 实用程序,它为您创建 .vstemplate 并为我将 .zip 重命名为 .vsix。

我需要做的是:

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

有人知道这是否可能吗?

【问题讨论】:

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


    【解决方案1】:

    完全披露:我是下面提到的项目的创建者。

    您可以使用我创建的名为GlobalParamsIWizard 实现来实现所需的结果。它通过在 ALL 解决方案级别参数前加上单词 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 个带有 global 前缀的 Guids,这些前缀在子模板中是相同的。因此,StarterKit.Common 项目可以通过 StarterKit.DALStarterKit.BL 将 "$globalguid1$" 的值作为项目 id构建对 StarterKit.Common 的项目引用,使用“$globalsafeprojectname$.Common”作为被引用项目的名称,“$globalguid1$”作为被引用项目的 id。我想你可以看到它是如何在其他项目之间建立引用的。

    【讨论】:

    • 非常好的解决方案。虽然这次我不打算使用它(PS 脚本非常适合我们的目的),但我会将其标记为答案,因为它可能是原始问题的唯一真正解决方案。
    【解决方案2】:

    我从来没有找到答案,所以我选择了另一条路线。

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

    不幸的是,它必须在 Visual Studio 之外运行

    【讨论】:

      猜你喜欢
      • 2018-01-09
      • 2015-11-02
      • 2010-10-10
      • 2021-02-21
      • 2012-06-19
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多