2

我已经使用本指南成功创建了一个多项目模板: 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 项目模板时定义默认命名空间和程序集名称。

4

2 回答 2

1

当使用SideWaffle(更具体地说,TemplateBuilder,SideWaffle 是在其之上构建的)时,如果您正在创建自定义向导,您应该能够实现这一点。

我建议先获取一个带有自定义向导的示例项目模板。一旦您知道您的向导正在被调用,然后开始继续。

尝试以下

  1. 使您的命名空间声明一致且唯一
  2. 在您的自定义向导中创建一个传递给模板的新参数,让我们说$customnamespace$
  3. 用于_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

仅供参考,我们正在寻求改进文档,因此如果您可以为wiki做出贡献,那就太好了。

于 2014-12-16T03:07:25.307 回答
1

我已经追踪到发生了什么。由于这将是一个冗长的帖子,我将做出一个新的答案来解释问题@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 中模板中所有类中命名空间的变化。(然后类无效,但至少它显示了向导的执行)。

但它应该改变RootNamespaceand并且要做到这一点,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 我真的希望你对这里发生的事情有所了解。

于 2014-12-16T19:40:31.753 回答