Compartir vía


Almacenamiento de paquetes en tiempo de ejecución

A partir de .NET Core 2.0, es posible empaquetar e implementar aplicaciones en un conjunto conocido de paquetes que existen en el entorno de destino. Las ventajas son implementaciones más rápidas, menor uso de espacio en disco y rendimiento de inicio mejorado en algunos casos.

Esta característica se implementa como un almacén de paquetes en tiempo de ejecución, que es un directorio en disco donde se almacenan los paquetes (normalmente en /usr/local/share/dotnet/store en macOS/Linux y C:/Archivos de programa/dotnet/store en Windows). En este directorio, hay subdirectorios para arquitecturas y marcos de destino. El diseño del archivo es similar a la manera en que los recursos nuGet se establecen en el disco:

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

Un archivo de manifiesto de destino muestra los paquetes en el almacén de paquetes en tiempo de ejecución. Los desarrolladores pueden tener como destino este manifiesto al publicar su aplicación. Normalmente, el propietario del entorno de producción de destino proporciona el manifiesto de destino.

Preparación de un entorno en tiempo de ejecución

El administrador de un entorno en tiempo de ejecución puede optimizar las aplicaciones para implementaciones más rápidas y reducir el uso del espacio en disco mediante la creación de un almacén de paquetes en tiempo de ejecución y el manifiesto de destino correspondiente.

El primer paso es crear un manifiesto de almacén de paquetes que muestre los paquetes que componen el almacén de paquetes en tiempo de ejecución. Este formato de archivo es compatible con el formato de archivo del proyecto (csproj).

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

Ejemplo

El siguiente manifiesto del almacén de paquetes de ejemplo (packages.csproj) se usa para agregar Newtonsoft.Json y Moq a un almacén de paquetes en tiempo de ejecución:

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

Aprovisione el almacenamiento de paquetes en tiempo de ejecución ejecutando dotnet store con el manifiesto de almacenamiento de paquetes, el runtime y el marco:

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

Ejemplo

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

Puede pasar varias rutas de manifiesto de almacenamiento de paquetes de destino a un único comando dotnet store repitiendo la opción y la ruta en el comando.

De forma predeterminada, la salida del comando es un almacén de paquetes en el subdirectorio .dotnet/store del perfil del usuario. Puede especificar una ubicación diferente mediante la --output <OUTPUT_DIRECTORY> opción . El directorio raíz de la tienda contiene un archivo de manifiesto de destino artifact.xml. Este archivo puede estar disponible para descargarlo y usarlo por los autores de aplicaciones que quieran dirigirse a esta tienda al publicarlo.

Ejemplo

El siguiente archivo artifact.xml se genera después de ejecutar el ejemplo anterior. Tenga en cuenta que Castle.Core es una dependencia de Moq, por lo que se incluye automáticamente y aparece en el archivo de manifiesto deartifacts.xml .

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

Publicación de una aplicación en un manifiesto de destino

Si tiene un archivo de manifiesto de destino en el disco, especifique la ruta de acceso al archivo al publicar la aplicación con el dotnet publish comando :

dotnet publish --manifest <PATH_TO_MANIFEST_FILE>

Ejemplo

dotnet publish --manifest manifest.xml

Implemente la aplicación publicada resultante en un entorno que tenga los paquetes descritos en el manifiesto de destino. Si no lo hace, la aplicación no se puede iniciar.

Especifique varios manifiestos de destino al publicar una aplicación repitiendo la opción y la ruta de acceso (por ejemplo, --manifest manifest1.xml --manifest manifest2.xml). Cuando realice esto, la aplicación se reduce para la unión de los paquetes especificados en los archivos de manifiesto de destino que se proporcionan para el comando.

Si implementa una aplicación con una dependencia de manifiesto que está presente en la implementación (el ensamblado está presente en la carpeta bin ), el almacén de paquetes en tiempo de ejecución no se usa en el host para ese ensamblado. El ensamblado de la carpeta bin se usa independientemente de su presencia en el almacén de paquetes en tiempo de ejecución en el host.

