この記事は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で紹介されていたサイト)。
たとえば、私を含む数名(?)で開発している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が同一でtagsのlanguageが異なるテンプレートが登録されていると-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に放り込んで運用することも可能…なはずなので、覚えておいて損はないと思います。