はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】.NET SDK9.0.200 & Rider 2024.3 EAPから対応した.slnxを.slnの代わりに使おう

はじめに

.NETのプロジェクトを管理するために.slnを利用していることが多いと思いますが、.slnは冗長で記述が多く、パス修正をしたりはたまにしますが基本手作業はかなりしづらい印象でした。

learn.microsoft.com

Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample", "Sample\Sample.csproj", "{BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
EndGlobal

しかしついにMSがXMLベースに作り直した.slnxを発表しました。 .NET SDK 9.0.200から対応しており、私が普段利用しているRiderでもRider 2024.3 EAPから対応してます。
Introducing support for SLNX, a new, simpler solution file format in the .NET CLI - .NET Blog
Support for SLNX Solution Files | The .NET Tools Blog

実際に上記の.sln.slnxに変換したものを見ていただければ、その素晴らしさは一目瞭然だと思います。

<Solution>
  <Project Path="Sample\Sample.csproj" Type="Classic C#" />
</Solution>

個人的に.NET10から本格的に普及しだすのではないかなと思っていまして、是非今のうちに覚えておくと良い気がします。

slnからslnxへのmigrate

Rider上で行う場合

エクスプローラーウィンドウからslnを選択し、名前をつけて保存 -> XMLソリューションとして保存(.slnx)を実行します。

slnからslnxへの変換

.NET CLI上で行う場合

# v9.0.200以上なことを確認する
$ dotnet --version
9.0.202

$ cat ./Sample.sln
Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample", "Sample\Sample.csproj", "{BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
EndGlobal

# slnからslnxに変換
$ dotnet sln migrate
.slnx ファイル /Users/.../Sample/Sample.slnx 生成されました。

$ cat ./Sample.slnx
<Solution>
  <Project Path="Sample/Sample.csproj" />
</Solution>

learn.microsoft.com

slnとslnxが複数あるときのビルド

ちなみに.sln.slnxが複数存在している場合、明示的にソリューションファイルを指定してあげないとエラーになるので注意してください。

$ dotnet build
MSBUILD : error MSB1011: このフォルダーは 2 つ以上のプロジェクト ファイルまたはソリューション ファイルを含んでいるため、使用するプロジェクト ファイルまたはソリューション ファイルを指定してください。

$ dotnet build ./Sample.slnx          
復元が完了しました (0.2)
  Sample 成功しました (0.1 秒) → Sample/bin/Debug/net9.0/Sample.dll

0.6 秒後に 成功しました をビルド

$ rm ./Sample.sln
$ dotnet build              
復元が完了しました (0.2)
  Sample 成功しました (0.1 秒) → Sample/bin/Debug/net9.0/Sample.dll

0.6 秒後に 成功しました をビルド

dotnet slnコマンド

.slnxを利用していても、dotnet slnコマンドでの操作が可能です。
learn.microsoft.com

$ dotnet sln list
プロジェクト
------
Sample/Sample.csproj

$ dotnet sln ./Sample.slnx remove ./Sample/Sample.csproj                                                                                               
プロジェクト `Sample/Sample.csproj` がソリューションから削除されました。

$ dotnet sln ./Sample.slnx add ./Sample/Sample.csproj                                                                                                  
プロジェクト `Sample/Sample.csproj` をソリューションに追加しました。