Körningspaketarkiv

Från och med .NET Core 2.0 är det möjligt att paketera och distribuera appar mot en känd uppsättning paket som finns i målmiljön. Fördelarna är snabbare distributioner, lägre diskutrymmesanvändning och förbättrad startprestanda i vissa fall.

Den här funktionen implementeras som ett körningspaketarkiv, som är en katalog på disk där paket lagras (vanligtvis på /usr/local/share/dotnet/store på macOS/Linux och C:/Program Files/dotnet/store i Windows). I den här katalogen finns underkataloger för arkitekturer och målramverk. Fillayouten liknar hur NuGet-tillgångar läggs ut på disk:

\dotnet
    \store
        \x64
            \netcoreapp2.0
                \microsoft.applicationinsights
                \microsoft.aspnetcore
                ...
        \x86
            \netcoreapp2.0
                \microsoft.applicationinsights
                \microsoft.aspnetcore
                ...

En målmanifestfil visar paketen i körningspaketarkivet. Utvecklare kan rikta in sig på det här manifestet när de publicerar sin app. Målmanifestet tillhandahålls vanligtvis av ägaren av målproduktionsmiljön.

Förbereda en körningsmiljö

Administratören för en körningsmiljö kan optimera appar för snabbare distributioner och lägre diskutrymme genom att skapa ett körningspaketarkiv och motsvarande målmanifest.

Det första steget är att skapa ett paketlagringsmanifest som visar de paket som utgör paketarkivet runtime. Det här filformatet är kompatibelt med projektfilformatet (csproj).

<Project Sdk="Microsoft.NET.Sdk">
  <ItemGroup>
    <PackageReference Include="NUGET_PACKAGE" Version="VERSION" />
    <!-- Include additional packages here -->
  </ItemGroup>
</Project>

Exempel

Följande exempel på paketlagringsmanifest (packages.csproj) används för att lägga Newtonsoft.Json till och Moq till ett körningspaketarkiv:

<Project Sdk="Microsoft.NET.Sdk">
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
    <PackageReference Include="Moq" Version="4.7.63" />
  </ItemGroup>
</Project>

Etablera runtime-paketarkivet genom att dotnet store köra med paketlagringsmanifestet, körningen och ramverket:

dotnet store --manifest <PATH_TO_MANIFEST_FILE> --runtime <RUNTIME_IDENTIFIER> --framework <FRAMEWORK>

Exempel

dotnet store --manifest packages.csproj --runtime win-x64 --framework netcoreapp2.0 --framework-version 2.0.0

Du kan skicka flera manifestsökvägar för målpaketarkivet till ett enda dotnet store kommando genom att upprepa alternativet och sökvägen i kommandot.

Som standard är kommandots utdata ett paketarkiv under underkatalogen .dotnet/store för användarens profil. Du kan ange en annan plats med hjälp av --output <OUTPUT_DIRECTORY> alternativet . Rotkatalogen i arkivet innehåller ett målmanifest artifact.xml fil. Den här filen kan göras tillgänglig för nedladdning och användas av appförfattare som vill rikta in sig på det här arkivet vid publicering.

Exempel

Följande artifact.xml-fil skapas när du har kört föregående exempel. Observera att Castle.Core är beroende av Moq, så det inkluderas automatiskt och visas i artifacts.xml-manifestfilen.

<StoreArtifacts>
  <Package Id="Newtonsoft.Json" Version="10.0.3" />
  <Package Id="Castle.Core" Version="4.1.0" />
  <Package Id="Moq" Version="4.7.63" />
</StoreArtifacts>

Publicera en app mot ett målmanifest

Om du har en målmanifestfil på disken anger du sökvägen till filen när du publicerar appen med dotnet publish kommandot :

dotnet publish --manifest <PATH_TO_MANIFEST_FILE>

Exempel

dotnet publish --manifest manifest.xml

Du distribuerar den resulterande publicerade appen till en miljö där paketen beskrivs i målmanifestet. Om du inte gör det kan appen inte startas.

