次の方法で共有


複数プロジェクトのテンプレートを作成する

複数プロジェクトのテンプレートは、複数の 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>

既存のソリューションから複数プロジェクトのテンプレートを作成する

  1. ソリューションを作成して 2 つ以上のプロジェクトを追加します。

  2. テンプレートにエクスポートする準備ができるまで、プロジェクトをカスタマイズします。

    ヒント

    テンプレート パラメーターを使用していて、親テンプレートの変数を参照したい場合は、パラメーターの名前にプレフィックス ext_ を付加します。 たとえば、「 $ext_safeprojectname$ 」のように入力します。 また、ProjectTemplateLink 要素の CopyParameters 属性を true に設定します。

    <ProjectTemplateLink ProjectName="MyProject" CopyParameters="true">...</ProjectTemplateLink>
    
  3. [プロジェクト] メニューの [テンプレートのエクスポート] を選択します。

    テンプレートのエクスポート ウィザードが開きます。

  4. [テンプレートの種類の選択] ページで、[プロジェクト テンプレート] を選択します。 テンプレートにエクスポートするプロジェクトを 1 つ選択し、[次へ] を選択します。 (ソリューション内のプロジェクトごとに、この手順を繰り返します。)

  5. [テンプレート オプションの選択] ページで、テンプレートの名前および省略可能な説明、アイコン、プレビュー画像を入力します。 [完了] を選択します。

    プロジェクトが .zip ファイルにエクスポートされ、指定した出力場所に置かれます。

    Note

    各プロジェクトはテンプレートに個別にエクスポートする必要があるため、ソリューションのプロジェクトごとに上記の手順を繰り返します。

  6. テンプレートのディレクトリを作成し、プロジェクトごとにサブディレクトリを作ります。

  7. 各プロジェクトの .zip ファイルの内容を、作成した対応するサブディレクトリに抽出します。

  8. ベース ディレクトリ内に、.vstemplate ファイル拡張子を持つ XML ファイルを作成します。 このファイルには、複数プロジェクトのテンプレートのメタデータが含まれます。 ファイルの構造については、この後の例をご覧ください。 プロジェクトごとに vstemplate ファイルの相対パスを指定してください。

  9. ベース ディレクトリ内のすべてのファイルを選び、右クリック メニューまたはコンテキスト メニューから、[送る]>[圧縮 (zip 形式) フォルダー] の順に選びます。

    ファイルとフォルダーが .zip ファイルに圧縮されます。

  10. ユーザー プロジェクト テンプレートのディレクトリに .zip ファイルをコピーします。 既定では、このディレクトリは %USERPROFILE%\Documents\Visual Studio <バージョン>\Templates\ProjectTemplates です。

  11. Visual Studio で [ファイル]>[新規作成]>[プロジェクト] の順に選択し、ご自分のテンプレートが表示されることを確認します。

2 つのプロジェクトの例

基本的なマルチプロジェクトのルート vstemplate ファイルの例を以下に示します。 この例では、テンプレートに My Windows ApplicationMy 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 ClassesGraphics 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.ClientMultiProject.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 の記述は次のようになっています。 ProjectTemplateLinkCopyParameters 属性が 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 タグの属性 ReplaceParameterstrue に設定されています。

<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>