[備忘録] [.NET] NuGetパッケージを追加したいが、.NET SDKとのバージョン不一致で困った時の解決策

# はじめに

投稿に至った経緯

[ASP.NET Core で Web API を作成する公式チュートリアル](https://learn.microsoft.com/ja-jp/aspnet/core/tutorials/first-web-api?view=aspnetcore-7.0&tabs=visual-studio-code#scaffold-a-controller)において、NuGetパッケージの追加をする手順があったのだが、自分の環境の.NET SDKとバージョンが合わず入れられなかった
(前提条件に`.NET 7.0 SDK`とあるので、`6`を使ってた自分が悪いんだが)

その時の対処法をメモしておく

# TL;DR

1. [バージョン範囲](https://learn.microsoft.com/ja-jp/nuget/concepts/package-versioning#version-ranges)や[浮動バージョンの解決](https://learn.microsoft.com/ja-jp/nuget/concepts/package-versioning#floating-version-resolutions)を参考に、`.csproj`の`PackageReference`にバージョン番号を曖昧に指定しつつ、`dotnet restore`する
    - `<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.*" />`
2. [NuGet](https://www.nuget.org/)のGalleryにアクセスし、対応するバージョンを探して、`dotnet add`するときにバージョン番号を指定する

# 1. .csprojのPackageReferenceにバージョン番号を曖昧に指定しつつ、dotnet restoreする

## エラー内容の把握

今回で言うと、`dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design -v 7.0.0-*`をやろうとして、下記のように怒られました

>error: NU1202: パッケージ Microsoft.VisualStudio.Web.CodeGeneration.Design 7.0.0 は net6.0 (.NETCoreApp,Version=v6.0) と互換性がありません。 パッケージ Microsoft.VisualStudio.Web.CodeGeneration.Design 7.0.0 がサポートするもの: net7.0 (.NETCoreApp,Version=v7.0)
>error: パッケージ 'Microsoft.VisualStudio.Web.CodeGeneration.Design' はプロジェクト '/Users/XXXXX/workspace/ToDoApi/ToDoApi.csproj' の 'all' フレームワークとの互換性がありません。

「あ、パッケージのメジャーバージョンが.NETのバージョンと対応してるのか」と勘づき、ならば6系の最新を入れてあげればいいな、と判断できました

## .NET SDKバージョンに対応するパッケージの追加

### .csprojの編集

https://learn.microsoft.com/ja-jp/nuget/concepts/package-versioning#floating-version-resolutions

上記を参考にすると、`.csproj`の`PackageReference`には下記のように追記すれば良いとわかります

`<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.*" />`
→メジャーバージョン`6`の最新を追加する

### 依存関係の修復

`dotnet restore`についての[公式](https://learn.microsoft.com/ja-jp/dotnet/core/tools/dotnet-restore#description)の説明は以下です

>dotnet restore コマンドでは NuGet を使用して、依存関係と、プロジェクト ファイルに指定されているプロジェクト固有のツールを復元します。

```terminal
$ dotnet restore                                                                
  復元対象のプロジェクトを決定しています...
  /Users/XXXXX/workspace/ToDoApi/ToDoApi.csproj を復元しました (408 ms)。

$ dotnet list package                                                           
プロジェクト 'ToDoApi' に次のパッケージ参照が含まれています
   [net6.0]: 
   最上位レベル パッケージ                                            要求済み    解決済み  
   > Microsoft.EntityFrameworkCore.Design                  7.0.1   7.0.1 
   > Microsoft.EntityFrameworkCore.InMemory                7.0.1   7.0.1 
   > Microsoft.EntityFrameworkCore.SqlServer               7.0.1   7.0.1 
   > Microsoft.VisualStudio.Web.CodeGeneration.Design      6.*     6.0.11
   > Swashbuckle.AspNetCore                                6.2.3   6.2.3 
```

要求しているのは`6.*`と曖昧な指定ですが、実際に追加されたのは`6.0.11`であることが分かります

# 2. NuGetのGalleryにアクセスし、対応するバージョンを探して、dotnet addするときにバージョン番号を指定する

## NuGet Galleryにアクセス

https://www.nuget.org/

## 追加したいパッケージを検索して、バージョン一覧を参照する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/f3477f91-fbeb-f476-c985-f82c991cca8f.png" width="550">

追加したい正確なバージョンを把握します

## バージョンを指定して`dotnet add`する

```terminal
$ dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design -v 6.0.11
復元対象のプロジェクトを決定しています...
...略...

$ dotnet list package                                                          
プロジェクト 'ToDoApi' に次のパッケージ参照が含まれています
   [net6.0]: 
   最上位レベル パッケージ                                            要求済み     解決済み  
   > Microsoft.EntityFrameworkCore.Design                  7.0.1    7.0.1 
   > Microsoft.EntityFrameworkCore.InMemory                7.0.1    7.0.1 
   > Microsoft.EntityFrameworkCore.SqlServer               7.0.1    7.0.1 
   > Microsoft.VisualStudio.Web.CodeGeneration.Design      6.0.11   6.0.11
   > Swashbuckle.AspNetCore                                6.2.3    6.2.3 
```

# さいごに

Nodeの`package.json`に慣れていたので、「.csprojって自分でいじって良いの？」とまだ懐疑的です