我正在为工作创建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)
完全披露:我是下述项目的创建者。
您可以使用我创建的名为IWizard
的GlobalParams
实现来获得所需的结果。它使解决方案模板级别的信息可用于运行向导的子模板,方法是在所有解决方案级别参数前加上 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外部运行