TemplateBuilder和SideWaffle。项目模板。更改默认根命名空间

时间:2014-12-14 16:20:31

标签: c# templates visual-studio-2013 sidewaffle

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

2 个答案:

答案 0 :(得分:1)

使用SideWaffle(更具体地说,TemplateBuilder,构建在哪个SideWaffle之上),如果要创建自定义向导,则应该能够实现此目的。

我建议首先使用自定义向导获取示例项目模板。一旦您知道正在调用您的向导,那么就开始继续前进。

尝试以下

  1. 使命名空间声明一致且唯一
  2. 在自定义向导中,创建一个传递给模板的新参数,例如$customnamespace$
  3. 使用_preprocess.xml将命名空间替换为$customnamespace$。这样你就可以保留你的标准代码,这样就可以使用F5 / CTRL + F5,但模板版本的命名空间声明将被替换为。
  4. 然后,当调用向导时,传递额外的$customnamespace$参数,它将被替换。多项目向导执行此操作,因此源可能有用https://github.com/ligershark/template-builder/blob/master/src/TemplateBuilder/ChildWizard.cs

    有关替换https://github.com/ligershark/side-waffle/wiki/How-replacements-work的更多信息。

    仅供参考我们希望改进文档,以便您可以为the wiki做出贡献。

答案 1 :(得分: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中模板中所有类中的命名空间的更改。 (然后这些类无效,但至少它显示了向导的执行情况。)

但是它应该更改RootNamespaceAssemblyname,为此,我需要删除*.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我真的希望你知道这里发生了什么。