SAFE Stack (link) のプロジェクトを作成すると入っているサンプルの ToDo アプリを眺める。 これまでに何とく少し弄ったり、断片的にチラ見したことがあるけど、全てのファイルを簡単にでも読んでいく。 全体像を少しは把握できるはず。

プロジェクトの作成

以下のコマンドで SAFE Template をインストールしてから新しいプロジェクトを作った。 SAFE Stack のドキュメントにある “Quick Start” (link) に沿いつつ、Git にファイルの登録もしている。

コマンド:

% dotnet new -i SAFE.Template
<省略>
% 
% mkdir test-safe-stack-20210724
% cd    test-safe-stack-20210724
% 
% git init
Initialized empty Git repository in /home/tos/test-safe-stack-20210724/.git/
% git commit --allow-empty -m "initial emtpy commit"
[master (root-commit) a14d71d] initial emtpy commit
% 
% dotnet new SAFE
The template "SAFE-Stack Web App v3.0.1" was created successfully.
%
% ls
Build.fs      Helpers.fs         paket.dependencies  README.md  test-safe-stack-20210724.sln
Build.fsproj  package.json       paket.lock          src        webpack.config.js
global.json   package-lock.json  paket.references    tests      webpack.tests.config.js
%
% git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .config/
        .editorconfig
        .gitignore
        .paket/
        .vscode/
        Build.fs
        Build.fsproj
        Helpers.fs
        README.md
        global.json
        package-lock.json
        package.json
        paket.dependencies
        paket.lock
        paket.references
        src/
        test-safe-stack-20210724.sln
        tests/
        webpack.config.js
        webpack.tests.config.js

nothing added to commit but untracked files present (use "git add" to track)
%
% git add .
% git commit -m 'just after creating project with SAFE Template'
[master 0175d87] just after creating project with SAFE Template
 39 files changed, 19515 insertions(+)
 create mode 100644 .config/dotnet-tools.json
 create mode 100644 .editorconfig
 create mode 100644 .gitignore
 create mode 100644 .paket/Paket.Restore.targets
 create mode 100644 .vscode/extensions.json
 create mode 100644 Build.fs
 create mode 100644 Build.fsproj
 create mode 100644 Helpers.fs
 create mode 100644 README.md
 create mode 100644 global.json
 create mode 100644 package-lock.json
 create mode 100644 package.json
 create mode 100644 paket.dependencies
 create mode 100644 paket.lock
 create mode 100644 paket.references
 create mode 100644 src/Client/App.fs
 create mode 100644 src/Client/Client.fsproj
 create mode 100644 src/Client/Index.fs
 create mode 100644 src/Client/index.html
 create mode 100644 src/Client/paket.references
 create mode 100644 src/Client/public/favicon.png
 create mode 100644 src/Server/Server.fs
 create mode 100644 src/Server/Server.fsproj
 create mode 100644 src/Server/paket.references
 create mode 100644 src/Shared/Shared.fs
 create mode 100644 src/Shared/Shared.fsproj
 create mode 100644 test-safe-stack-20210724.sln
 create mode 100644 tests/Client/Client.Tests.fs
 create mode 100644 tests/Client/Client.Tests.fsproj
 create mode 100644 tests/Client/index.html
 create mode 100644 tests/Client/paket.references
 create mode 100644 tests/Server/Server.Tests.fs
 create mode 100644 tests/Server/Server.Tests.fsproj
 create mode 100644 tests/Server/paket.references
 create mode 100644 tests/Shared/Shared.Tests.fs
 create mode 100644 tests/Shared/Shared.Tests.fsproj
 create mode 100644 tests/Shared/paket.references
 create mode 100644 webpack.config.js
 create mode 100644 webpack.tests.config.js
%
% dotnet tool restore
Tool 'paket' (version '6.0.0-rc002') was restored. Available commands: paket
Tool 'fable' (version '3.2.1') was restored. Available commands: fable
Tool 'fantomas-tool' (version '4.4.0') was restored. Available commands: fantomas

Restore was successful.
%
% git status
On branch master
nothing to commit, working tree clean
%

初期状態のファイル一覧

プロジェクトを作成した直後の初期状態でも結構な数のファイルが用意されている。

コマンド:

% find . -type f  | grep -v '^./.git/' | wc -l
39
% 

SAFE Stack は F# のフレームワークだけど、クライアント側には npm / webpack / React といった JavaScript 系のツールやフレームワークを利用する。 だから、これらの各種ツールの設定ファイルや各種ライブラリを取り入れて、ごった煮のようになっている。 そんなごった煮でありながら、うまく全体が動くところが SAFE Stack の偉いところだと思う。

各ファイルを見てコメントを付けていった。 ただし、このコメントは何かを説明するというより、自分が少しでも理解を深めるためにしたもの。 個々のファイルの本質をどこまで捉えいるか疑問だけど、ただ眺めて終えよりも、自分の言葉で言い表そうとする過程でいくらか理解を深められるから。 これまで知らなかったものも簡単に調べたくらいの中途半端な知識で、無理矢理にでもコメントを書いている。

