none
Visual Studio 2019でProjectTemplateの作成が上手く行きません RRS feed

  • 質問

  • こんにちは、初めてプロジェクトおよび項目テンプレートの作成にチャレンジしています。

    最終的にはNugetの上げたパッケージを取り組んだプロジェクトテンプレートを作りたいのですが、まずは手始めにチュートリアルに習って最も単純なプロジェクトテンプレートを作成して、取り敢えず「新しいプロジェクトの作成」ダイアログ右側のリストに表示させるところまでを実装しようとしたのですが、全然表示されません。(=勿論フィルタは全部クリアしてあります。)

    まず何はさておいてローカル機にエクスポートしたプロジェクトテンプレートが表示・選択出来なければ先に進めませんので、ここがまず出来るようにしたいです。

    ■ここまで実行した作業手順

    1. 新しいプロジェクト作成ダイアログよりC# Project Templateを選択する。
    2. 既にこのテンプレートに用意されているClass1に単純にHelloを返すメソッドを1個追加する。これでリビルドを実行してエラーが無いことを確認する。
    3. テンプレートのエクスポートではアイコン画像の他に、プレビューイメージも要求されるので作成してプロジェクトルートに置く。そのうえでプロジェクトメニューより「テンプレートのエクスポート」を選択して実行します。

    これでチュートリアルに書かれている通りマイドキュメント\Visual Studio 2019\My Exported Templatesにプロジェクトと同名の.zipファイルを出力します。これをマイドキュメント\Visual Studio 2019\Templates\ProjectTemplatesにコピーします。


    この操作により、いったんVisual Studioを終了して再起動し、新しいプロジェクトの作成を指定すると「新しいプロジェクトの作成ダイアログ」で、プラットフォームや言語などのフィルタを全て取り払えばこのテンプレートが表示される。。。ということになっているのですが、全くどこにも表示されません。

    ■知りたいこと

    まず自分の手順に何か間違いがあったかどうかを知りたいです。どうすれば一番単純なこの1個だけの極小のクラスを持つプロジェクトテンプレートを「新しいプロジェクトの作成」ダイアログに表示することが出来るか知りたいです。

    ■参考

    自分の使用しているマシン及びVisual Studioのバージョンは以下の通りです。

    プロセッサ:Intel(R) Core(TM) i5-24005 CPU @2.50GHz
    実装メモリ 16.0GM
    システムの種類: 64ビットオペレーションシステム
    Windowsのエディション:Windows 10 Enterprise

    Microsoft Visual Studio Professional 2019 Version 16.5.2

    --------

    自分のソースは以下のGitHubに上げてあります。

    https://github.com/TrailRunner-MF/Samples/tree/master/SimpleProjectTemplate

    作りは非常に単純で、「プロジェクトテンプレート」を基に作ったプロジェクトのClassにHelloメソッドを加え、更にプロジェクト内にプレビュー用画像「SimpleProjectTemplatePreview.png」を追加しただけです。

    --------

    以上、どんなヒントでも構いませんので何卒アドバイスの方、よろしくお願いいたします。



    2020年4月5日 5:31

回答

  • Zipファイルの中に「MyTemplate.vstemplate」と「SimpleProjectTemplate.vstemplate」の2個入っているのがおかしいのでは?

    あと、SimpleProjectTemplateのほうの<TemplateData>内で$safeprojectname$が使われていますが、<TemplateData>内では置換されません。これは<TemplateContent>の中のを、ユーザーが指定したプロジェクト名で置換するやつです。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2020年4月7日 3:35
  • gekka様

    出来ました!!アドバイス通りMyTemplate.vstemplateを削除して、SimpleProjectTemplate.vstemplateに一本化して、<TemplateData>内の$safeprojectname$置換文字列を実際の「SimpleProjectTemptae」に変更して圧縮し、ユーザーテンプレートフォルダに配置したらちゃんと表示され、かつ、これを元にプロジェクトを作るとClass1も、その中のHelloメソッドも出来ていました!!

    更に最初にアドバイスいただいたタグを埋め込んだら意図した通りC#、Windows、Consoleアプリのフィルターもバッチリ掛かりました。本当に有り難うございました。

    --------

    ただし、ご指摘いただいたMyTemplate.vstemplateは自分が作ったものではなく、元々Visual Studioの新規作成で「C# Project Template」を選択してテンプレートのエクスポートを実行すると出力された.zipファイル内に自動的に追加されているものです。

    勝手な想像ですが、C# Project Templateの.zipフォルダの中身の仕様が変わり、

    『置換パラメータを含むvstemplateは[プロジェクト名].vstempateに、静的な定義と各種こまごまとした設定はMyTemplate.vstemplateに書く』

    といった仕様になり、それを解釈する側のVisual Studioがその仕様に追いついていないのではないか?という疑念が湧きました。とすれば、これは現在あちこちで起きてるかもしれない事象なので、gekka様のアドバイスが多くの人を救うかもしれないことを追記させていただきます。

    重ねて調査ご協力ありがとうございました。

    2020年4月7日 5:18

