Posted at

Visual Studio 2017 用の Xamarin.Forms プロジェクトテンプレートの VSIX を作った話


はじめに

この記事は、田淵義人さんが作成した Xamarin 用のプロジェクトテンプレートの VSIX を作成した時の手順メモです。

以下のプロジェクトテンプレートの VSIX を作成しました。



  • XamarinFormsPCLTemplate


    • PCL 版の Xamarin.Forms プロジェクトテンプレート




  • XamarinNativePCLTemplate


    • プロジェクトのコア部分が PCL のクラスライブラリで構成された Xamarin ネイティブのプロジェクトテンプレート




プロジェクトテンプレート用の VSIX の作り方

ここでは、プロジェクトテンプレートを作った時の流れを記載しておきます。


事前準備

VSIX を作成するには、Visual Studio に拡張機能開発用のツールが必要です。インストールされていない場合は、Visual Studio のインストーラーから、拡張機能開発用のツールをインストールしておいてください。


VSIX プロジェクトを作成する

Visual Studio のプロジェクトの新規作成で、[Extensibility] のツリー内の [VSIX Project] を選択してプロジェクトを作成します。


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

Visual Studio のプロジェクトの追加ウィンドウで、[Extensibility] ツリー内の [C# Project Template] を選択します。


プロジェクト構造

二つのプロジェクトが作成されます。


  • VsixProject


    • Visual Studio の拡張機能のインストーラーを作成するためのプロジェクト



  • Template


    • プロジェクトテンプレートのコンテンツを管理するプロジェクト



ビルド時にパスが長すぎてビルドエラーが出る場合があるので、プロジェクト名は短い方がよいです。


テンプレートのコンテンツをプロジェクトに追加する

プロジェクトテンプレートプロジェクトにテンプレートのコンテンツを追加します。

せっかくなので、Visual Studio の新規プロジェクト作成ウィンドウで、[Closs-platform] の中にプロジェクトテンプレートが表示されるようにします。

この設定は、ルートとなる vstemplate ファイルのプロパティの設定で行います。プロパティウィンドウの VSTemplateCategory の値に Cross-Platform を設定します。


VSIX プロジェクトのアセットにプロジェクトテンプレート用のプロジェクトを追加する

VSIX プロジェクトの source.extension.vsixmanifest ファイルを開いて、Asset を選択しアセットを新規追加します。

新規作成ウィンドウで、Type で、Microsoft.VisualStudio.ItemTemplate を選択、SourceA project in current solution を選択、 Project でプロジェクトテンプレートのプロジェクトを選択します。


テンプレートのデバッグ

VSIX プロジェクトをデバッグすると、Visual Studio の拡張機能をデバッグするための Visual Studio が起動します。この環境を利用して作成したテンプレートが正しく動作するかをデバッグすることができます。


ビルドして VSIX ファイルを作成する

VSIX のプロジェクトをビルドするとインストーラーが作成されます。


まとめ

Visual Studio の拡張機能を利用すると、プロジェクトテンプレートの作成、デバッグ、インストーラーの作成が比較的簡単にできますので、ぜひトライしてみてください。


謝辞

田淵義人さんが作成した Xamarin 用のプロジェクトテンプレートのおかげで、テンプレートのインストーラーの作成と記事の執筆ができました。

本当にありがとうございます。


参考

今回作成した VSIX は、GitHub に公開しています。



  • XamarinFormsPCLTemplate


    • PCL 版 Xamarin.Forms プロジェクトテンプレート




  • XamarinNativePCLTemplate


    • プロジェクトのコア部分が PCL のクラスライブラリで構成された Xamarin ネイティブのプロジェクトテンプレート