F# documents in Japanese

Hi, F#er's!!

Follow me on GitHub

F# で開発をはじめる

はじめに

F# で開発する上で作成したものを .exe などの実行形式にする方法と、テキストファイルのまま実行させる方法があります。
今回は .exe.dll を出力する場合の開発方法について紹介していきます。


今回の方法はコーディングしたソースファイルをコンパイルする形式のものになります。
F# はコンパイルせずとも F# Script を利用すれば実行・動作させることができます。しかし F# Script の場合、規模の大きなプログラムを実行させようとすると速度的なパフォーマンスが悪くなります。
また、業務の要件としてプログラムの難読化が必須である場合には F# Script では対応できないため事前にコンパイルしてあげる必要があります。その他にも nuget パッケージとしてライブラリを公開したい場合などもこの方法を採用しなければなりません。


F# Script の場合と比べて手軽さはありませんが、より多彩なニーズを満たすことができます。
より高度なことを行いたくなった場合にはぜひこの方法でプログラムを作成してみてください。


F# プロジェクトで開発してみる

プロジェクトを作成する

  • ステップ 1

PowerShellzsh などのターミナルツールを起動して、プロジェクトを作成したいディレクトリへ移動します。 以下の例ではCドライブ直下に projects ディレクトリを作成してから移動しています。

mkdir C:/projects  
cd C:/projects


  • ステップ 2

dotnet new コマンドを利用してプロジェクトを作成します。
以下の例では HelloWorld というプロジェクトを作成しています。

dotnet new console -lang="F#" -o="HelloWorld"


  • ステップ 3

VSCode でプロジェクトを開いてみましょう。
以下のコマンドを実行すると HelloWorld プロジェクトが VSCode で開けます。

code ./HelloWorld

VSCode でプロジェクトを開くと ionide が読み込みを開始します。
読み込みが完了すると自動で F# のタブに移動するので Program.fs を開くと以下のような状態になると思います。

dotnet new コマンドでプロジェクトを作成するとデフォルトで Hello, World を出力するコードが記述されているので、今回はこのコードをこのまま利用していきます。


  • ステップ 4

VSCode でデバッグする環境を構築していきます。
少し複雑な手順が必要ですが、何度かやっていくうちに覚えてしまうと思います。
もし忘れてしまったときはこの記事に戻ってきてください。


まず Run and Debug タブを開いて Run and Debug ボタンをクリックします。


そうするとコマンドパレットが表示されるので .NET Core を選択します。


.NET Core を選択すると自動的に空の launch.json が作成・表示されます。
その画面の右下に Add Configuration というボタンが表示されていると思うので、それをクリックします。


構成の選択肢が表示されるので .NET: Launch .NET Core Console App を選択します。


.NET Console を実行する構成の雛形が埋め込まれるので program の項目を自身の環境に合わせて書き換えてあげます。


target-framework に指定する .NET のバージョンを調べるには、PowerShell や zsh などのターミナルで調べる必要があります。
以下のコマンドを実行することでバージョンを確認することが可能です。

dotnet --version

ここで表示されるバージョンは X.Y.ZZZ かそれ以上の桁数での表現になっていると思います。
ただ target-framework に指定する時は X.Y の部分だけなので注意が必要です。
例えば 5.0.202 というバージョンが表示された場合は net5.0 に、6.0.100 と表示された場合は net6.0 という風に指定してあげます。


project-name.dll の箇所には dotnet new コマンドの -o=”XXX” で指定した XXX の部分を指定してあげます。
今回は HelloWorld としてプロジェクトを作成したので、HelloWorld.dll となります。


次に consoleintegratedTerminal を、internalConsoleOptionsneverOpen を指定してあげます。


これで launch.json の設定は完了です。
次に tasks.json の設定をしていきます。
Run and Debug タブを開いて 再生ボタン をクリックします。または F5 を押すだけでも同様の結果を得ることができます。


するとエラーメッセージが表示されるので Configure Task を選択します。


コマンドパレットが表示されるので Create tasks.json file from template を選択します。


さらに選択肢が表示されるので .NET Core を選択します。


すると以下のような tasks.json が自動生成されます。
launch.json と違い、今回はこのファイルには修正を入れないのでデフォルトのままで大丈夫です。


以上でデバッグ環境の構築は完了です。


  • ステップ 5

それでは デバッグ実行 を行ってみましょう。
もう一度 Run and Debug タブを開いて 再生ボタン をクリックします。または F5 を押してください。


すると VSCode 内のターミナルが自動で起動しプログラムがビルドされます。エラー等がなければその後にプログラムの実行も行われます。
無事に実行まで完了するとターミナルに結果が表示されます。


