C#で、NuGetパッケージや複数プロジェクトを含むプロジェクトテンプレートを作成する

以前、NancyでASP.NETとSelf Hostingでのマルチホスティングをするために、

  • SelfHosting
  • AspNetHosting
  • Nancyアプリ本体

の3プロジェクトを1ソリューションとして作成していました。
C# + Nancyを使って、1つのアプリでHerokuとAzure Websitesの両方へデプロイできるように構成する - メモ的な思考的な

 
ただ、色々と試すときに毎回イチから作成するのが手間だったため、NuGetパッケージや複数プロジェクトを含むプロジェクトテンプレートを作成してみることにしました。

 

環境

 

NuGetパッケージや複数プロジェクトを含むソリューションの作成

イチから作っても良かったのですが、以前の記事で作ったソリューションを使いまわすことにしました。
C# + Nancyを使って、1つのアプリでHerokuとAzure Websitesの両方へデプロイできるように構成する - メモ的な思考的な

元にしたソースコードはこちらです。
thinkAmi-sandbox/NancyOwinMutiHosting-sample · GitHub

 

NuGetパッケージ等のアップデート

既存のNuGetパッケージをインストールするため、パッケージマネージャコンソールを開いたところ、

一部のNuGetパッケージがこのソリューションにありません。オンラインパッケージから復元するにはクリックします

というメッセージが表示されました。

そのため、「復元」ボタンを押してパッケージを復元します。

 
次に、パッケージマネージャコンソールにて以下のコマンドを実行し、各NuGetパッケージのバージョンを最新にします。

Update-Package

 

動作確認

NuGetパッケージが最新になったところで、動作確認をします。

  • OwinAspNetHostingプロジェクト
  • OwinSelfHostingプロジェクト

をそれぞれスタートアッププロジェクトに設定し、両方とも「hello razor」が表示されればOKです。

 

プロジェクトテンプレートの出力

動作が確認できたので、プロジェクトテンプレートを出力します。

 

テンプレートのエクスポートウィザードの起動

メニューより、 ファイル > テンプレートのエクスポート を選択して、起動します。

 

3つのプロジェクトのエクスポート

テンプレートの種類の選択画面で、「テンプレートの作成元のプロジェクトを選択してください」のドロップダウンリストで、

  • NancyApp
  • OwinSelfHosting
  • OwinAspNetHosting

の3つが選択できるので、それぞれのプロジェクトに対して以下の指定を行ってテンプレートをエクスポートします。

項目 内容
作成するテンプレートの型 プロジェクトテンプレート
テンプレートを自動的にVisualStudioにインポート チェックを外す

 
今回はNuGetパッケージや複数プロジェクトを含むプロジェクトテンプレートを作成するため、個々のプロジェクトをVisualStudioにインポートしません。また、上記以外の項目はデフォルトのままにします。

 
その後、完了ボタンを押すと、エクスポートしたテンプレートファイル(zipファイル)が以下に保存されます。

"%USERPROFILE%\Documents\Visual Studio 2013\My Exported Templates"

参考: 方法 : プロジェクト テンプレートを作成する - MSDN

 

3つのプロジェクトを含むテンプレートの作成

zipファイルの解凍

上記で作成した3つのプロジェクトテンプレート(zipファイル)を解凍します。

解凍後、各プロジェクトのフォルダにMyTemplate.vstemplateファイルが含まれていることを確認します。

 

vstemplateファイルの作成

以下を参考に、3つのプロジェクトを一つのソリューションにまとめるvstemplateファイルを作成します。今回は「NancyOwinMultiHosting.vstemplate」というファイル名にします。
方法 : 複数プロジェクトのテンプレートを作成する - MSDN

 
なお、上記のリンクのままだとNancyアプリのプロジェクト名が変更できず、「NancyApp」のままになってしまいます。

そのため、予約済テンプレートパラメータsafeprojectnameを使って、プロジェクトテンプレートを選択した時のプロジェクト名を適用するように変更します。
参考:テンプレート名 - MSDN

 
ファイルの内容は以下の通りです。これをUTF-8のBOMなしで保存します。

