Magazyn pakietu środowiska uruchomieniowegoRuntime package store

Począwszy od platformy .NET Core 2,0, możliwe jest pakowanie i wdrażanie aplikacji względem znanego zestawu pakietów istniejących w środowisku docelowym.Starting with .NET Core 2.0, it's possible to package and deploy apps against a known set of packages that exist in the target environment. Korzyści to szybsze wdrożenia, mniejsze użycie miejsca na dysku i Ulepszona wydajność uruchamiania w niektórych przypadkach.The benefits are faster deployments, lower disk space usage, and improved startup performance in some cases.

Ta funkcja jest zaimplementowana jako Magazyn pakietów środowiska uruchomieniowego, który jest katalogiem na dysku, na którym są przechowywane pakiety (zwykle w /usr/local/share/dotnet/Store na macOS/Linux i C:/pliki programu/dotnet/sklep w systemie Windows).This feature is implemented as a runtime package store, which is a directory on disk where packages are stored (typically at /usr/local/share/dotnet/store on macOS/Linux and C:/Program Files/dotnet/store on Windows). W tym katalogu znajdują się podkatalogi dla architektury i platform docelowych.Under this directory, there are subdirectories for architectures and target frameworks. Układ pliku jest podobny do sposobu, w jaki zasoby programu NuGet są wdrożone na dysku:The file layout is similar to the way that NuGet assets are laid out on disk:

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

Docelowy plik manifestu zawiera listę pakietów w magazynie pakietów środowiska uruchomieniowego.A target manifest file lists the packages in the runtime package store. Deweloperzy mogą wskazywać ten manifest podczas publikowania aplikacji.Developers can target this manifest when publishing their app. Manifest docelowy jest zwykle dostarczany przez właściciela docelowego środowiska produkcyjnego.The target manifest is typically provided by the owner of the targeted production environment.

Przygotowywanie środowiska uruchomieniowegoPreparing a runtime environment

Administrator środowiska uruchomieniowego może zoptymalizować aplikacje dla szybszych wdrożeń i zmniejszyć użycie miejsca na dysku przez utworzenie magazynu pakietów środowiska uruchomieniowego i odpowiedniego manifestu docelowego.The administrator of a runtime environment can optimize apps for faster deployments and lower disk space use by building a runtime package store and the corresponding target manifest.

Pierwszym krokiem jest utworzenie manifestu magazynu pakietów zawierającego listę pakietów, które tworzą magazyn pakietów środowiska uruchomieniowego.The first step is to create a package store manifest that lists the packages that compose the runtime package store. Ten format pliku jest zgodny z formatem pliku projektu (csproj).This file format is compatible with the project file format (csproj).

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

PrzykładExample

Następujący przykładowy manifest magazynu pakietów (Packages. csproj) służy do dodawania Newtonsoft.Json i Moq do magazynu pakietów środowiska uruchomieniowego:The following example package store manifest (packages.csproj) is used to add Newtonsoft.Json and Moq to a runtime package store:

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

Zainicjuj obsługę magazynu pakietów środowiska uruchomieniowego, wykonując dotnet store z manifestem magazynu pakietów, środowiskiem uruchomieniowym i strukturą:Provision the runtime package store by executing dotnet store with the package store manifest, runtime, and framework:

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

PrzykładExample

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

Istnieje możliwość przekazania wielu ścieżek manifestu magazynu pakietów docelowych do jednego dotnet store polecenia przez powtórzenie opcji i ścieżki w poleceniu.You can pass multiple target package store manifest paths to a single dotnet store command by repeating the option and path in the command.

Domyślnie dane wyjściowe polecenia są magazynem pakietów w podkatalogu . dotnet/Store w profilu użytkownika.By default, the output of the command is a package store under the .dotnet/store subdirectory of the user's profile. Możesz określić inną lokalizację przy użyciu --output <OUTPUT_DIRECTORY> opcji.You can specify a different location using the --output <OUTPUT_DIRECTORY> option. Katalog główny magazynu zawiera docelowy plik manifestu artifact.xml .The root directory of the store contains a target manifest artifact.xml file. Ten plik można udostępnić do pobrania i będzie używany przez autorów aplikacji, którzy chcą wskazać ten magazyn podczas publikowania.This file can be made available for download and be used by app authors who want to target this store when publishing.

PrzykładExample

