.NET-distributieverpakking

Naarmate .NET 5 (en .NET Core) en latere versies beschikbaar komen op meer en meer platforms, is het handig om te leren hoe u apps en bibliotheken in pakketten, namen en versies kunt verpakken en gebruiken. Op deze manier kunnen pakketonderhouders zorgen voor een consistente ervaring, ongeacht waar gebruikers .NET willen uitvoeren. Dit artikel is handig voor gebruikers die:

  • Er wordt geprobeerd .NET te bouwen vanaf de bron.
  • Als u wijzigingen wilt aanbrengen in de .NET CLI die van invloed kan zijn op de resulterende indeling of pakketten die zijn geproduceerd.

Schijfindeling

Wanneer .NET is geïnstalleerd, bestaat .NET uit verschillende onderdelen die als volgt zijn ingedeeld in het bestandssysteem:

{dotnet_root}                    (0)              (*)
├── dotnet                       (1)
├── LICENSE.txt                  (8)
├── ThirdPartyNotices.txt        (8)
├── host                                          (*)
│   └── fxr                                       (*)
│       └── <fxr version>        (2)
├── sdk                                           (*)
│   └── <sdk version>            (3)
├── sdk-manifests                (4)              (*)
│   └── <sdk feature band version>
├── library-packs                (4)              (*)
├── metadata                     (4)              (*)
│   └── workloads
│       └── <sdk feature band version>
├── template-packs               (4)              (*)
├── packs                                         (*)
│   ├── Microsoft.AspNetCore.App.Ref              (*)
│   │   └── <aspnetcore ref version>     (11)
│   ├── Microsoft.NETCore.App.Ref                 (*)
│   │   └── <netcore ref version>        (12)
│   ├── Microsoft.NETCore.App.Host.<rid>          (*)
│   │   └── <apphost version>            (13)
│   ├── Microsoft.WindowsDesktop.App.Ref          (*)
│   │   └── <desktop ref version>        (14)
│   ├── NETStandard.Library.Ref                   (*)
│   │   └── <netstandard version>        (15)
│   ├── Microsoft.NETCore.App.Runtime.<rid>       (*)
│   │   └── <runtime version>            (18)
│   └── Microsoft.AspNetCore.App.Runtime.<rid>    (*)
│       └── <aspnetcore version>         (18)
├── shared                                        (*)
│   ├── Microsoft.NETCore.App                     (*)
│   │   └── <runtime version>     (5)
│   ├── Microsoft.AspNetCore.App                  (*)
│   │   └── <aspnetcore version>  (6)
│   ├── Microsoft.AspNetCore.All                  (*)
│   │   └── <aspnetcore version>  (6)
│   └── Microsoft.WindowsDesktop.App              (*)
│       └── <desktop app version> (7)
└── templates                                     (*)
│   └── <templates version>      (17)
/
├── etc/dotnet
│       └── install_location     (16)
├── usr/share/man/man1
│       └── dotnet.1.gz          (9)
└── usr/bin
        └── dotnet               (10)
  • (0) {dotnet_root} is een gedeelde hoofdmap voor alle primaire en secundaire versies van .NET. Als er meerdere runtimes zijn geïnstalleerd, delen ze de map {dotnet_root} , bijvoorbeeld {dotnet_root}/shared/Microsoft.NETCore.App/6.0.11 en {dotnet_root}/shared/Microsoft.NETCore.App/7.0.0. De naam van de {dotnet_root} map moet versieneutraal zijn, dat wil gezegd, gewoon dotnet.

  • (1) dotnet De host (ook wel 'muxer' genoemd) heeft twee verschillende rollen: een runtime activeren om een toepassing te starten en een SDK activeren om er opdrachten naar te verzenden. De host is een systeemeigen uitvoerbaar bestand (dotnet.exe).