Ange flera målmanifest när du publicerar en app genom att upprepa alternativet och sökvägen (till exempel --manifest manifest1.xml --manifest manifest2.xml). När du gör det trimmas appen för den union av paket som anges i målmanifestfilerna som tillhandahålls till kommandot.

Om du distribuerar ett program med ett manifestberoende som finns i distributionen (sammansättningen finns i mappen bin) används inte körningspaketarkivet på värden för den sammansättningen. Sammansättningen av bin-mappen används oavsett dess närvaro i runtime-paketarkivet på värden.

Den version av beroendet som anges i manifestet måste matcha versionen av beroendet i runtime-paketarkivet. Om du har ett versionsmatchningsfel mellan beroendet i målmanifestet och den version som finns i körningspaketarkivet och appen inte innehåller den nödvändiga versionen av paketet i distributionen, startar inte appen. Undantaget innehåller namnet på målmanifestet som anropade för paketlagringssammansättningen runtime, vilket hjälper dig att felsöka matchningen.

När distributionen trimmas vid publiceringen är det bara de specifika versioner av manifestpaketen som du anger som undanhålls de publicerade utdata. Paketen i de angivna versionerna måste finnas på värden för att appen ska starta.

Ange målmanifest i projektfilen

Ett alternativ till att ange målmanifest med dotnet publish kommandot är att ange dem i projektfilen som en semikolonavgränsad lista över sökvägar under en <TargetManifestFiles-tagg> .

<PropertyGroup>
  <TargetManifestFiles>manifest1.xml;manifest2.xml</TargetManifestFiles>
</PropertyGroup>

Ange målmanifesten i projektfilen endast när målmiljön för appen är välkänd, till exempel för .NET Core-projekt. Detta är inte fallet för projekt med öppen källkod. Användare av ett projekt med öppen källkod distribuerar det vanligtvis till olika produktionsmiljöer. Dessa produktionsmiljöer har vanligtvis olika uppsättningar paket förinstallerade. Du kan inte göra antaganden om målmanifestet i sådana miljöer, så du bör använda --manifest alternativet dotnet publish.

ASP.NET Core implicit store (endast.NET Core 2.0)

Det implicita arkivet ASP.NET Core gäller endast för ASP.NET Core 2.0. Vi rekommenderar starkt att program använder ASP.NET Core 2.1 och senare, som inte använder det implicita arkivet. ASP.NET Core 2.1 och senare använder det delade ramverket.

För .NET Core 2.0 används funktionen för körningspaketarkiv implicit av en ASP.NET Core-app när appen distribueras som en ramverksberoende distributionsapp . Målen i Microsoft.NET.Sdk.Web inkluderar manifest som refererar till det implicita paketarkivet i målsystemet. Dessutom resulterar alla ramverksberoende Microsoft.AspNetCore.All appar som är beroende av paketet i en publicerad app som endast innehåller appen och dess tillgångar och inte de paket som anges i Microsoft.AspNetCore.All metapaketet. Det förutsätts att paketen finns i målsystemet.

Runtime-paketarkivet installeras på värden när .NET SDK är installerat. Andra installationsprogram kan tillhandahålla runtime-paketarkivet, inklusive Zip/tarball-installationer av .NET SDK, apt-get, Red Hat Yum, .NET Core Windows Server Hosting-paketet och manuella installationer av körningspaket.

När du distribuerar en ramverksberoende distributionsapp kontrollerar du att målmiljön har .NET SDK installerat. Om appen distribueras till en miljö som inte innehåller ASP.NET Core kan du välja bort det implicita arkivet genom att <false ange PublishWithAspNetCoreTargetManifest> inställt på i projektfilen som i följande exempel:

<PropertyGroup>
  <PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
</PropertyGroup>

Kommentar

För fristående distributionsappar förutsätts det att målsystemet inte nödvändigtvis innehåller de nödvändiga manifestpaketen. <Därför går det inte att ange PublishWithAspNetCoreTargetManifest> till true för en fristående app.

Se även