次にプログラムを 1 行ずつ実行していくことができる ステップ実行 をやってみましょう。
好きな行番号の左側にマウスカーソルを持っていくと半透明な赤丸が出てくると思います。


その状態でクリックをしてあげると赤丸が行に対して付与されます。今回は 11 行目で実施しました。
この赤丸の場所のことを ブレークポイント と言いますので、覚えておくといいと思います。
ブレークポイントは F9 ボタンを押すことでも設定できます。


この状態でデバッグ実行をしてみると、ブレークポイントでプログラムの実行が止まります。


この状態で F10 を押下するか Step Over ボタンを押すと現在の行の処理が実行されて次の行に移動します。
次の行に移動すると Debug and Run タブの VARIABLESmessage 変数が追加されて、変数の中身が from F# であることを確認することができます。


F5Continue ボタンを押すと次のブレークポイントの場所まで通常のように実行されます。
今回は 1 箇所しかブレークポイントを設定していないため、プログラムの実行が完了してターミナルに処理結果が表示されます。


ではもう一度その状態でデバッグ実行をしてみます。
引き続き 11 行目で処理が止まると思います。


ここで次は F11Step Into ボタンを押してみます。


すると今回は次の行ではなく、from関数 の中へ移動しました。
さらに VARIABLES で from 関数の引数である whom に何が指定されているのかも確認可能です。


このように Step OverStep Into を使い分けることで、ステップ実行で見ていきたい内容の解像度を自在に操ることができます。


以上が簡易的ですが F# でのプロジェクトを作成して開発する方法となります。



ソリューションを作成する

大規模な開発になってくると 1 つのプロジェクトで完結することは少なくなってきます。
これはプロジェクトを細分化することによって影響範囲を局所化できたり、変更した .dll だけを入れ替えるだけでシステムを更新できるようになったり、変更したプロジェクトだけリビルドするだけで済むためビルド時間を大幅に短縮できたりするようになったりするためです。


複数のプロジェクトを作成して 1 つの大きなシステムを作成する場合にはプロジェクトをバラバラに管理するよりも 1 つ所にまとめておいた方が管理しやすいです。そこで登場する管理単位が ソリューション です。
多くの場合 1 システム = 1 ソリューション となります。


先に述べたようにソリューションの中には 1 つ以上のプロジェクトが属する形となります。
F# の場合、プロジェクトは .fsproj ファイルで管理していました。
そしてソリューションは .sln ファイルで管理します。
ここでは .sln の作成方法について紹介していきます。


  • ステップ 1

まずはソリューションを管理するディレクトリと .sln を作成します。
今回は C:/projects を作業ディレクトリとして作業していきます。

cd C:/projects


.sln を作成するためには dotnet new sln コマンドを利用します。
今回は HelloSystem というソリューションを作成しました。

dotnet new sln -o="HelloSystem"


コマンドを実行すると HelloSystem というディレクトリの下に HelloSystem.sln というファイルができていることがわかります。


HelloSystem ディレクトリに移動しておきます。

cd HelloSystem


  • ステップ 2

ソリューションに所属させるプロジェクトを作成します。
今回はコンソールプロジェクトとライブラリプロジェクトを一つずつ作成します。

dotnet new console -lang="F#" -o="HelloConsole"  
dotnet new classlib -lang="F#" -o="HelloModule"


コマンドを実行すると HelloSystem.sln と同じ階層に 2 つのプロジェクトができたと思います。


  • ステップ 3

作成したプロジェクトを HelloSystem.sln に所属させます。
dotnet sln add コマンドを利用することで簡単に所属させることが可能です。

dotnet sln add ./HelloConsole  
dotnet sln add ./HelloModule


コマンドを実行すると HelloSystem.sln にプロジェクトが追加されます。


これでソリューションの構築は完了です。


  • おまけ

今回作成した HelloConsole の中で HelloModule を利用したい場合、このままでは使えません。
これを解消するには HelloConsole.fsprojHelloModule を利用することを宣言する必要があります。
手で書いてもいいのですが通常 dotnet add reference コマンドを利用します。

cd HelloConsole  
dotnet add reference ../HelloModule


コマンドを実行すると HelloConsole.fsprojHelloModule を利用することを表す記述が追加されます。


このように特定のプロジェクトを利用することを .fsproj に追加することを 参照を追加する ともいうので覚えておくと良いでしょう。




おわりに

今回はコマンドの使い方が多い内容だったため覚える量が多かったと思います。
この記事で紹介している内容についてはすぐに暗記して使えるようになる必要はありません。
何度もアプリを作成していく中で勝手に手が覚えるので、それまではこの記事を参考にしつつプロジェクトを作成していきましょう。