以前、NancyでASP.NETとSelf Hostingでのマルチホスティングをするために、
- SelfHosting
- AspNetHosting
- Nancyアプリ本体
の3プロジェクトを1ソリューションとして作成していました。
C# + Nancyを使って、1つのアプリでHerokuとAzure Websitesの両方へデプロイできるように構成する - メモ的な思考的な
ただ、色々と試すときに毎回イチから作成するのが手間だったため、NuGetパッケージや複数プロジェクトを含むプロジェクトテンプレートを作成してみることにしました。
環境
- Windows7 x64
- Visual Studio 2013 Community
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#の下にあるようです。
そのテンプレートを選択してプロジェクトを作成すると、ソリューションエクスプローラーに3つのプロジェクトが作成されました。
また、NancyAppとなっていたプロジェクト名は、自分で入力したプロジェクト名へと変更となっています。
NuGetパッケージの再インストール
各プロジェクトを確認すると、NuGetパッケージへの参照で警告が出ています。そのため、NuGetパッケージの再インストールします。
NuGetパッケージ復元の有効化
ソリューションの上で右クリックし、NuGetパッケージ復元の有効化を行います。
オンラインパッケージからの復元
パッケージマネージャーコンソールを開きます。今回も
一部のNuGetパッケージがこのソリューションにありません。オンラインパッケージから復元するにはクリックします
との表示があるため、「復元」ボタンをクリックします。
ただ、復元してもまだ参照設定には警告が残っています。
NuGetパッケージの再インストール
パッケージマネージャコンソールにて以下のコマンドを実行し、NuGetパッケージの再インストールを行います。
Update-Package -Reinstall
参考:A quick tutorial on the Update-Package command
再度、プロジェクトの参照設定を確認すると警告が消えています。
リビルドと動作確認
あとはソリューションのリビルドを行った後、スタートアッププロジェクトを変更して動作することを確認します。
ソースコード
GitHubに上げておきました。
thinkAmi/NancyOwinMultiHostingTemplate
構成としては、
- ルートディレクトリ
NancyOwinMultiHosting.vstemplate
など
template
ディレクトリの下- 今回作成した
NancyOwinMultiHosting.zip
- 今回作成した
src
ディレクトリの下- テンプレートの元となったソリューション
としました。