ファイルの一覧:

番号ファイルコメント
1.config/dotnet-tools.jsondotnet tool コマンドの設定。ここでは Paket、Fable、Fantomas Tool が記述されていた。
2.editorconfigエディター向けの設定。 .editorconfig / EditorConfig は複数のエディターで共通に使われる。
3.gitignoreGit の対象外にするファイルの設定。
4.paket/Paket.Restore.targets多分、Paket が生成するファイル。人がゼロから作るものには見えない。
5.vscode/extensions.jsonVSCode の拡張の設定。Ionide や EditorConfig も記述されている。
6Build.fsビルドの設定……の一部。クライアントとサーバの両方について記述されている。Fake (link) と Farmer (link) を利用。
7Build.fsprojF# のプロジェクトの設定。Build.fs と Helpers.fs を include している。
8Helpers.fsビルドの設定……の一部。Fake を利用。
9README.mdSAFE Template 自体の README になっていて、このアプリの実行手順を載せてくれている。
10global.json.NET の設定ファイル。SDK のバージョンが記述されている。
11package-lock.jsonNPM のパッケージのバージョン。npm コマンドが生成するほう。実際にインストールされているバージョンが記述するほう。
12package.jsonNPM のパッケージのバージョン。人が作成する。バージョンの範囲を記述する。
13paket.dependenciesPaket のパッケージの設定。改行で分けられて、サーバ、クライアント、ビルドツールの 3 つのグループになっている。サーバは Fable.Remoting のサーバ側、Saturn、テストドライバの Expecto。クライアントは Fable 系各種 (含む Remoting のクライアント側, テストドライバの Mocha)、Feliz、Fulma。ビルドツールは Fake と Farmer。
14paket.lockPaket で実際にインストールされたパッケージとそのバージョン。
15paket.referencesこれも Paket のパッケージの設定。MSBuild 向けらしいけど自信が無い。説明はここにあった。
16src/Client/App.fsクライアントのソース。別途、中身をよくみる。
17src/Client/Client.fsprojクライアントの F# のプロジェクトの設定。
18src/Client/Index.fsクライアントのソース。別途、中身をよくみる。
19src/Client/index.htmlクライアントの HTML ファイル。div 要素に elmish-app という ID が設定されている。
20src/Client/paket.referencesクライアントの Paket のパッケージの設定。Fable 系各種、Feliz、Fulma が記述されている。プロジェクト直下の paket.dependencies とも重複するパッケージもあれば、重複しないパッケージもある。両ファイルがどういう関係か理解を整理できていない。
21src/Client/public/favicon.pngfavicon
22src/Server/Server.fsサーバのソース。別途、中身をよくみる。
23src/Server/Server.fsprojサーバの F# のプロジェクトの設定。
24src/Server/paket.referencesサーバの Paket のパッケージの設定。Saturn と Fable.Remoting のサーバ側だけ記述されている。プロジェクト直下の paket.dependencies とも重複するパッケージもあれば、重複しないパッケージもある。これもプロジェクト直下の paket.dependencies との関係がよく分かっていない。
25src/Shared/Shared.fsクライアントとサーバで共通のソース。別途、中身をよくみる。
26src/Shared/Shared.fsprojクライアントとサーバで共通の F# のプロジェクトの設定。Client.fsproj と Server.fsproj の両方から参照されている。
27test-safe-stack-20210724.slnソリューションファイル……と言われているやつ。複数の fsproj ファイルなどを束ねるものだと思っている。人がゼロから作るものには見えない。
28tests/Client/Client.Tests.fsクライアントのテストのソース。別途、中身をよくみる。
29tests/Client/Client.Tests.fsprojクライアントのテストの F# のプロジェクトの設定。
30tests/Client/index.htmlクライアントのテストの HTML ファイル。ほぼ空。
31tests/Client/paket.referencesクライアントのテストの Paket のパッケージの設定。Fable.Mocha の 1 行だけ。
32tests/Server/Server.Tests.fsサーバのテストのソース。別途、中身をよくみる。
33tests/Server/Server.Tests.fsprojサーバのテストの F# のプロジェクトの設定。
34tests/Server/paket.referencesサーバのテストの Paket のパッケージの設定。Expecto の一行だけ。
35tests/Shared/Shared.Tests.fsクライアントとサーバで共通のテストのソース。別途、中身をよくみる。
36tests/Shared/Shared.Tests.fsprojクライアントとサーバで共通のテストの F# のプロジェクトの設定。Client.Tests.fsproj と Server.Tests.fsproj の両方から参照されている。
37tests/Shared/paket.referencesクライアントとサーバで共通のテストの Paket のパッケージの設定。Expecto と Fable.Mocha の 2 行だけ。
38webpack.config.jswebpack の設定。
39webpack.tests.config.jswebpack のテスト用の設定……でいいよね。Build.fs、package.json、test-safe-stack-20210724.sln の中でこのファイルを指定している箇所がある。

その他

Emacs で .editorconfig を利用したければ editorconfig-mode (link) をインストールするとよいっぽい。