La versión de la dependencia indicada en el manifiesto debe coincidir con la versión de la dependencia en el almacén de paquetes en tiempo de ejecución. Si tiene una discrepancia de versión entre la dependencia del manifiesto de destino y la versión que existe en el almacén de paquetes en tiempo de ejecución y la aplicación no incluye la versión necesaria del paquete en su implementación, la aplicación no se inicia. La excepción incluye el nombre del manifiesto de destino que se ha llamado para el ensamblado del almacenamiento de paquetes en tiempo de ejecución, que le ayuda a solucionar los errores de coincidencia.

Cuando la implementación se reduce en su publicación, solo las versiones específicas de los paquetes de manifiesto que indique se retienen del resultado publicado. Los paquetes de las versiones indicadas deben estar presentes en el host para que se inicie la aplicación.

Especificar los manifiestos de destino en el archivo del proyecto

Una alternativa a especificar manifiestos de destino con el dotnet publish comando es especificarlos en el archivo de proyecto como una lista separada por punto y coma de rutas de acceso en una <etiqueta TargetManifestFiles> .

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

Especifique los manifiestos de destino en el archivo de proyecto solo cuando el entorno de destino de la aplicación sea conocido, como para los proyectos de .NET Core. Este no es el caso de los proyectos de código abierto. Los usuarios de un proyecto de código abierto suelen implementarlo en distintos entornos de producción. Estos entornos de producción suelen tener diferentes conjuntos de paquetes preinstalados. No puede realizar presuposiciones sobre el manifiesto de destino en dichos entornos, por lo que debe usar la opción --manifest de dotnet publish.

Almacén implícito de ASP.NET Core (solo .NET Core 2.0)

El almacén implícito de ASP.NET Core solo se aplica a ASP.NET Core 2.0. Se recomienda encarecidamente que las aplicaciones usen ASP.NET Core 2.1 y versiones posteriores, ya que estas no utilizan el almacén implícito. ASP.NET Core 2.1 y versiones posteriores usan el marco compartido.

Para .NET Core 2.0, una aplicación de ASP.NET Core usa implícitamente la característica del almacén de paquetes en tiempo de ejecución cuando la aplicación se implementa como una aplicación de implementación dependiente del marco . Los destinos en Microsoft.NET.Sdk.Web incluyen manifiestos que hacen referencia al almacenamiento de paquetes implícito en el sistema de destino. Además, cualquier aplicación dependiente del marco que dependa del Microsoft.AspNetCore.All paquete da como resultado una aplicación publicada que contenga solo la aplicación y sus recursos y no los paquetes enumerados en el Microsoft.AspNetCore.All metapaquete. Se supone que esos paquetes están presentes en el sistema de destino.

El almacén de paquetes en tiempo de ejecución se instala en el host cuando se instala el SDK de .NET. Otros instaladores pueden proporcionar el almacenamiento de paquetes en tiempo de ejecución, incluidas las instalaciones Zip/tarball del SDK de .NET, apt-get, Red Hat Yum, el conjunto de hospedaje de Windows Server para .NET Core y las instalaciones manuales de almacenamiento de paquetes en tiempo de ejecución.

Al implementar una aplicación de implementación dependiente del marco , asegúrese de que el entorno de destino tenga instalado el SDK de .NET. Si la aplicación se implementa en un entorno que no incluye ASP.NET Core, puede excluir el almacén implícito especificando <PublishWithAspNetCoreTargetManifest> establecido en false en el archivo del proyecto, como en el siguiente ejemplo:

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

Nota:

En el caso de las aplicaciones de implementación autónoma, se supone que el sistema de destino no contiene necesariamente los paquetes de manifiesto necesarios. Por lo tanto, <PublishWithAspNetCoreTargetManifest> no se puede establecer en true para una aplicación independiente.

Consulte también