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 プロジェクト テンプレートを使用して動作させることはできません。

4

2 に答える 2

1

何が起こっているのかを追跡しました。長い投稿になるので、@ThBlitzの問題を説明する新しい回答を作成します

これは答えではありませんが、上記の問題の詳細な説明であり、長々と申し訳ありません。

だから私はcsprojを変更するためにIWizardの実装をセットアップし、@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.

Ok。したがって、問題は$それらの存在と削除であり、空白を使用するとソリューションを構築できますが、置換値が見つからないため、もちろん置換は機能しません。

ビルドはするが機能しない変更された 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 に答える
1

SideWaffle (より具体的には、 SideWaffleがその上に構築されているTemplateBuilder ) を使用する場合、カスタム ウィザードを作成している場合は、これを実現できるはずです。

最初にカスタム ウィザードが接続されたサンプル プロジェクト テンプレートを入手することをお勧めします。ウィザードが呼び出されていることがわかったら、先に進みます。

以下を試してください

  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 に答える