Hoewel er één host is, bevinden de meeste andere onderdelen zich in versiebeheermappen (2,3,5,6). Dit betekent dat er meerdere versies op het systeem aanwezig kunnen zijn omdat ze naast elkaar worden geïnstalleerd.

  • (2) host/fxr/fxr/<fxr-versie> bevat de frameworkoplossingslogica die door de host wordt gebruikt. De host maakt gebruik van de meest recente hostfxr die is geïnstalleerd. De hostfxr is verantwoordelijk voor het selecteren van de juiste runtime bij het uitvoeren van een .NET-toepassing. Een toepassing die is gebouwd voor .NET 7.0.0, gebruikt bijvoorbeeld de runtime 7.0.5 wanneer deze beschikbaar is. Op dezelfde manier selecteert hostfxr de juiste SDK tijdens de ontwikkeling.

  • (3) sdk/<sdk-versie> De SDK (ook wel 'de hulpprogramma's' genoemd) is een set beheerde hulpprogramma's die worden gebruikt voor het schrijven en bouwen van .NET-bibliotheken en -toepassingen. De SDK bevat de .NET CLI, de beheerde talen compilers, MSBuild en bijbehorende buildtaken en doelen, NuGet, nieuwe projectsjablonen, enzovoort.

  • (4) sdk-manifests/<sdk-functiebandversie> De namen en versies van de assets die een optionele workloadinstallatie vereist, worden onderhouden in workloadmanifesten die zijn opgeslagen in deze map. De mapnaam is de functiebandversie van de SDK. Voor een SDK-versie zoals 7.0.102 heeft deze map nog steeds de naam 7.0.100. Wanneer een workload is geïnstalleerd, worden de volgende mappen zo nodig gemaakt voor de assets van de workload: bibliotheekpakketten, metagegevens en sjabloonpakketten. Een distributie kan een leeg /metadata/workloads/<sdkfeatureband>/userlocal-bestand maken als workloads moeten worden geïnstalleerd onder een gebruikerspad in plaats van in de dotnet-map . Zie GitHub-probleem dotnet/installer#12104 voor meer informatie.

De gedeelde map bevat frameworks. Een gedeeld framework biedt een set bibliotheken op een centrale locatie, zodat ze kunnen worden gebruikt door verschillende toepassingen.

  • (5) gedeeld/Microsoft.NETCore.App/<runtime-versie> Dit framework bevat de .NET-runtime en ondersteunende beheerde bibliotheken.

  • (6) gedeeld/Microsoft.AspNetCore.{ App,All}/<aspnetcore-versie> bevat de ASP.NET Core-bibliotheken. De onderliggende bibliotheken Microsoft.AspNetCore.App worden ontwikkeld en ondersteund als onderdeel van het .NET-project. De onderliggende bibliotheken Microsoft.AspNetCore.All zijn een superset die ook bibliotheken van derden bevat.

  • (7) gedeeld/Microsoft.Desktop.App/<desktop-app-versie> bevat de Windows-bureaubladbibliotheken. Dit is niet opgenomen op niet-Windows-platforms.

  • (8) LICENSE.txt,ThirdPartyNotices.txt respectievelijk de .NET-licentie en licenties zijn van bibliotheken van derden die worden gebruikt in .NET.

  • (9,10) dotnet.1.gz, dotnetdotnet.1.gz is de handmatige pagina van dotnet. dotnet is een symlink naar de dotnet-host(1). Deze bestanden worden geïnstalleerd op bekende locaties voor systeemintegratie.

  • (11,12) Microsoft.NETCore.App.Ref,Microsoft.AspNetCore.App.Ref beschrijven respectievelijk de API van een x.y versie van .NET en ASP.NET Core. Deze packs worden gebruikt bij het compileren van deze doelversies.

  • (13) Microsoft.NETCore.App.Host.<rid> bevat een systeemeigen binair bestand voor platform rid. Dit binaire bestand is een sjabloon bij het compileren van een .NET-toepassing in een systeemeigen binair bestand voor dat platform.

  • (14) Microsoft.WindowsDesktop.App.Ref beschrijft de API van de versie van x.y Windows Desktop-toepassingen. Deze bestanden worden gebruikt bij het compileren van dat doel. Dit is niet opgegeven op niet-Windows-platforms.

  • (15) NETStandard.Library.Ref beschrijft de netstandard-API x.y . Deze bestanden worden gebruikt bij het compileren van dat doel.

  • (16) /etc/dotnet/install_location is een bestand dat het volledige pad voor {dotnet_root}bevat. Het pad kan eindigen met een nieuwe regel. Het is niet nodig om dit bestand toe te voegen wanneer de hoofdmap is /usr/share/dotnet.

  • (17) sjablonen bevatten de sjablonen die door de SDK worden gebruikt. Hier vindt u bijvoorbeeld dotnet new projectsjablonen.

  • (18) Microsoft.NETCore.App.Runtime.<rid>/<runtime-versie>, Microsoft.AspNetCore.App.Runtime.<rid>/<aspnetcore-versie> Deze bestanden maken het bouwen van zelfstandige toepassingen mogelijk. Deze mappen bevatten symbolische koppelingen naar bestanden in (2), (5) en (6).

De mappen die zijn gemarkeerd met (*) , worden door meerdere pakketten gebruikt. Sommige pakketindelingen (bijvoorbeeld rpm) vereisen speciale verwerking van dergelijke mappen. De pakketonderhouder moet dit regelen.

.NET-versiebeheer is gebaseerd op de versienummers van het runtime-onderdeel [major].[minor] . De SDK-versie maakt gebruik van hetzelfde [major].[minor] en heeft een onafhankelijke [patch] versie die functie- en patch-semantiek voor de SDK combineert. Bijvoorbeeld: SDK-versie 7.0.302 is de tweede patchrelease van de derde functierelease van de SDK die ondersteuning biedt voor de runtime 7.0. Zie het overzicht van .NET-versiebeheer voor meer informatie over de werking van versiebeheer.

Sommige van de pakketten bevatten een deel van het versienummer in hun naam. Hiermee kunt u een specifieke versie installeren. De rest van de versie is niet opgenomen in de versienaam. Hierdoor kan het besturingssysteempakketbeheer de pakketten bijwerken (bijvoorbeeld het automatisch installeren van beveiligingsoplossingen). Ondersteunde pakketbeheerders zijn specifiek voor Linux.

Hieronder ziet u de aanbevolen pakketten:

  • dotnet-sdk-[major].[minor] - Installeert de nieuwste SDK voor specifieke runtime

    • Versie:<SDK-versie>
    • Voorbeeld: dotnet-sdk-7.0
    • Bevat: (3),(4),(18)
    • Afhankelijkheden:dotnet-runtime-[major].[minor], aspnetcore-runtime-[major].[minor], dotnet-targeting-pack-[major].[minor], aspnetcore-targeting-pack-[major].[minor], , netstandard-targeting-pack-[netstandard_major].[netstandard_minor]dotnet-apphost-pack-[major].[minor]dotnet-templates-[major].[minor]
  • aspnetcore-runtime-[major].[minor] - Installeert een specifieke ASP.NET Core-runtime

    • Versie:<aspnetcore runtime-versie>
    • Voorbeeld: aspnetcore-runtime-7.0
    • Bevat: (6)
    • Afhankelijkhedendotnet-runtime-[major].[minor]:
  • dotnet-runtime-deps-[major].[minor](Optioneel) - Installeert de afhankelijkheden voor het uitvoeren van zelfstandige toepassingen

    • Versie:<runtimeversie>
    • Voorbeeld: dotnet-runtime-deps-7.0
    • Afhankelijkheden:distributiespecifieke afhankelijkheden
  • dotnet-runtime-[major].[minor] - Installeert een specifieke runtime

    • Versie:<runtimeversie>
    • Voorbeeld: dotnet-runtime-7.0
    • Bevat: (5)
    • Afhankelijkheden:dotnet-hostfxr-[major].[minor], dotnet-runtime-deps-[major].[minor]
  • dotnet-hostfxr-[major].[minor] -Afhankelijkheid

    • Versie:<runtimeversie>
    • Voorbeeld: dotnet-hostfxr-7.0
    • Bevat: (2)
    • Afhankelijkhedendotnet-host:
  • dotnet-host -Afhankelijkheid

    • Versie:<runtimeversie>
    • Voorbeeld: dotnet-host
    • Bevat: (1),(8),(9),(10),(16)
  • dotnet-apphost-pack-[major].[minor] -Afhankelijkheid

    • Versie:<runtimeversie>
    • Bevat: (13)
  • dotnet-targeting-pack-[major].[minor] - Hiermee kunt u zich richten op een niet-meest recente runtime

    • Versie:<runtimeversie>
    • Bevat: (12)
  • aspnetcore-targeting-pack-[major].[minor] - Hiermee kunt u zich richten op een niet-meest recente runtime

    • Versie:<aspnetcore runtime-versie>
    • Bevat: (11)
  • netstandard-targeting-pack-[netstandard_major].[netstandard_minor] - Hiermee staat u toe dat er een netstandard-versie wordt gebruikt

    • Versie:<SDK-versie>
    • Bevat: (15)
  • dotnet-templates-[major].[minor]

    • Versie:<SDK-versie>
    • Bevat: (17)

De volgende twee metapakketten zijn optioneel. Ze hebben waarde voor eindgebruikers omdat ze het pakket op het hoogste niveau (dotnet-sdk) abstraheren, wat de installatie van de volledige set .NET-pakketten vereenvoudigt. Deze metapakketten verwijzen naar een specifieke .NET SDK-versie.

  • dotnet[major] - Installeert de opgegeven SDK-versie

    • Versie:<SDK-versie>
    • Voorbeeld: dotnet7
    • Afhankelijkhedendotnet-sdk-[major].[minor]:
  • dotnet - Installeert een specifieke SDK-versie die wordt bepaald door distributies als primaire versie, meestal de meest recente beschikbare versie

    • Versie:<SDK-versie>
    • Voorbeeld: dotnet
    • Afhankelijkhedendotnet-sdk-[major].[minor]:

Hiervoor dotnet-runtime-deps-[major].[minor] is kennis nodig van de distributiespecifieke afhankelijkheden. Omdat het distributie-buildsysteem dit automatisch kan afleiden, is het pakket optioneel. In dat geval worden deze afhankelijkheden rechtstreeks aan het dotnet-runtime-[major].[minor] pakket toegevoegd.

Wanneer pakketinhoud zich onder een map met versiebeheer bevindt, komt de pakketnaam [major].[minor] overeen met de naam van de geversiede map. Voor alle pakketten, behalve de netstandard-targeting-pack-[netstandard_major].[netstandard_minor], komt dit ook overeen met de .NET-versie.

Afhankelijkheden tussen pakketten moeten een gelijk of hoger versievereiste gebruiken. Vereist aspnetcore-runtime-7.0 >= 7.0.6bijvoorbeelddotnet-sdk-7.0:7.0.401. Hierdoor kan de gebruiker de installatie upgraden via een hoofdpakket (bijvoorbeeld dnf update dotnet-sdk-7.0).

Voor de meeste distributies moeten alle artefacten worden gebouwd op basis van de bron. Dit heeft enkele gevolgen voor de pakketten:

  • De bibliotheken van derden onder shared/Microsoft.AspNetCore.All kunnen niet eenvoudig worden gebouwd op basis van de bron. De map wordt dus weggelaten uit het aspnetcore-runtime pakket.

  • Het NuGetFallbackFolder wordt gevuld met binaire artefacten van nuget.org. Het moet leeg blijven.

Meerdere dotnet-sdk pakketten kunnen dezelfde bestanden voor de NuGetFallbackFolder. Om problemen met pakketbeheer te voorkomen, moeten deze bestanden identiek zijn (controlesom, wijzigingsdatum enzovoort).

Fouten opsporen in pakketten

Foutopsporingsinhoud moet worden verpakt in foutopsporingspakketten die de .NET-pakketsplitsing volgen die eerder in dit artikel zijn beschreven. Foutopsporingsinhoud voor het pakket moet bijvoorbeeld worden opgenomen in een pakket met de dotnet-sdk-[major].[minor] naam dotnet-sdk-dbg-[major].[minor]. U moet foutopsporingsinhoud installeren op dezelfde locatie als de binaire bestanden.

Hier volgen enkele binaire voorbeelden:

In de {dotnet_root}/sdk/<sdk version> map worden de volgende twee bestanden verwacht:

  • dotnet.dll - geïnstalleerd met dotnet-sdk-[major].[minor] pakket
  • dotnet.pdb - geïnstalleerd met dotnet-sdk-dbg-[major].[minor] pakket

In de {dotnet_root}/shared/Microsoft.NETCore.App/<runtime version> map worden de volgende twee bestanden verwacht:

  • System.Text.Json.dll - geïnstalleerd met dotnet-runtime-[major].[minor] pakket
  • System.Text.Json.pdb - geïnstalleerd met dotnet-runtime-dbg-[major].[minor] pakket

In de {dotnet_root/shared/Microsoft.AspNetCore.App/<aspnetcore version> map worden de volgende twee bestanden verwacht:

  • Microsoft.AspNetCore.Routing.dll - geïnstalleerd met aspnetcore-runtime-[major].[minor] pakketten
  • Microsoft.AspNetCore.Routing.pdb - geïnstalleerd met aspnetcore-runtime-dbg-[major].[minor] pakketten

Vanaf .NET 8.0 zijn alle .NET-foutopsporingsinhoud (PDB-bestanden), geproduceerd door source-build, beschikbaar in een tarball met de naam dotnet-symbols-sdk-<version>-<rid>.tar.gz. Dit archief bevat PDBs in submappen die overeenkomen met de mapstructuur van de .NET SDK tarball - dotnet-sdk-<version>-<rid>.tar.gz.

Hoewel alle foutopsporingsinhoud beschikbaar is in de tarball voor foutopsporing, is niet alle inhoud voor foutopsporing even belangrijk. Eindgebruikers zijn vooral geïnteresseerd in de inhoud van de shared/Microsoft.AspNetCore.App/<aspnetcore version> en shared/Microsoft.NETCore.App/<runtime version> directory's.

De SDK-inhoud hieronder sdk/<sdk version> is handig voor het opsporen van fouten in .NET SDK-hulpprogramma's.

De volgende pakketten zijn de aanbevolen foutopsporingspakketten:

  • aspnetcore-runtime-dbg-[major].[minor] - Installeert foutopsporingsinhoud voor een specifieke ASP.NET Core-runtime

    • Versie:<aspnetcore runtime-versie>
    • Voorbeeld: aspnetcore-runtime-dbg-8.0
    • Bevat: fouten opsporen in inhoud voor (6)
    • Afhankelijkhedenaspnetcore-runtime-[major].[minor]:
  • dotnet-runtime-dbg-[major].[minor] - Installeert foutopsporingsinhoud voor een specifieke runtime

    • Versie:<runtimeversie>
    • Voorbeeld: dotnet-runtime-dbg-8.0
    • Bevat: fouten opsporen in inhoud voor (5)
    • Afhankelijkhedendotnet-runtime-[major].[minor]:

Het volgende foutopsporingspakket is optioneel:

  • dotnet-sdk-dbg-[major].[minor] - Installeert foutopsporingsinhoud voor een specifieke SDK-versie
    • Versie:<SDK-versie>
    • Voorbeeld: dotnet-sdk-dbg-8.0
    • Bevat: fouten opsporen in inhoud voor (3),(4),(18)
    • Afhankelijkhedendotnet-sdk-[major].[minor]:

De tarball voor foutopsporing bevat ook een aantal foutopsporingsinhoud waaronder packskopieën van inhoud shared. In de .NET-indeling wordt de map gebruikt voor het packs bouwen van .NET-toepassingen. Er zijn geen foutopsporingsscenario's, dus u moet de foutopsporingsinhoud packs niet verpakken in de tarball voor foutopsporing.

Bouwpakketten

De dotnet-/source-build-opslagplaats bevat instructies voor het bouwen van een bron-tarball van de .NET SDK en alle bijbehorende onderdelen. De uitvoer van de bron-buildopslagplaats komt overeen met de indeling die wordt beschreven in de eerste sectie van dit artikel.