0

我正在为工作创建 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”命名空间引用替换为用户选择的解决方案名称
  • 找出一个简单的过程,只要基础项目发生更改(文件添加/删除、重命名、内容更改等),我就可以轻松更新模板

有谁知道这是否可能?

4

2 回答 2

3

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

您可以使用IWizard我创建的名为GlobalParams. 它使解决方案模板级别的信息可用于运行向导的子模板,方法是在所有解决方案级别参数前加上单词global并将它们添加到子模板的参数中。

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

  • StarterKit.Common可以访问
    • $safeprojectname$ = StarterKit.Common
    • $globalsafeprojectname$ = StarterKit
    • $globalguid1$ = E8C8A064601844439909D6C33AB90CB3
    • $globalguid2$ = 020DB5ABF76040C7BDA19EAC54DFE3D8
    • $globalguid3$ = 8392FB760F754C0AB87778845CC28B6D
    • $globalguid4$ = 13E07D43F523467587296B2C386DEE50
  • 入门套件.DAL
    • $safeprojectname$ = StarterKit.DAL
    • $globalsafeprojectname$ = StarterKit
    • $globalguid1$ = E8C8A064601844439909D6C33AB90CB3
    • $globalguid2$ = 020DB5ABF76040C7BDA19EAC54DFE3D8
    • $globalguid3$ = 8392FB760F754C0AB87778845CC28B6D
    • $globalguid4$ = 13E07D43F523467587296B2C386DEE50
  • 入门套件.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 Guids 。因此StarterKit.Common项目可以被赋予“$globalguid1$”的值作为项目 ID,使用StarterKit.DALStarterKit.BL构建对StarterKit.Common的项目引用,使用“$globalsafeprojectname$.Common”作为项目名称被引用,“$globalguid1$”作为被引用项目的 id。我认为您可以看到它将如何在其余项目之间建立引用。

于 2013-11-21T03:05:06.003 回答
0

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

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

令人遗憾的是,这必须在 Visual Studio 之外运行

于 2013-10-19T15:14:09.573 回答