すべての返信

  • VS2019からテンプレートにはタグが付くようになりました。
    VS2019のプロジェクト新規作成のダイアログの「言語」「プラットフォーム」「プロジェクトタイプ」はそのタグに対してフィルター処理をしてます。

    しかしウィザードから作ったテンプレートにはタグをつけることができてないのです。
    そのため、どのフィルターも適用されない「すべての言語」「すべてのプラットフォーム」「すべてのプロジェクトの種類」にした場合のみ一覧に表示されます。
    大量にあるテンプレートの中に埋もれて見つけにくいので、テンプレートの説明などに見つけやすい文字列を入力しておいて、検索ボックスにその文字列を入力してやれば存在することが確認できるはずです。

    つまりタグが無いことが見つけにくくなっている問題なので、手作業でそのタグをつけることで分類ができるようになります。

    手順としては、

    1. ZIPファイルの中から*.vstemplateを取り出す。
    2. メモ帳などで開く。
    3. タグを追加して保存。
    4. ZIPファイルに戻す。

    を行います。
    追加で記入するのは、たとえば「C#」「Windows用」「コンソール」だと以下のようになります。

    <VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
      <TemplateData>
        <Name>ConsoleAppTest</Name>
        <Description>あいうえお</Description>
        <ProjectType>CSharp</ProjectType>
        <ProjectSubType></ProjectSubType>
        <SortOrder>1000</SortOrder>
        <CreateNewFolder>true</CreateNewFolder>
        <DefaultName>ConsoleAppTest</DefaultName>
        <ProvideDefaultName>true</ProvideDefaultName>
        <LocationField>Enabled</LocationField>
        <EnableLocationBrowseButton>true</EnableLocationBrowseButton>
        <CreateInPlace>true</CreateInPlace>
        <Icon>__TemplateIcon.png</Icon>
        <PreviewImage>__PreviewImage.JPG</PreviewImage>
      
        <LanguageTag>CSharp</LanguageTag>
        <PlatformTag>Windows</PlatformTag>
        <ProjectTypeTag>Console</ProjectTypeTag>
    
      </TemplateData>
      <TemplateContent>
        <Project TargetFileName="ConsoleAppTest.csproj" File="ConsoleAppTest.csproj" ReplaceParameters="true">
          <ProjectItem ReplaceParameters="true" TargetFileName="Program.cs">Program.cs</ProjectItem>
        </Project>
      </TemplateContent>
    </VSTemplate>
    タグに設定する文字列は組み込みのタグに一覧があります。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2020年4月5日 7:53
  • gekka様、こんにちは。早々のレス有り難うございます。

    早速アドバイスいただいた手順に沿ってやってみました。

    結果として一瞬上手くいったかに思えたのですが最終的にうまくいかず、更に悪いことに一切のエクスポートしたプロジェクトテンプレートを認識しなくなりました

    ■今回試したこと--------

    自分は2台のPCで作業しており、最初この問題が発覚したのはデスクトップPCで、こちらでは頂いたアドバイスに従ってテンプレートをエクスポートした後解凍してタグを追加して圧縮し直しましたが、こちらではそれでも全然新規プロジェクト作成ダイアログに出てきません

    そこで環境を変えてノートPCにこのプロジェクトテンプレートのソースをGITから落として→リビルド→ノートPCのテンプレートフォルダにエクスポートしたところ、新規プロジェクト作成ダイアログのキーワード入力エリアに「SimpleProjectTemplate」を入れると候補として表示されるようになりました。そのままプロジェクトを作成したて動作確認しましたがここは問題ありません。・・・で、この後に大きな問題が発生しました!!

    ■今回問題が起きた手順--------

    手順を再確認するためにいったんテンプレートをクリアして手順をやり直そうと思い、マイドキュメント以下の「\Documents\Visual Studio 2019\Templates\ProjectTemplates」上に作成された.zipファイルを削除してもう1回元のプロジェクトテンプレートの.vstempateにタグを埋め込んでエクスポートし直したら、またまた新規プロジェクト作成ダイアログからこのテンプレートが全く見えなくなりました。

    手順を何度もあの手この手を変えて繰り返したのですが何をやってもダメです。

    全然別の新しいプロジェクトテンプレートを作って教えていただいた手順に従ってやってみましたが(例えば「HelloProjectTemplate」とか「HelloProjectTemplate2」とか)何とこれらも全然テンプレートとして読み込んでくれません

    思い返してみると最初に質問を上げたデスクトップPC側も同様だった気がします。

    ■想定される障害--------

    Visual Studioには一度ユーザーテンプレートフォルダに置いたテンプレートを手動で消すと、いかなるユーザーテンプレートも認識しなくなる

    恐れ入りますがちょっと試してみてください。昨夜からずっと試してみていったんここまでの状況を報告させていただきます。何か救済方法か試してみる処理がありましたら是非ご教授願います。

    ※)もし別スレッドとして上げた方がよければそうさせていただきます。

    どうかよろしくお願いします。


    2020年4月6日 8:27
  • 再現しないです。
    githubにあるvstemplateで作っても問題なく表示されますし、消して再登録しても表示されます…

    おかしいZipをアップしたほうが早いと思う


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2020年4月6日 11:05
  • gekka様
    --------
    やはり自分の環境では何をやってもダメです。
    取りあえずご提案のあったvstemplateをGITに上げました。

    https://github.com/TrailRunner-MF/Samples/blob/master/SimpleProjectTemplate.zip

    試していただけると幸いです。

    自分はVisual Studioのツール→オプションメニューの「プロジェクトおよびソリューション」ブロック内の「場所」でユーザーテンプレートの場所を色々変更して、そこにvstemplateファイルを置いたり、もう一度変更した後でテンプレートのエクスポートをかけたりしてみましたが全くダメです!!

    どうかよろしくお願いいたします。

    2020年4月7日 3:13
  • Zipファイルの中に「MyTemplate.vstemplate」と「SimpleProjectTemplate.vstemplate」の2個入っているのがおかしいのでは?

    あと、SimpleProjectTemplateのほうの<TemplateData>内で$safeprojectname$が使われていますが、<TemplateData>内では置換されません。これは<TemplateContent>の中のを、ユーザーが指定したプロジェクト名で置換するやつです。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2020年4月7日 3:35
  • gekka様

    出来ました!!アドバイス通りMyTemplate.vstemplateを削除して、SimpleProjectTemplate.vstemplateに一本化して、<TemplateData>内の$safeprojectname$置換文字列を実際の「SimpleProjectTemptae」に変更して圧縮し、ユーザーテンプレートフォルダに配置したらちゃんと表示され、かつ、これを元にプロジェクトを作るとClass1も、その中のHelloメソッドも出来ていました!!

    更に最初にアドバイスいただいたタグを埋め込んだら意図した通りC#、Windows、Consoleアプリのフィルターもバッチリ掛かりました。本当に有り難うございました。

    --------

    ただし、ご指摘いただいたMyTemplate.vstemplateは自分が作ったものではなく、元々Visual Studioの新規作成で「C# Project Template」を選択してテンプレートのエクスポートを実行すると出力された.zipファイル内に自動的に追加されているものです。

    勝手な想像ですが、C# Project Templateの.zipフォルダの中身の仕様が変わり、

    『置換パラメータを含むvstemplateは[プロジェクト名].vstempateに、静的な定義と各種こまごまとした設定はMyTemplate.vstemplateに書く』

    といった仕様になり、それを解釈する側のVisual Studioがその仕様に追いついていないのではないか?という疑念が湧きました。とすれば、これは現在あちこちで起きてるかもしれない事象なので、gekka様のアドバイスが多くの人を救うかもしれないことを追記させていただきます。

    重ねて調査ご協力ありがとうございました。

    2020年4月7日 5:18
  • 追記です。

    英語版フォーラムに違う切り口でこのテーマについての質問を上げたのですが、フォーラムスタッフとみられる方(=多分MSの人?)から丁寧なお返事を頂きました。

    以下のこのスレッドのURLを上げておきますのでよろしければ参考にしてください。

    https://social.msdn.microsoft.com/Forums/vstudio/en-US/e0cdaf45-c4b2-4c88-b8d4-fba6f1d37d8e/custom-project-templates-does-not-show-up-again-if-you-delete-any?forum=vsx

    以上

    2020年4月7日 16:03