【Visual Studio】ビルド・リビルド・クリーンとは

# はじめに
:::note info
初学者の方をターゲットとしています。
:::
自分が新人の時は、「とりあえずソースをいじったら、ここのビルドかリビルドを押下してね～」なんて教えてもらいました。未経験だった自分は何が何だかよくわかってませんでした。

私は資源管理を任せていただいた経験がありますが、その際にこの辺の知識は必須でした。資源管理を任された時にこの記事を見ていただくと「ビルド通らないのなんで！！」の解決にヒントを与えられると思います。また、エンジニアとして知っていて絶対に損はない話なので、ある程度の理解はしておいた方がいいと思います。

# 目標
* ビルド・リビルド・クリーンがなんとなく何をしているのかがわかる
* ビルドに関する関連知識を知る

## ビルド
* ビルド対象ソリューション内の変更したプロジェクトとそれを利用しているものを組み直すと言うことです。
[Microsoft公式リファレンス][link-0]では以下のような説明となっております。

> 最新のビルド以降に変更されたプロジェクト ファイルとコンポーネントのみがコンパイルされます

[link-0]: https://learn.microsoft.com/ja-jp/visualstudio/ide/building-and-cleaning-projects-and-solutions-in-visual-studio?view=vs-2022

※画像は[「ビルド」機能とは？仕組みやコンパイルとの違いを解説][link-1]から引用
こちらに詳しい説明が書いてあるので、ご参照ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3013193/97d99739-160f-d477-8574-42ba7b0a5cb0.png)

[link-1]: https://proengineer.internous.co.jp/content/columnfeature/6308



### 例：処理を提供するClass1とそれを使用するClass2
一つのソリューションに二つのプロジェクトファイルがあったとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3013193/7bce820f-4e74-8e78-f366-0b40b70514c7.png)

* 処理を提供するClass1はコンソールに“Foo”と出力します。
```Class1.cs
	/// <summary>
	/// クラス1
	/// </summary>
	public sealed class Class1
	{
		/// <summary>コンストラクタ</summary>
		public Class1(){}

		/// <summary>コンソールにFooと出力します。</summary>
		public void Foo() 
		{
			Console.WriteLine("Foo"); 
		}
	}
```

* Class1を使用するClass2
```Class2.cs
using Sample;

namespace Sample2
{
	/// <summary>
	/// クラス2
	/// </summary>
	public sealed class Class2
	{
		/// <summary>コンストラクタ </summary>
		public Class2(){}

		/// <summary>Fooメソッドを呼び出します。 </summary>
		public void CallFoo()
		{
			var class1 = new Class1();
			class1.Foo();
		}
	}
}
```
* Class1だけをいじった場合のビルド数は2(Class1はClass2で使用されているからです。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3013193/a91be20e-fbf3-9a43-d11d-c9fa5a136e08.png)

* Class2だけをいじった場合のビルド数は1(Class2は他から使用されることがないからです。)
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3013193/5683b140-0b28-8b01-d5ba-caf6feb89240.png)
という感じになります。

## リビルド
* ビルド対象ソリューションのプロジェクトを全て組み直すということです。
[Microsoft公式リファレンス][link-0]では以下のような説明となっております。

> ソリューションが "クリーン" されてから、すべてのプロジェクト ファイルとコンポーネントがビルドされます。

[link-3]: https://learn.microsoft.com/ja-jp/visualstudio/ide/building-and-cleaning-projects-and-solutions-in-visual-studio?view=vs-2022
※この引用文前が[ソリューションのビルド]となってますが、これ間違っている気がします。。。


## クリーン
* プロジェクトファイルのプロパティにある、ビルド出力先されたファイルを削除するということです。(dllファイルとかpdbファイルとか)

[Microsoft公式リファレンス][link-0]では以下のような説明となっております。

> 中間ファイルと出力ファイルがすべて削除されます。 その後、プロジェクト ファイルとコンポーネント ファイルのみを残して、中間ファイルと出力ファイルの新しいインスタンスをビルドできます。

## 関連知識

### 【参考】プロジェクトの依存関係・ビルド順序の設定場所
先ほどの例の場合、先にビルドしなければならないのはClass1があるプロジェクトからです。この設定は以下にされています。

* ソリューションを右クリック　＞　プロジェクトの依存関係
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3013193/f2a137e7-642b-98a7-d38c-7feee6d68f8d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3013193/47ce8f6d-5e70-5c42-4407-cf0a6f110879.png)

* Sample2はSample1に依存するという設定がされていますね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3013193/3cdaad0b-e430-3677-046c-989bd865c3cf.png)

* ビルドする順番も正しく設定されてます！

### 【参考】ビルド情報はどこにあるの？
プロジェクトであれば「.csproj」、ソリューションであれば[.sln]に記載されています。
プロジェクトを複数取りまとめるものがソリューションくらいの理解でいいのではないでしょうか？以下の画像をご参考ください。

[こちら][link-2]から画像を引用いたしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3013193/313f491a-b8fe-5b08-051a-8fd0d7ceee95.png)

[link-2]: https://atmarkit.itmedia.co.jp/ait/articles/1704/21/news018_2.html

### 【参考】ビルドされたものはどこに出力されるか？
プロジェクトファイルのプロパティからビルドを選択すると、ビルドの出力先が設定できると思います。この出力先にpdbファイルだったりdllが出力されます。

デフォルトではプロジェクトファイルがあるカレントディレクトリからbin\Debugとかで出力されていると思います。

### 【参考】プリプロセッサディレクティブ
ビルド構成によってコンパイルされるコードを変更することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3013193/fb8a07cd-775e-bf4d-3139-93973136035b.png)

ビルド構成は
* Debug
* Release
* 独自でビルド構成を定義
の3パターンです。


開発中は必要なコードだけど、本番リリースではいらないコードがあった場合は

```
#if DEBUG
		/// <summary>
		/// Debugモードの時だけコンパイルされます
		/// </summary>
		public void Foo2()
		{
			Console.WriteLine("Foo");
		}
#endif
```
このように記載することでReleaseモードでビルドされたときはコンパイルされなくすることができます。



以上、VisualStudioにおけるビルド・リビルド・クリーンのお話でした。