NancyOwinMultiHosting.vstemplate
<VSTemplate Version="2.0.0" Type="ProjectGroup"
    xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
    <TemplateData>
        <Name>NancyOwinMultiHosting</Name>
        <Description>C# project template for creating Nancy OWIN multi-hosting projects (ASP.NET and Self Hosting, with Razor view engine)</Description>
        <Icon>Icon.ico</Icon>
        <ProjectType>CSharp</ProjectType>
    </TemplateData>
    <TemplateContent>
        <ProjectCollection>
            <ProjectTemplateLink ProjectName="$safeprojectname$">
                NancyApp\MyTemplate.vstemplate
            </ProjectTemplateLink>
            <ProjectTemplateLink ProjectName="OwinAspNetHosting">
                OwinAspNetHosting\MyTemplate.vstemplate
            </ProjectTemplateLink>
            <ProjectTemplateLink ProjectName="OwinSelfHosting">
                OwinSelfHosting\MyTemplate.vstemplate
            </ProjectTemplateLink>
        </ProjectCollection>
    </TemplateContent>
</VSTemplate>

 
この時点でのディレクトリ構成は以下の通りです。

My Exported Templates\
├── NancyApp\
│   └── Properties\
│   └── Views\
│   ├── MyTemplate.vstemplate
│   ├── __TemplateIcon.ico
│   ├── NancyApp.csproj
│   └── ...
├── OwinAspNetHosting\
│   └── Properties\
│   ├── MyTemplate.vstemplate
│   ├── __TemplateIcon.ico
│   ├── OwinAspNetHosting.csproj
│   └── ...
├── OwinSelfHosting\
│   └── Properties\
│   ├── MyTemplate.vstemplate
│   ├── __TemplateIcon.ico
│   ├── OwinSelfHosting.csproj
│   └── ...
└── NancyOwinMultiHosting.vstemplate

 

テンプレートzipの作成

3つのプロジェクトテンプレートフォルダと vstemplateファイルを、1つのzipファイルとしてまとめます。

今回は以下の4つのフォルダ/ファイルを選択して、右クリック -> 送る > 圧縮(zip形式) フォルダー によりzipファイルとしてまとめます。

  • NancyApp
  • OwinAspNetHosting
  • OwinSelfHosting
  • NancyOwinMultiHosting.vstemplate

まとめたzipファイル名は、「NancyOwinMultiHosting.zip」とします。

 

テンプレートzipをプロジェクトテンプレートフォルダへとコピー

できあがったNancyOwinMultiHosting.zipファイルを、プロジェクトテンプレートとして認識する以下のフォルダへとコピーします。

"%USERPROFILE%\Documents\Visual Studio 2013\Templates\ProjectTemplates"

 

プロジェクトテンプレートの動作確認

新規プロジェクトの作成

VisualStudioを起動し、新規プロジェクトを作成します。作成したテンプレートはVisualC#の下にあるようです。

f:id:thinkAmi:20150404184123p:plain

そのテンプレートを選択してプロジェクトを作成すると、ソリューションエクスプローラーに3つのプロジェクトが作成されました。

また、NancyAppとなっていたプロジェクト名は、自分で入力したプロジェクト名へと変更となっています。

f:id:thinkAmi:20150404184421p:plain

 

NuGetパッケージの再インストール

各プロジェクトを確認すると、NuGetパッケージへの参照で警告が出ています。そのため、NuGetパッケージの再インストールします。

 

NuGetパッケージ復元の有効化

ソリューションの上で右クリックし、NuGetパッケージ復元の有効化を行います。

 

オンラインパッケージからの復元

パッケージマネージャーコンソールを開きます。今回も

一部のNuGetパッケージがこのソリューションにありません。オンラインパッケージから復元するにはクリックします

との表示があるため、「復元」ボタンをクリックします。

 
ただ、復元してもまだ参照設定には警告が残っています。

f:id:thinkAmi:20150404184429p:plain

 

NuGetパッケージの再インストール

パッケージマネージャコンソールにて以下のコマンドを実行し、NuGetパッケージの再インストールを行います。

Update-Package -Reinstall

参考:A quick tutorial on the Update-Package command

 
再度、プロジェクトの参照設定を確認すると警告が消えています。

 

リビルドと動作確認

あとはソリューションのリビルドを行った後、スタートアッププロジェクトを変更して動作することを確認します。

 

ソースコード

GitHubに上げておきました。
thinkAmi/NancyOwinMultiHostingTemplate

 
構成としては、

  • ルートディレクトリ
    • NancyOwinMultiHosting.vstemplate など
  • templateディレクトリの下
    • 今回作成したNancyOwinMultiHosting.zip
  • srcディレクトリの下
    • テンプレートの元となったソリューション

としました。

 

その他参考