複数プロジェクトのテンプレートを作成する
複数プロジェクトのテンプレートは、複数の Visual Studio プロジェクトのコンテナーとして機能します。 複数プロジェクトのテンプレートに基づくプロジェクトが作成されると、テンプレート内のすべてのプロジェクトがソリューションに追加されます。
Note
この記事で説明するテンプレートは、dotnet new
で作成するものではなく、Visual Studio でプロジェクトを作成するときに使用されるものです。
複数プロジェクトのテンプレートには、2 つ以上のプロジェクト テンプレートと ProjectGroup 型のルート テンプレートが含まれます。
複数プロジェクトのテンプレートは、1 つのプロジェクトのテンプレートとは動作が異なります。 これらには、次の固有の特性があります。
複数プロジェクトのテンプレートの個別のプロジェクトには、テンプレートを使用して新しいプロジェクトを作成するとき、名前を割り当てることができません。 代わりに、vstemplate ファイルの ProjectTemplateLink 要素の ProjectName 属性を使用して、各プロジェクトの名前を指定します。
複数プロジェクトのテンプレートには別の言語のプロジェクトを含めることができますが、テンプレート全体そのものは 1 つのカテゴリにのみ配置できます。 vstemplate ファイルの ProjectType 要素でテンプレートのカテゴリを指定します。
複数プロジェクトのテンプレートは、次の項目を含み、.zip ファイルに圧縮する必要があります。
複数プロジェクトのテンプレート全体のルート vstemplate ファイル。 このルート vstemplate ファイルには、新しいプロジェクトを作成するダイアログ ボックスに表示されるメタデータが含まれています。 これによって、テンプレート内のプロジェクト用の vstemplate ファイルを検索する場所も指定されます。 このファイルは、.zip ファイルのルートに配置する必要があります。
完全なプロジェクト テンプレートに必要なファイルを含む 2 つ以上のフォルダー。 フォルダーにはプロジェクトのすべてのコード ファイルが含まれ、プロジェクトの vstemplate ファイルも含まれます。
たとえば、2 つのプロジェクトを含む複数プロジェクトのテンプレート .zip ファイルは、次のファイルとディレクトリを持つことが考えられます。
- MultiProjectTemplate.vstemplate
- \Project1\MyTemplate.vstemplate
- \Project1\Project1.vbproj
- \Project1\Class.vb
- \Project2\MyTemplate.vstemplate
- \Project2\Project2.vbproj
- \Project2\Class.vb
複数プロジェクトのテンプレートのルート vstemplate ファイルは、単一プロジェクトのテンプレートとは次の点が異なります。
VSTemplate 要素の Type 属性は、Project の代わりに ProjectGroup という値を持っています。 たとえば次のような点です。
<VSTemplate Version="2.0.0" Type="ProjectGroup" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
TemplateContent 要素には、含まれるプロジェクトの vstemplate ファイルへのパスを定義する 1 つ以上の ProjectTemplateLink 要素を持つ ProjectCollection 要素が含まれます。 たとえば次のような点です。
<TemplateContent> <ProjectCollection> <ProjectTemplateLink> Project1\MyTemplate.vstemplate </ProjectTemplateLink> <ProjectTemplateLink> Project2\MyTemplate.vstemplate </ProjectTemplateLink> </ProjectCollection> </TemplateContent>
ヒント
複数プロジェクトのテンプレートのみを新しいプロジェクト ダイアログ ボックスに表示し、それに含まれる個々のプロジェクトを表示しない場合は、内部テンプレートに非表示とマークを付けます。 たとえば次のような点です。
<VSTemplate Type="Project" ... >
<TemplateData>
...
<Hidden>true</Hidden>
</TemplateData>
...
</VSTemplate>
既存のソリューションから複数プロジェクトのテンプレートを作成する
ソリューションを作成して 2 つ以上のプロジェクトを追加します。
テンプレートにエクスポートする準備ができるまで、プロジェクトをカスタマイズします。
ヒント
テンプレート パラメーターを使用していて、親テンプレートの変数を参照したい場合は、パラメーターの名前にプレフィックス
ext_
を付加します。 たとえば、「$ext_safeprojectname$
」のように入力します。 また、ProjectTemplateLink 要素の CopyParameters 属性を true に設定します。<ProjectTemplateLink ProjectName="MyProject" CopyParameters="true">...</ProjectTemplateLink>
[プロジェクト] メニューの [テンプレートのエクスポート] を選択します。
テンプレートのエクスポート ウィザードが開きます。
[テンプレートの種類の選択] ページで、[プロジェクト テンプレート] を選択します。 テンプレートにエクスポートするプロジェクトを 1 つ選択し、[次へ] を選択します。 (ソリューション内のプロジェクトごとに、この手順を繰り返します。)
[テンプレート オプションの選択] ページで、テンプレートの名前および省略可能な説明、アイコン、プレビュー画像を入力します。 [完了] を選択します。
プロジェクトが .zip ファイルにエクスポートされ、指定した出力場所に置かれます。
Note
各プロジェクトはテンプレートに個別にエクスポートする必要があるため、ソリューションのプロジェクトごとに上記の手順を繰り返します。
テンプレートのディレクトリを作成し、プロジェクトごとにサブディレクトリを作ります。
各プロジェクトの .zip ファイルの内容を、作成した対応するサブディレクトリに抽出します。
ベース ディレクトリ内に、.vstemplate ファイル拡張子を持つ XML ファイルを作成します。 このファイルには、複数プロジェクトのテンプレートのメタデータが含まれます。 ファイルの構造については、この後の例をご覧ください。 プロジェクトごとに vstemplate ファイルの相対パスを指定してください。
ベース ディレクトリ内のすべてのファイルを選び、右クリック メニューまたはコンテキスト メニューから、[送る]>[圧縮 (zip 形式) フォルダー] の順に選びます。
ファイルとフォルダーが .zip ファイルに圧縮されます。
ユーザー プロジェクト テンプレートのディレクトリに .zip ファイルをコピーします。 既定では、このディレクトリは %USERPROFILE%\Documents\Visual Studio <バージョン>\Templates\ProjectTemplates です。
Visual Studio で [ファイル]>[新規作成]>[プロジェクト] の順に選択し、ご自分のテンプレートが表示されることを確認します。
2 つのプロジェクトの例
基本的なマルチプロジェクトのルート vstemplate ファイルの例を以下に示します。 この例では、テンプレートに My Windows Application と My Class Library という 2 つのオブジェクトが含まれます。 ProjectTemplateLink 要素の ProjectName 属性で、プロジェクトに適用する名前を指定します。
ヒント
ProjectName 属性を指定しない場合、vstemplate ファイルの名前がプロジェクト名として使用されます。
<VSTemplate Version="2.0.0" Type="ProjectGroup"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>Multi-Project Template Sample</Name>
<Description>An example of a multi-project template</Description>
<Icon>Icon.ico</Icon>
<ProjectType>VisualBasic</ProjectType>
</TemplateData>
<TemplateContent>
<ProjectCollection>
<ProjectTemplateLink ProjectName="My Windows Application">
WindowsApp\MyTemplate.vstemplate
</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="My Class Library">
ClassLib\MyTemplate.vstemplate
</ProjectTemplateLink>
</ProjectCollection>
</TemplateContent>
</VSTemplate>
ソリューション フォルダーでの例
この例では、SolutionFolder 要素を使用して、プロジェクトを Math Classes と Graphics Classes という 2 つのグループに分割します。 テンプレートには 4 つのプロジェクトがあり、その 2 つは各ソリューション フォルダーに配置されます。
<VSTemplate Version="2.0.0" Type="ProjectGroup"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>Multi-Project Template Sample</Name>
<Description>An example of a multi-project template</Description>
<Icon>Icon.ico</Icon>
<ProjectType>VisualBasic</ProjectType>
</TemplateData>
<TemplateContent>
<ProjectCollection>
<SolutionFolder Name="Math Classes">
<ProjectTemplateLink ProjectName="MathClassLib1">
MathClassLib1\MyTemplate.vstemplate
</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="MathClassLib2">
MathClassLib2\MyTemplate.vstemplate
</ProjectTemplateLink>
</SolutionFolder>
<SolutionFolder Name="Graphics Classes">
<ProjectTemplateLink ProjectName="GraphicsClassLib1">
GraphicsClassLib1\MyTemplate.vstemplate
</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="GraphicsClassLib2">
GraphicsClassLib2\MyTemplate.vstemplate
</ProjectTemplateLink>
</SolutionFolder>
</ProjectCollection>
</TemplateContent>
</VSTemplate>
プロジェクト参照を使用した例
この例では、プロジェクト参照をマルチプロジェクト テンプレートに追加する方法を説明します。ここで取り上げているのは、基本的にはマルチプロジェクト テンプレートの例を拡張したものです。
この例のソリューションには MultiProject.Client と MultiProject.Shared の 2 つのプロジェクトが含まれています。 プロジェクト MultiProject.Client は、MultiProject.Shared を参照しています。
フォルダー構造は次のようになっています。
- MultiProjectTemplate.vstemplate
- \MultiProject.Client\MultiProject.Client.csproj
- \MultiProject.Client\MyTemplate.vstemplate
- \MultiProject.Shared\MultiProject.Shared.csproj
- \MultiProject.Shared\MyTemplate.vstemplate
テンプレートを使用した場合、MultiProject の部分はユーザーが入力したプロジェクト名に置き換えられます。
MultiProjectTemplate.vstemplate の記述は次のようになっています。 ProjectTemplateLink の CopyParameters 属性が true に設定され、ProjectName 属性にはテンプレート変数 $safeprojectname$ が使用されています。
<VSTemplate Version="2.0.0" Type="ProjectGroup"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
...
<TemplateContent>
<ProjectCollection>
<ProjectTemplateLink ProjectName="$safeprojectname$.Client" CopyParameters="true">
MultiProject.Client\MyTemplate.vstemplate
</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="$safeprojectname$.Shared" CopyParameters="true">
MultiProject.Shared\MyTemplate.vstemplate
</ProjectTemplateLink>
</ProjectCollection>
</TemplateContent>
</VSTemplate>
MultiProject.Client\MyTemplate.vstemplate の記述は次のようになっています。 Project タグの属性 ReplaceParameters が true に設定されています。
<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
...
<TemplateContent>
<Project TargetFileName="MultiProject.Client.csproj" File="MultiProject.Client.csproj" ReplaceParameters="true">
...
</Project>
</TemplateContent>
</VSTemplate>
MultiProject.Client\MultiProject.Client.csproj の記述は次のようになっています。 ProjectReference の属性 Include にはテンプレート変数 $ext_safeprojectname$ が使用されています。
<Project>
...
<ItemGroup>
<ProjectReference Include="..\$ext_safeprojectname$.Shared\$ext_safeprojectname$.Shared.csproj" />
</ItemGroup>
</Project>