Następujący plik artifact.xml jest generowany po uruchomieniu poprzedniego przykładu.The following artifact.xml file is produced after running the previous example. Należy pamiętać Castle.Core , że jest to zależność Moq , dlatego jest dołączona automatycznie i pojawia się w pliku manifestu artifacts.xml .Note that Castle.Core is a dependency of Moq, so it's included automatically and appears in the artifacts.xml manifest file.

<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>

Publikowanie aplikacji w manifeście docelowymPublishing an app against a target manifest

Jeśli na dysku znajduje się docelowy plik manifestu, należy określić ścieżkę do pliku podczas publikowania aplikacji za pomocą dotnet publish polecenia:If you have a target manifest file on disk, you specify the path to the file when publishing your app with the dotnet publish command:

dotnet publish --manifest <PATH_TO_MANIFEST_FILE>

PrzykładExample

dotnet publish --manifest manifest.xml

Opublikowana aplikacja jest wdrażana w środowisku z pakietami opisanymi w manifeście docelowym.You deploy the resulting published app to an environment that has the packages described in the target manifest. Wykonanie tej czynności spowoduje niepowodzenie uruchomienia aplikacji.Failing to do so results in the app failing to start.

Określ wiele manifestów docelowych podczas publikowania aplikacji przez powtórzenie opcji i ścieżki (na przykład --manifest manifest1.xml --manifest manifest2.xml ).Specify multiple target manifests when publishing an app by repeating the option and path (for example, --manifest manifest1.xml --manifest manifest2.xml). Gdy to zrobisz, aplikacja zostanie przycięta dla związku z pakietami określonymi w docelowym pliku manifestu dostarczanym do polecenia.When you do so, the app is trimmed for the union of packages specified in the target manifest files provided to the command.

W przypadku wdrożenia aplikacji z zależnością manifestu, która znajduje się we wdrożeniu (zestaw jest obecny w folderze bin ), magazyn pakietów środowiska uruchomieniowego nie jest używany na hoście dla tego zestawu.If you deploy an application with a manifest dependency that's present in the deployment (the assembly is present in the bin folder), the runtime package store isn't used on the host for that assembly. Zestaw folderu bin jest używany niezależnie od jego obecności w magazynie pakietów środowiska uruchomieniowego na hoście.The bin folder assembly is used regardless of its presence in the runtime package store on the host.

Wersja zależności wskazanej w manifeście musi być zgodna z wersją zależności w magazynie pakietów środowiska uruchomieniowego.The version of the dependency indicated in the manifest must match the version of the dependency in the runtime package store. Jeśli masz niezgodność wersji między zależnością w manifeście docelowym a wersją, która istnieje w magazynie pakietów środowiska uruchomieniowego, a aplikacja nie zawiera wymaganej wersji pakietu w jej wdrożeniu, uruchomienie aplikacji nie powiedzie się.If you have a version mismatch between the dependency in the target manifest and the version that exists in the runtime package store and the app doesn't include the required version of the package in its deployment, the app fails to start. Wyjątek zawiera nazwę manifestu docelowego, który został wywołany dla zestawu magazynu pakietów środowiska uruchomieniowego, co pomaga w rozwiązywaniu problemów z niezgodnością.The exception includes the name of the target manifest that called for the runtime package store assembly, which helps you troubleshoot the mismatch.

Gdy wdrożenie zostanie przycięte po opublikowaniu, tylko określone wersje pakietów manifestu są potrącane z publikowanych danych wyjściowych.When the deployment is trimmed on publish, only the specific versions of the manifest packages you indicate are withheld from the published output. Pakiety na wskazanych wersjach muszą być obecne na hoście, aby można było uruchomić aplikację.The packages at the versions indicated must be present on the host for the app to start.

Określanie manifestów docelowych w pliku projektuSpecifying target manifests in the project file

Alternatywą dla określenia manifestów docelowych za pomocą dotnet publish polecenia jest określenie ich w pliku projektu jako listę ścieżek rozdzielonych średnikami pod <TargetManifestFiles> tagiem.An alternative to specifying target manifests with the dotnet publish command is to specify them in the project file as a semicolon-separated list of paths under a <TargetManifestFiles> tag.

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

