dotnet new用のテンプレートを使う、作る

この記事はF# Advent Calendar 2017の6日目の記事です。 F#固有の話ではないですが、知っていると少し捗るかもしれない話をします。

dotnet newコマンドでnugetに公開されたテンプレートを使う

dotnet newは.NET Core SDKでテンプレートを用いてプロジェクトを作成するコマンドです。

https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-new?tabs=netcore2x

リポジトリはこちら:

https://github.com/dotnet/templating

標準でいくつかのテンプレートが搭載されていますが、dotnet new installコマンドを使えばnugetに公開されているテンプレートをインストールできます。

テンプレートを探すには下記サイトが便利です(公式のwikiで紹介されていたサイト)。

dotnet templates

たとえば、私を含む数名(?)で開発しているPersimmonのテンプレートはこんな感じでヒットします。

http://dotnetnew.azurewebsites.net/template/Persimmon.Templates/Persimmon.FSharp

テンプレートを作る

テンプレートの構成や設定は公式のwikiをみるのが一番です。

https://github.com/dotnet/templating/wiki/%22Runnable-Project%22-Templates

プロジェクトファイルは言語にあわせて用意します。 F#の場合は.fsprojですね(と申し訳程度のF#要素を挟んでおく)。

設定のうちshortNameは実際にdotnet newコマンドで使うので名前を吟味したほうが良いでしょう。 あとは、groupIdentityが同一でtagslanguageが異なるテンプレートが登録されていると-langオプションで言語選択できるようになります。

あと、複数言語のテンプレートを用意したいプロジェクト向けとして、1つのnugetパッケージには複数のテンプレートをほうり込めます。 これに関しては具体例をみたほうが早いので、nunitリポジトリをとりあげておきます。

https://github.com/nunit/dotnet-new-nunit

テンプレートをnugetで公開する

いつものごとくnuspecを書くわけですが、テンプレート用のパッケージであることを明示するためにmetadataタグ下にpackageTypesを追加します。

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
  ...
  <packageTypes>
    <packageType name="Template" />
  </packageTypes>
  </metadata>
  <files>
    <file src="..\templates\**" target="" />
  </files>
</package>

ファイルはテンプレートを置いているディレクトリ下のコードを全部取り込んでも問題ないことがほとんどだと思います。

おわりに

CLIで完結するのでテンプレートを作るハードルがそこそこ低いです。 publicなものに限らず社内NuGetに放り込んで運用することも可能…なはずなので、覚えておいて損はないと思います。