dotnet cli 支持新的解决方案文件格式 slnx 了
Intro
前两天微软发布了 .NET 9 SDK 的新版本, 在这个新版本中引入了新的解决方案文件格式 slnx 的支持, 现在可以从 dotnet cli 来创建和维护 slnx 了, 并且支持了从 sln 迁移到 slnx, 目前 VisualStudio 和 Rider 都已经支持了 slnx 文件, dotnet cli 也终于支持了 slnx 文件了
What
slnx 是一个全新的解决方案文件格式, 文件后缀名是 slnx 文件编码是 UTF-8, 相比之前的 sln 解决方案文件大大地简化了, 示例如下,
sln 解决方案文件:
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30114.105
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{93FF0703-CB28-47B0-AB46-86E80B7A53F7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dotnet-exec", "src\dotnet-exec\dotnet-exec.csproj", "{07B7AD92-68A6-4744-9C9D-0874ACC0895C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0A5C6C6F-D3BD-404F-B515-05B4003C5711}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTest", "tests\UnitTest\UnitTest.csproj", "{D16F36B2-A5A9-495B-A9C7-CC4F203927E3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IntegrationTest", "tests\IntegrationTest\IntegrationTest.csproj", "{ED907129-D6CC-46FA-9F40-DA4FEAFA93F2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReferenceResolver", "src\ReferenceResolver\ReferenceResolver.csproj", "{3C8F8722-D0E9-4A1F-9067-299A36A599E7}"
EndProject
Global
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{07B7AD92-68A6-4744-9C9D-0874ACC0895C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{07B7AD92-68A6-4744-9C9D-0874ACC0895C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{07B7AD92-68A6-4744-9C9D-0874ACC0895C}.Debug|x64.ActiveCfg = Debug|Any CPU
{07B7AD92-68A6-4744-9C9D-0874ACC0895C}.Debug|x64.Build.0 = Debug|Any CPU
{07B7AD92-68A6-4744-9C9D-0874ACC0895C}.Debug|x86.ActiveCfg = Debug|Any CPU
{07B7AD92-68A6-4744-9C9D-0874ACC0895C}.Debug|x86.Build.0 = Debug|Any CPU
{07B7AD92-68A6-4744-9C9D-0874ACC0895C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{07B7AD92-68A6-4744-9C9D-0874ACC0895C}.Release|Any CPU.Build.0 = Release|Any CPU
{07B7AD92-68A6-4744-9C9D-0874ACC0895C}.Release|x64.ActiveCfg = Release|Any CPU
{07B7AD92-68A6-4744-9C9D-0874ACC0895C}.Release|x64.Build.0 = Release|Any CPU
{07B7AD92-68A6-4744-9C9D-0874ACC0895C}.Release|x86.ActiveCfg = Release|Any CPU
{07B7AD92-68A6-4744-9C9D-0874ACC0895C}.Release|x86.Build.0 = Release|Any CPU
{D16F36B2-A5A9-495B-A9C7-CC4F203927E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D16F36B2-A5A9-495B-A9C7-CC4F203927E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D16F36B2-A5A9-495B-A9C7-CC4F203927E3}.Debug|x64.ActiveCfg = Debug|Any CPU
{D16F36B2-A5A9-495B-A9C7-CC4F203927E3}.Debug|x64.Build.0 = Debug|Any CPU
{D16F36B2-A5A9-495B-A9C7-CC4F203927E3}.Debug|x86.ActiveCfg = Debug|Any CPU
{D16F36B2-A5A9-495B-A9C7-CC4F203927E3}.Debug|x86.Build.0 = Debug|Any CPU
{D16F36B2-A5A9-495B-A9C7-CC4F203927E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D16F36B2-A5A9-495B-A9C7-CC4F203927E3}.Release|Any CPU.Build.0 = Release|Any CPU
{D16F36B2-A5A9-495B-A9C7-CC4F203927E3}.Release|x64.ActiveCfg = Release|Any CPU
{D16F36B2-A5A9-495B-A9C7-CC4F203927E3}.Release|x64.Build.0 = Release|Any CPU
{D16F36B2-A5A9-495B-A9C7-CC4F203927E3}.Release|x86.ActiveCfg = Release|Any CPU
{D16F36B2-A5A9-495B-A9C7-CC4F203927E3}.Release|x86.Build.0 = Release|Any CPU
{ED907129-D6CC-46FA-9F40-DA4FEAFA93F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ED907129-D6CC-46FA-9F40-DA4FEAFA93F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ED907129-D6CC-46FA-9F40-DA4FEAFA93F2}.Debug|x64.ActiveCfg = Debug|Any CPU
{ED907129-D6CC-46FA-9F40-DA4FEAFA93F2}.Debug|x64.Build.0 = Debug|Any CPU
{ED907129-D6CC-46FA-9F40-DA4FEAFA93F2}.Debug|x86.ActiveCfg = Debug|Any CPU
{ED907129-D6CC-46FA-9F40-DA4FEAFA93F2}.Debug|x86.Build.0 = Debug|Any CPU
{ED907129-D6CC-46FA-9F40-DA4FEAFA93F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ED907129-D6CC-46FA-9F40-DA4FEAFA93F2}.Release|Any CPU.Build.0 = Release|Any CPU
{ED907129-D6CC-46FA-9F40-DA4FEAFA93F2}.Release|x64.ActiveCfg = Release|Any CPU
{ED907129-D6CC-46FA-9F40-DA4FEAFA93F2}.Release|x64.Build.0 = Release|Any CPU
{ED907129-D6CC-46FA-9F40-DA4FEAFA93F2}.Release|x86.ActiveCfg = Release|Any CPU
{ED907129-D6CC-46FA-9F40-DA4FEAFA93F2}.Release|x86.Build.0 = Release|Any CPU
{3C8F8722-D0E9-4A1F-9067-299A36A599E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3C8F8722-D0E9-4A1F-9067-299A36A599E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C8F8722-D0E9-4A1F-9067-299A36A599E7}.Debug|x64.ActiveCfg = Debug|Any CPU
{3C8F8722-D0E9-4A1F-9067-299A36A599E7}.Debug|x64.Build.0 = Debug|Any CPU
{3C8F8722-D0E9-4A1F-9067-299A36A599E7}.Debug|x86.ActiveCfg = Debug|Any CPU
{3C8F8722-D0E9-4A1F-9067-299A36A599E7}.Debug|x86.Build.0 = Debug|Any CPU
{3C8F8722-D0E9-4A1F-9067-299A36A599E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C8F8722-D0E9-4A1F-9067-299A36A599E7}.Release|Any CPU.Build.0 = Release|Any CPU
{3C8F8722-D0E9-4A1F-9067-299A36A599E7}.Release|x64.ActiveCfg = Release|Any CPU
{3C8F8722-D0E9-4A1F-9067-299A36A599E7}.Release|x64.Build.0 = Release|Any CPU
{3C8F8722-D0E9-4A1F-9067-299A36A599E7}.Release|x86.ActiveCfg = Release|Any CPU
{3C8F8722-D0E9-4A1F-9067-299A36A599E7}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{07B7AD92-68A6-4744-9C9D-0874ACC0895C} = {93FF0703-CB28-47B0-AB46-86E80B7A53F7}
{D16F36B2-A5A9-495B-A9C7-CC4F203927E3} = {0A5C6C6F-D3BD-404F-B515-05B4003C5711}
{ED907129-D6CC-46FA-9F40-DA4FEAFA93F2} = {0A5C6C6F-D3BD-404F-B515-05B4003C5711}
{3C8F8722-D0E9-4A1F-9067-299A36A599E7} = {93FF0703-CB28-47B0-AB46-86E80B7A53F7}
EndGlobalSection
EndGlobal
slnx 解决方案文件
<Solution>
<Folder Name="/src/">
<Project Path="src/dotnet-exec/dotnet-exec.csproj" />
<Project Path="src/ReferenceResolver/ReferenceResolver.csproj" />
</Folder>
<Folder Name="/tests/">
<Project Path="tests/IntegrationTest/IntegrationTest.csproj" />
<Project Path="tests/UnitTest/UnitTest.csproj" />
</Folder>
</Solution>
可以看到新的格式大大地简化了原有的解决方案文件, 原来几十行的文件现在只需要几行就可以了
Command
dotnet new sln
dotnet new sln 支持了新的 --format 选项, 可以指定为 slnx 来创建 slnx 解决方案文件
dotnet new sln --help
dotnet sln migrate
dotnet-cli 支持使用 dotnet sln migrate 命令一键从 sln 迁移到 slnx
dotnet sln --help
dotnet sln migrate --help
More
刚出来新的格式的时候就很喜欢新的文件的简洁, 但是 dotnet cli 并不支持, 现在 dotnet cli 终于支持了, Rider 和 VisualStudio 也都早早地支持了, CI 也没有遇到什么问题
dotnet-exec 项目已经迁移到新的 slnx 文件, 总体来说没有什么问题, 大家喜欢新的格式的话可以迁移到新的格式上了
References
-
https://medium.com/medialesson/welcome-to-the-new-visual-studio-slnx-solution-file-3c20d37a1cb3 -
https://blog.jetbrains.com/dotnet/2024/10/04/support-for-slnx-solution-files/ -
https://blog.ndepend.com/slnx-the-new-net-solution-xml-file-format/ -
https://github.com/dotnet/sdk/issues/40913 -
https://github.com/dotnet/sdk/pull/44570 -
https://github.com/dotnet/msbuild/pull/10794 -
https://github.com/dotnet/sdk/pull/44469 -
https://github.com/dotnet/sdk/pull/45408 -
https://github.com/dotnet/sdk/pull/45442 -
https://github.com/dotnet/msbuild/issues/10266 -
https://github.com/dotnet/msbuild/pull/10794