Określ docelowe manifesty w pliku projektu tylko wtedy, gdy Środowisko docelowe dla aplikacji jest dobrze znane, na przykład w przypadku projektów .NET Core.Specify the target manifests in the project file only when the target environment for the app is well-known, such as for .NET Core projects. Nie jest to przypadek dla projektów open source.This isn't the case for open-source projects. Użytkownicy projektu typu open source zwykle wdrażają je w różnych środowiskach produkcyjnych.The users of an open-source project typically deploy it to different production environments. W tych środowiskach produkcyjnych ogólnie zainstalowano różne zestawy pakietów.These production environments generally have different sets of packages pre-installed. Nie można tworzyć założeń dotyczących manifestu docelowego w takich środowiskach, dlatego należy użyć --manifest opcji dotnet publish .You can't make assumptions about the target manifest in such environments, so you should use the --manifest option of dotnet publish.

Niejawny magazyn ASP.NET Core (tylko w przypadku programu .NET Core 2,0)ASP.NET Core implicit store (.NET Core 2.0 only)

Niejawny magazyn ASP.NET Core ma zastosowanie tylko do ASP.NET Core 2,0.The ASP.NET Core implicit store applies only to ASP.NET Core 2.0. Zdecydowanie zalecamy stosowanie aplikacji ASP.NET Core 2,1 i nowszych, które nie korzystają z magazynu niejawnego.We strongly recommend applications use ASP.NET Core 2.1 and later, which does not use the implicit store. ASP.NET Core 2,1 i później używają udostępnionej platformy.ASP.NET Core 2.1 and later use the shared framework.

W przypadku platformy .NET Core 2,0 funkcja magazynu pakietów środowiska uruchomieniowego jest używana niejawnie przez aplikację ASP.NET Core, gdy aplikacja jest wdrażana jako aplikacja wdrożenia zależna od platformy .For .NET Core 2.0, the runtime package store feature is used implicitly by an ASP.NET Core app when the app is deployed as a framework-dependent deployment app. Elementy docelowe w programie Microsoft.NET.Sdk.Web zawierają manifesty odwołujące się do niejawnego magazynu pakietów w systemie docelowym.The targets in Microsoft.NET.Sdk.Web include manifests referencing the implicit package store on the target system. Ponadto każda aplikacja zależna od platformy, która zależy od Microsoft.AspNetCore.All pakietu, powoduje opublikowanie aplikacji, która zawiera tylko aplikację i jej zasoby, a nie pakiety wymienione w Microsoft.AspNetCore.All pakiecie.Additionally, any framework-dependent app that depends on the Microsoft.AspNetCore.All package results in a published app that contains only the app and its assets and not the packages listed in the Microsoft.AspNetCore.All metapackage. Przyjęto założenie, że te pakiety znajdują się w systemie docelowym.It's assumed that those packages are present on the target system.

Magazyn pakietów środowiska uruchomieniowego jest instalowany na hoście, gdy zainstalowano zestaw .NET Core SDK.The runtime package store is installed on the host when the .NET Core SDK is installed. Inne Instalatory mogą dostarczyć magazyn pakietów środowiska uruchomieniowego, w tym instalacje zip/plik tar zestaw .NET Core SDK, apt-get Red Hat yum, pakiet hostingu platformy .NET Core z systemem Windows Server i ręczne instalacje magazynu pakietów w środowisku uruchomieniowym.Other installers may provide the runtime package store, including Zip/tarball installations of the .NET Core SDK, apt-get, Red Hat Yum, the .NET Core Windows Server Hosting bundle, and manual runtime package store installations.

W przypadku wdrażania aplikacji wdrożenia zależnej od platformy upewnij się, że środowisko docelowe ma zainstalowaną zestaw .NET Core SDK.When deploying a framework-dependent deployment app, make sure that the target environment has the .NET Core SDK installed. Jeśli aplikacja jest wdrażana w środowisku, które nie zawiera ASP.NET Core, można zrezygnować z niejawnego magazynu przez określenie <PublishWithAspNetCoreTargetManifest> opcji Ustaw jako false w pliku projektu, jak w poniższym przykładzie:If the app is deployed to an environment that doesn't include ASP.NET Core, you can opt out of the implicit store by specifying <PublishWithAspNetCoreTargetManifest> set to false in the project file as in the following example:

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

Uwaga

W przypadku aplikacji do samodzielnego wdrażania zakłada się, że system docelowy nie musi zawierać wymaganych pakietów manifestu.For self-contained deployment apps, it's assumed that the target system doesn't necessarily contain the required manifest packages. W związku <PublishWithAspNetCoreTargetManifest> z tym nie można ustawić na true dla aplikacji samodzielnej.Therefore, <PublishWithAspNetCoreTargetManifest> cannot be set to true for an self-contained app.

Zobacz teżSee also