ADVENT CALENDAR 2019

F#のプロジェクトテンプレートを作ってみた

By wraikny

はじめに

F#のプロジェクトを作るときにFAKE( 5日目 に紹介しました)やCIを書き直すのが面倒だったし、初心者もわかりやすいように、テンプレートを作ってみました。

F#に関しては、こちらの記事がとても詳しく丁寧です:
F# を知ってほしい - Qiita

今回説明するのはこちらです。 READMEだけでも大体わかります。
wraikny/FsTemplate - GitHub

環境

.NET Core SDK 3.0以上が必要です。
未インストールの方はこちらから
https://dotnet.microsoft.com/download

$ dotnet --version
3.0.100

また、VSCodeやVimを使っている方は、Ionideという拡張機能をインストールすることで補完等が効くようになります。 自分はVSCode + Ionideを使っていてオススメです。

使っていく

リポジトリを作る

まずは先程のリポジトリを開いてみましょう。

FsTemplateのトップ画像

Use this template” という緑色のボタンを押した後、名前の入力などを行って、リポジトリが作られます。

Cloneした後、toolpaketの復元をしましょう。

$ git clone <Your Repository>
$ dotnet tool restore
$ dotnet paket restore

CI Statusの参照先を変える

以下のCIに対応しています。

  • Github Actions
  • Travis CI
  • AppVeyor

PushやPull Request時に自動的にビルドと単体テストを実行して結果を表示する事ができます。

README.md を見ると、デフォルトではwraikny/FsTemplatのCI StatusのBadgeを表示しています。 これを 作成したリポジトリ に変更していきます。

FsTemplateのCIStatus

wraikny/FsTemplate をあなたの OWNER/REPOSITORY に置換すると、Github ActionsとTravis CIのBadgeの参照先が変わります。

Github Actionsは リポジトリ構造 から自動的に実行されるので終わりです。

基本的にはGithub Actionsだけで十分なので、他のCI Badgeは<!--- comment out --->してよいでしょう。 (他のCIの設定方法は本記事の末尾に記載しておきます)

プロジェクトを作る

デフォルトだと

がありますね。

$ dotnet fake build # Build
$ dotnet run --project src/SampleApp # プロジェクト実行
$ dotnet fake build -t Test # build.fsxのTestプロジェクトを実行

実行プロジェクト

新しくF#の実行プロジェクトを作ってみます。 ここではHogeAppという名前で作ります。

$ dotnet new console -lang=f# -o src/HogeApp
$ echo 'FSharp.Core' > src/HogeApp/paket.references
$ paket install

以下のコマンドで実行できます。

$ dotnet run --project src/HogeApp
Hello World from F#!

単体テストプロジェクト

新しくF#の単体テストプロジェクトを作ってみます。 ここではHogeTestという名前で作ります。

$ dotnet new console -lang=f# -o tests/HogeTest
$ echo -e 'FSharp.Core\nExpecto\nExpecto.FsCheck' > tests/HogeTest/paket.references
$ paket install

単体テストフレームワークはExpectoを想定しています。

使い方は
F#のテストフレームワーク「expecto」を使ってみる - Qiita
などを見ると良いでしょう。

その後、 build.fsxtestProjectsに、"HogeTest"を追加しましょう。

let testProjects = [
    // "SampleTest"
    "HogeTest"
]

これにより、FAKEのTestターゲットから実行されるようになります。 CIではfake build -t Testを使用しているので、ここを編集するだけで大丈夫です。

コードを編集する

では、src/HogeApp/Program.fsを開いてみましょう。

[<EntryPoint>]
let main argv =
    printfn "Hello World from F#!"
    0 // return an integer exit code

ここを編集すれば動作するようになります。

F#を書いたことのない方は F# syntax in 60 seconds で文法速習をするのも良いでしょう。

最近は日本語wikiのfsugjp wikiのチュートリアルが更新されつつあるので、将来的にはこちらを見るのもいいと思います。

Paket

サラッと利用していますが、Paketというのは.NETの依存関係マネージャです。 nugetに限らずGitHubファイルをとってきたり、一元管理するので複数のプロジェクトでライブラリのパージョンが違うといったことを防げます。

paket.dependencies に以下のように記述して、ライブラリを追加できます。

version 5.226.0
source https://www.nuget.org/api/v2

nuget FSharp.Core
nuget Expecto
nuget Expecto.FsCheck

また、各プロジェクトの paket.references というファイルで使用するものを選択していて、 *.*proj ファイルで以下のように参照しています(前述のpaket installで追加されます。)

    <Import Project="..\..\.paket\Paket.Restore.targets" />

おわりに

わからない事があればTwitter等で聞いてください!
使ってくれたら⭐️等貰えると嬉しいです!
wraikny/FsTemplate - GitHub

参考リンク

補足:CIの設定

Travis CI

  1. Travis CIのサイトからGitHubの連携をします。
  2. 自分のアイコンをクリックして表示されるリポジトリ一覧から、作成したリポジトリを選択します。
  3. .travis.ymlが実行されるようになります。

AppVeyor

  1. AppVeyorからアカウント連携をして、NEW PROJECTからリポジトリを選択します。
  2. Settingsから “Custom configuration .yml file name” に “appveyor.yml” と入力して、SAVEします。
  3. 左のサイドバーからBadgesを選び、 “Sample markdown code” のMarkdownをコピーしてREADMEに上書きします。

SHARE THIS POST