本記事では、Assembly Definition で生成したcsproj はGitに含めないというテーマで書きます。
Assembly Definition は、Unityでドメイン駆動設計の実装で重宝します。
しかし、Assembly Definition で生成したcsproj ファイルをGitにコミットすると問題が発生します。
なので、csproj ファイルはGitに含めないようにしました。
初回起動時に、csprojファイルを生成しないとビルドが通りません。この件は運用でカバーします。
- Windows10 Home 64bit
- Unity Version 2020.3.17f1 Personal
- Visual Studio Community 2019 16.11.2
- .NET Standard2.0
Assembly Definition とは
Assembly Definitionという機能をご存知でしょうか。
https://qiita.com/toRisouP/items/d206af3029c7d80326ed
これは「C#のビルドファイル(アセンブリ)を分割して出力する」ことができる機能であり、Unity 2017.3で追加されました。
これを使用することで、Unity においてプロジェクト分割ができます。
ぼくは、Unity プロジェクトでドメイン駆動設計を実装しています。境界づけられたコンテキストで分割するために、プロジェクトの分割機能は重宝します。
ずっと、Assembly-CSharp だけでやってきました。プロジェクト分割する方法はないかな?と思ってました。なので、Assembly Definition を知ったときは、まさに寝耳に水でした。
csproj をGitにコミットすることの問題
Assembly Definition を使用していると、問題が発生しました。
Assembly Definition を使用すると、csproj ファイルも生成されます。そのファイルもGitにコミットしていました。そうすると以下のような問題が発生しました。
- 自動更新の頻度が高い
- 絶対パスが含まれる
自動更新の頻度が高い
csprojファイルは自動更新の頻度が高いです。
更新内容はタグが変わっただけということも多いです。
csprojファイルが多くなると、Gitにコミットするときに、毎回チェックするのが大変です。
絶対パスが含まれる
Gitにコミットするうえで、これは致命的です。
HintPath タグに絶対パスが含まれます。
絶対パスが含まれるものはGitにコミットしたくありません。Visual Studio のPathを参照するものもあり、相対パスに変更することもできません。
クローン時は手動でcsprojを生成する
上記理由から、csproj をGitにコミットすることをやめました。
Unityのgitnone はこちらのものを使用しています。これに以下を追記しました。
/*.csproj
プロジェクトフォルダ( csprojeが自動生成される、ソリューションがあるフォルダ )直下にあるcsproj をすべてコミットしないようにしました。
Assembly Definition以外で、プロジェクトフォルダ直下にcsproj ファイルを置くことはありません。共通クラスライブラリは作成するので、プロジェクトフォルダ直下に限定します。
ただ、ビルドを通すためには、csproj は必要です。このままだと、Unityプロジェクトをクローンした後は、ビルドが通らなくなります。
なので対策として、クローン時は手動でcsprojを生成してもらう運用としました。
手動で生成する方法は、2つあります。
- Unityを起動し、Edit→Preferences→Regenerate project files ボタンを押す
- Unityを起動し、任意のC# Scriptファイルをダブルクリックし、Visual Studioを起動する
ソリューションの起動で、csprojファイルを生成してほしかったのですが、その方法はわかりませんでした。
運用でカバーという条件付きですが、Assembly Definition で生成したcsproj ファイルはGitに含めないようにしました。
まとめ
本記事では、Assembly Definition で生成したcsproj はGitに含めないというテーマで書きました。
Assembly Definition は、Unityでドメイン駆動設計を実装するうえで重宝します。
しかし、Assembly Definition で生成したcsproj ファイルをGitにコミットすると問題が発生します。
なので、Assembly Definition で生成したcsproj ファイルはGitに含めないようにしました。
コメント