đ FramtidssĂ€kra din kodbas
FrÄn flera röriga .NET 5-8 C#-projekt till en modern .NET 10-arkitektur.
Om du har jobbat med .NET ett tag vet du exakt hur ett versionslyft brukar se ut. NÀr det Àr dags för Lifecycle Management (LCM) och applikationen ska uppgraderas frÄn .NET 6 till nÀsta version, börjar den stora jakten. Du mÄste öppna varenda .csproj-fil för att uppdatera TargetFramework. Sedan mÄste du leta upp alla NuGet-paket och försöka synka versionerna mellan dina trettio olika projekt för att undvika konflikter. LÀgg dÀrtill en klassisk .sln-fil fylld av oÀndliga GUIDs som skapar merge-konflikter i Git sÄ fort tvÄ utvecklare lÀgger till en fil samtidigt. Men det behöver inte vara sÄ hÀr lÀngre. I takt med releasen av .NET 10 har ekosystemet mognat enormt. Genom att kombinera fyra kraftfulla verktyg kan vi skapa en arkitektur dÀr framtida uppgraderingar (till .NET 11, 12 och framÄt) bokstavligen kan göras genom att Àndra ett par rader kod pÄ ett enda stÀlle. HÀr Àr din guide till en modern, friktionsfri .NET-lösning.
De fyra pelarna i en modern .NET-lösning
För att slippa redundans och bygga en arkitektur som Àr redo för smidig LCM, flyttar vi ut konfigurationen frÄn de enskilda projekten och centraliserar den. Vi anvÀnder följande fyra komponenter:
1. global.json â LĂ„s SDK-versionen för hela teamet
Har du nĂ„gonsin hört âdet fungerar pĂ„ min maskinâ? Ofta beror det pĂ„ att utvecklare och CI/CD-pipelines kör olika versioner av .NET SDK:t. Genom att lĂ€gga en global.json i roten av ditt repo tvingar du alla miljöer att anvĂ€nda exakt samma kompilator och verktyg.
{
"sdk": {
"version": "10.0.100",
"rollForward": "latestFeature"
}
}
2. Directory.Build.props â Centralisera dina byggregler
IstÀllet för att varje projekt (Web.csproj, Api.csproj, Tests.csproj) ska deklarera att de anvÀnder .NET 10, C# 14 och Nullable reference types, lÀgger vi detta i en Directory.Build.props-fil i rotnivÄn. MSBuild kommer automatiskt att Àrva ner dessa instÀllningar till alla underliggande projekt.
<Project>
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
</Project>
LCM-vinst: NÀsta gÄng du uppgraderar ramverket Àndrar du net10.0 till net11.0 pÄ exakt ett stÀlle.
3. Directory.Packages.props â Central Package Management (CPM)
Detta Ă€r slutet pĂ„ âDependency Hellâ. Med CPM bestĂ€mmer du versionerna för dina NuGet-paket centralt. Dina individuella .csproj-filer anger bara vilka paket de behöver, inte vilken version.
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Azure.Storage.Blobs" Version="12.19.1" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="10.0.0" />
</ItemGroup>
</Project>
Dina projektfiler blir extremt rena:
4. .slnx â Lösningen pĂ„ merge-konflikter
Vi sÀger Àntligen hejdÄ till det gamla .sln-formatet. Det nya .slnx-formatet Àr rent, XML-baserat och helt fritt frÄn magiska GUID-koder och konstig formatering.
<Solution>
<Project Path="src\MyWebProject\MyWebProject.csproj" />
<Project Path="tests\MyTests\MyTests.csproj" />
</Solution>
Före och Efter: Hur det faktiskt ser ut
| Egenskap | Traditionell .NET 5-8 | Modern .NET 10 | |â|â|â| | Versionshantering av paket | Utspritt i varje .csproj | Samlat i Directory.Packages.props | | .NET Ramverksversion | HĂ„rdkodat i varje .csproj | Centraliserat i Directory.Build.props | | Solution-filen | SvĂ„rlĂ€st .sln med GUIDs | LĂ€ttlĂ€st XML i .slnx | | SDK-version | Odefinierad (tar senaste pĂ„ datorn) | LĂ„st via global.json | | LCM Uppgradering | Dagar av sök-och-ersĂ€tt, testning | Minuter av centrala Ă€ndringar |
Sammanfattning: Varför du bör göra detta idag
Att migrera en Àldre kodbas till denna struktur tar oftast inte mer Àn nÄgra timmar, men avkastningen (ROI) Àr enorm. Genom att separera konfiguration frÄn kod bygger du ett repo som Àr designat för att leva lÀnge.
NÀr Lifecycle Management slutar vara ett Ängestladdat detektivarbete över dussintals filer och istÀllet reduceras till att uppdatera ett fÄtal centrala parametrar, frigör du tid till det som faktiskt spelar roll: att bygga vÀrdeskapande funktioner.
Ta steget, skapa dina Directory.*-filer, rensa dina projektfiler och njut av en modern, framtidssÀkrad utvecklarupplevelse!
KĂ€llor
HÀr Àr de officiella dokumentationslÀnkarna frÄn Microsoft Learn som styrker de olika koncepten vi gick igenom. De Àr uppdelade per omrÄde sÄ att du eller ditt team enkelt kan lÀsa vidare om detaljerna!
1. Central Package Management (Directory.Packages.props)
HĂ€r beskrivs hur man slĂ„r pĂ„ ManagePackageVersionsCentrally och frikopplar paketversionerna frĂ„n de enskilda .csproj-filerna för att undvika beroendekonflikter (âDependency Hellâ).
- Dokumentation: Central Package Management (CPM)
2. Centralisering av byggregler (Directory.Build.props)
Den hÀr guiden förklarar hur MSBuild automatiskt letar efter en Directory.Build.props högre upp i mappstrukturen för att applicera standardinstÀllningar (som TargetFramework eller C#-version) pÄ alla projekt i lösningen.
- Dokumentation: Customize your build (Directory.Build.props)
3. LÄsa SDK-versioner (global.json)
Den officiella dokumentationen för hur .NET CLI lÀser in global.json för att faststÀlla exakt vilken .NET SDK-version (och tillhörande rullningspolicy, rollForward) som ska anvÀndas för att bygga repot.
- Dokumentation: global.json overview
4. Det nya Solution-formatet (.slnx)
Detta Ă€r ett nyare tillĂ€gg i .NET-ekosystemet. Ăven om det började som en Preview i Visual Studio 2022, integreras det nu allt djupare i .NET CLI och MSBuild.
- Dokumentation via CLI: dotnet sln command (Visar hur .NET CLI stödjer migrering och hantering av .slnx istÀllet för .sln)
- Visual Studio Blogg/Video: Introducing support for the modern .slnx solution file format (En genomgÄng av Mads Kristensen kring hur och varför formatet introducerades)
Lycka till med dina framtida migreringar.