TemplateBuilder 和 SideWaffle.项目模板.更改默认根命名空间
本文关键字:默认 命名空间 SideWaffle 项目 TemplateBuilder | 更新日期: 2023-09-27 18:34:09
我使用本指南成功创建了一个多项目模板:https://github.com/ligershark/side-waffle/wiki/How-to-create-a-multi-project-template
我遇到的问题是能够更改生成项目的默认命名空间和默认程序集名称。就像这里解释的那样:http://reasoncodeexample.com/2013/06/09/creating-visual-studio-project-templates/其中自定义参数定义 f.ex。默认命名空间。
从本质上讲,我想确保我们的公司名称始终位于命名空间的开头......
我无法让它与 SideWaffle 项目模板一起使用,我想知道是否有人知道在使用 SideWaffle 项目模板时如何定义默认命名空间和程序集名称。
当使用SideWaffle(更具体地说,TemplateBuilder,SideWaffle构建在其上(时,如果您正在创建自定义向导,您应该能够实现这一点。
我建议先获取一个带有自定义向导的示例项目模板。一旦您知道您的向导正在被调用,然后开始继续。
尝试以下操作
- 使命名空间声明一致且唯一
- 在您的自定义向导中创建一个传递到模板中的新参数,例如
$customnamespace$
- 使用
_preprocess.xml
将命名空间替换为$customnamespace$
。这样,您可以保留标准代码,以便可以 F5/CTRL+F5,但模板版本将命名空间声明替换为此代码。
然后,当调用向导时,传递附加的 $customnamespace$
参数,该参数将被替换。多项目向导执行此操作,因此源可能会 https://github.com/ligershark/template-builder/blob/master/src/TemplateBuilder/ChildWizard.cs 有所帮助。
有关更换的更多信息 https://github.com/ligershark/side-waffle/wiki/How-replacements-work。
仅供参考,我们希望改进文档,因此,如果您可以为维基做出贡献,那就太好了。
我已经追踪到发生了什么。由于这将是一个冗长的帖子,我将提出一个新的答案来解释问题@ThBlitz
这不是答案,而是对上述问题的进一步解释,对于篇幅,我深表歉意。
所以我设置了一个 IWizard 实现来修改 csproj,正如@Sayed所讨论的那样,我已经尝试了他的解决方案。以下是我的发现。
这是IWizard
实现的交错部分
public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
{
replacementsDictionary.Add("$companynamespace$", "Infomedia");
}
还有_preprocess.xml
<?xml version="1.0" encoding="utf-8" ?>
<Preprocess>
<TemplateInfo Path="CSharp'Infomedia"/>
<Replacements Include="*.*" Exclude="*.vstemplate;*.csproj;*.jpg;*.png;*.ico;_preprocess.xml;_project.vstemplate.xml">
<add key="ConsoleApp" value="$safeprojectname$"/>
<add key="RootNamespace" value="$companynamespace$.$safeprojectname$"/>
<add key="AssemblyName" value="$companynamespace$.$safeprojectname$"/>
<add key="namespace" value="namespace $companynamespace$.$safeprojectname$"/>
</Replacements>
</Preprocess>
命名空间部分仅用于测试向导是否已执行,确实如此,因为我可以观察到实验性 VS 中模板中所有类的命名空间变化。(然后这些类无效,但至少它显示了向导的执行(。
但它应该改变RootNamespace
和Assemblyname
,为此,我需要删除*.csproj
在_preprocess.xml
中的排除
执行此更改会使 xml 失效。清洁_preprocess.xml
示例
<?xml version="1.0" encoding="utf-8" ?>
<Preprocess>
<TemplateInfo Path="CSharp'Infomedia"/>
<Replacements Include="*.*" Exclude="*.vstemplate;*.jpg;*.png;*.ico;_preprocess.xml;_project.vstemplate.xml">
<add key="ConsoleApp" value="$safeprojectname$"/>
<add key="RootNamespace" value="$companynamespace$.$safeprojectname$"/>
<add key="AssemblyName" value="$companynamespace$.$safeprojectname$"/>
<add key="namespace" value="namespace $companynamespace$.$safeprojectname$"/>
</Replacements>
</Preprocess>
观察去除*.csproj
构建解决方案将导致编译错误:
Name cannot begin with the '$' character, hexadecimal value 0x24. Line 10, position 6.
好的,所以现在的问题是$
并删除它们的前提,任何空格都将允许构建解决方案,但当然替换将不起作用,因为找不到替换值。
已修改的 xml 已生成但不起作用。
<?xml version="1.0" encoding="utf-8" ?>
<Preprocess>
<TemplateInfo Path="CSharp'Infomedia"/>
<Replacements Include="*.*" Exclude="*.vstemplate;*.jpg;*.png;*.ico;_preprocess.xml;_project.vstemplate.xml">
<add key="ConsoleApp" value="$safeprojectname$"/>
<add key="RootNamespace" value="companynamespace.safeprojectname"/>
<add key="AssemblyName" value="companynamespace.safeprojectname"/>
<add key="namespace" value="companynamespace.safeprojectname"/>
</Replacements>
</Preprocess>
所以@Sayed我真的希望你对这里发生的事情有一个想法。