しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

項目テンプレートですでに存在するファイルの場合は追加しない

項目テンプレートを自作する際に、追加するファイル以外に必須の共通ファイルがある場合、もしそのファイルがなかったら追加し、すでにあった場合は追加しないような設定がしたいことがあります

その場合にどうしたらよいのか・・・やはりこういった場合もカスタムウィザードを利用するしかないようです

前回作成したカスタムウィザードの中の ShouldAddProjectItem メソッドを下記のように書き換えます

//
// 概要:
//     指定したプロジェクト項目をプロジェクトに追加するかどうかを示します。
//
// パラメーター:
//   filePath:
//     プロジェクト項目のパス。
//
// 戻り値:
//     プロジェクト項目をプロジェクトに追加する場合は true。それ以外の場合は false。
public bool ShouldAddProjectItem(string filePath)
{
    var project = (Project)((object[])this.dte.ActiveSolutionProjects)[0];

    return !File.Exists(project.Properties.Item("FullPath").Value + "¥¥" + filePath);
}

vstemplate の方は下記の ViewModel.ttinclude のように、共通で必要なファイルを $fileinputname$ のパラメータを利用せずに絶対パスで配置先を設定するようにします

<?xml version="1.0" encoding="utf-8"?>
<VSTemplate Version="3.0.0" Type="Item" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
  <TemplateData>
    <Name>MVPVM ViewModel(Portable)</Name>
    <Description>MVPVM アーキテクチャのテキストテンプレートつき ViewModel</Description>
    <Icon>ViewModel.png</Icon>
    <TemplateID>Microsoft.CSharp.Class</TemplateID>
    <ProjectType>CSharp</ProjectType>
    <ShowByDefault>false</ShowByDefault>
    <NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>
    <SortOrder>41</SortOrder>
    <DefaultName>ViewModel.cs</DefaultName>
  </TemplateData>
  <TemplateContent>
    <ProjectItem ReplaceParameters="true" OpenInEditor="true" TargetFileName="$fileinputname$.cs">ViewModel.cs</ProjectItem>
    <ProjectItem ReplaceParameters="true" OpenInEditor="true" CustomTool="TextTemplatingFileGenerator" TargetFileName="$fileinputname$.tt">ViewModel.tt</ProjectItem>
    <ProjectItem ReplaceParameters="false" OpenInEditor="false" TargetFileName="/Templates/ViewModel.ttinclude">Templates/ViewModel.ttinclude</ProjectItem>
  </TemplateContent>
  <WizardExtension>
    <Assembly>PrismMVPVM.Templates, Version=1.0.0.0, Culture=neutral, PublicKeyToken=c8a122ba7c2f04d1</Assembly>
    <FullClassName>PrismMVPVM.Templates.ItemTemplateWizard</FullClassName>
  </WizardExtension>
</VSTemplate>

こうすると /Templates/ViewModel.ttinclude がなければ追加され、あれば追加されないようになります

こういうテンプレートの使い方が全然解説されてないんですが、なんででしょうね;