dotnet/runtimeのディレクトリツリー構造

# 始めに

2019/11頃、github上に[dotnet/runtime](https://github.com/dotnet/runtime)というリポジトリが誕生した。
これは、[それまで分かれていたdotnetのランタイムとクラスライブラリを統合する目的](https://github.com/dotnet/coreclr/issues/27549)で作られたものとなる。

構成されるファイルについては、大半が既存のリポジトリからのインポートによるものとなるが、ここでどのようなディレクトリ構造になっているか、大雑把ではあるが書いておこうと思う。

# ディレクトリ構造

おおまかに以下のようになる。

* docs
    * クラスライブラリやランタイムに関するドキュメントをまとめたディレクトリ
    * ソースそのものに興味がある場合を除いて、まずここから調べるのが良い
    * 特に[docs/design/coreclr/botr](https://github.com/dotnet/runtime/tree/master/docs/design/coreclr/botr)はdotnetの動く仕組みについての解説等が載っているため、読み物として読むのも面白い
    * 統合前のリポジトリにあったmdファイル等は大体この下
* eng
    * [dotnet/arcade](https://github.com/dotnet/arcade)のファイル
    * ビルド、パッケージング、インテグレーションのための共通ツール群
    * dotnet/arcadeリポジトリから持ってきているものなので、通常見る必要は無い
* src
    * ライブラリのソースコード等
    * またここから分かれているが後述
    * 移行に当たり、mono以外の元のリポジトリではデフォルトで表示されるブランチはほぼ空となっているが、tagを参照することにより以前の状態を参照することは可能
* tools-local
    * dotnet/runtimeリポジトリ限定で使うスクリプト群

その他、[リポジトリ構成に関するイシュー](https://github.com/dotnet/announcements/issues/127)を見ると、[aspnet/Extensions](https://github.com/aspnet/Extensions)も取り込むようだが、現時点(2019/12)では確認できなかった。

# src以下の構造

* src/coreclr
    * 主に[dotnet/coreclr](https://github.com/dotnet/coreclr)にあったものをインポートしたもの
    * JIT、GC、プラットフォーム別に実装が必要な部分等、ランタイム部分やネイティブ成分が多めだとこのディレクトリ以下にあると思っていい
    * src/librariesに実装が見当たらない場合、大体 [src/coreclr/src/System.Private.CoreLib](https://github.com/dotnet/runtime/tree/master/src/coreclr/src/System.Private.CoreLib) 以下にあることが多い
* src/libraries
    * 主に[dotnet/corefx](https://github.com/dotnet/corefx)にあったものをインポートしたもの
    * クラスライブラリの内、マネージドで済むものと、bait and switchに必要なリファレンス用ライブラリがここに含まれる
    * netstandard時に参照されるライブラリも大体ここ
    * src/coreclrとsrc/monoのSystem.Private.CoreLibの共通実装(CharとかStringの一部とか)が[src/libraries/System.Private.CoreLib/src](https://github.com/dotnet/runtime/tree/master/src/libraries/System.Private.CoreLib/src)に存在している
* src/installer(5.0以前)
    * 主に[core-setup](https://github.com/dotnet/core-setup)にあったものをインポートしたもの
    * dotnetコマンドや、publish時に生成される実行可能ファイルのベースとなるcorehostのソースや、一部パッケージングに関わる部分のソースがここに含まれている
* src/installer(6.0pre以降)
    * 主に[core-setup](https://github.com/dotnet/core-setup)にあったものをインポートしたもの
    * corehost部分はsrc/nativeに移動したので、インストーラー作成に関わる部分のみになった
* src/mono
    * [mono/mono](https://github.com/mono/mono)から、ランタイム部分(主に[mono](https://github.com/mono/mono/tree/master/mono)以下)とビルドスクリプト等をインポートしたもの
        * 今後mono/mono側のランタイム部分がどうなるか、また、どうメンテしていくのかの記述は見つからなかったので宿題(全て移行するわけではないので、消えることはないはず)
* src/native(6.0pre以降)
    * 以下のようなものがある
        * corehost
            * 以前src/installerに入っていたcorehostの移動
            * publishした時に実行可能ファイルのベースとなる部分
        * eventpipe(6.0pre以降)
            * [Diagnostics(実行時の診断用情報の収集)](https://github.com/dotnet/diagnostics)のための、EventPipeのランタイム側実装の部分
            * EventPipeについては、 [EventPipeについての公式ドキュメント](https://docs.microsoft.com/en-us/dotnet/core/diagnostics/eventpipe) を参照

# 終りに

来たるべき.NET 5に向けてリポジトリの統合をしたわけだが、一緒のリポジトリになることでこれまで散在していた記述等もまとめられることになったので、個人的には良かったと思う。特にdocs以下が一つにまとめられたのは良かったと思う。

また、これまでクラスライブラリレベルの修正は複数リポジトリにまたがって行われることが多かった(特にcorefxとcoreclr)が、この統合により、一つのPRに纏められるようになり、追跡もしやすくなる。

リポジトリ統合関連のイシューを見ると、まだ変更点はありそう(aspnet/AspNetCoreがdotnet/aspnetcoreとか、dotnet/sdkとか)だが、一番大きなdotnet/runtimeの統合を完了したので、今後更に何らかの動きがあるかもしれない。

* https://github.com/dotnet/announcements/issues/119
* https://github.com/dotnet/announcements/issues/127
* https://github.com/dotnet/announcements/issues/133