Condividi tramite


Archivio pacchetti di runtime

A partire da .NET Core 2.0, è possibile creare pacchetti e distribuire app in un set noto di pacchetti presenti nell'ambiente di destinazione. I vantaggi sono distribuzioni più veloci, un utilizzo inferiore dello spazio su disco e prestazioni di avvio migliorate in alcuni casi.

Questa funzionalità viene implementata come archivio pacchetti di runtime, ovvero una directory su disco in cui sono archiviati i pacchetti (in genere in /usr/local/share/dotnet/store in macOS/Linux e C:/Programmi/dotnet/store in Windows). Sotto questa directory, sono disponibili sottodirectory per le architetture e i framework di destinazione. Il layout del file è simile al modo in cui gli asset NuGet sono disposti su disco:

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

Un file manifesto di destinazione elenca i pacchetti nell'archivio pacchetti di runtime. Gli sviluppatori possono specificare come destinazione questo manifesto durante la pubblicazione dell'app. Il manifesto obiettivo viene in genere fornito dal proprietario dell'ambiente di produzione mirato.

Preparazione di un ambiente di runtime

L'amministratore di un ambiente di runtime può ottimizzare le app per distribuzioni più veloci e ridurre lo spazio su disco usando un archivio pacchetti di runtime e il manifesto di destinazione corrispondente.

Il primo passaggio consiste nel creare un manifesto dell'archivio di pacchetti che elenca i pacchetti che compongono l'archivio di pacchetti per il runtime. Questo formato di file è compatibile con il formato di file di progetto (csproj).

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

Esempio

Il manifesto dell'archivio pacchetti di esempio seguente (packages.csproj) viene usato per aggiungere Newtonsoft.Json e Moq a un archivio pacchetti di runtime:

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

Configura l'archivio di pacchetti runtime eseguendo dotnet store con il manifesto dell'archivio dei pacchetti, il runtime e il framework.

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

Esempio

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

È possibile passare più percorsi dei manifesti di archivio dei pacchetti di destinazione a un singolo comando dotnet store ripetendo l'opzione e il percorso nel comando.

Per impostazione predefinita, l'output del comando è un archivio di pacchetti nella sottodirectory .dotnet/store del profilo utente. È possibile specificare un percorso diverso usando l'opzione --output <OUTPUT_DIRECTORY> . La directory radice del negozio contiene un file manifesto target artifact.xml. Questo file può essere reso disponibile per il download ed essere usato dagli autori di app che desiderano prendere di mira questo negozio quando pubblicano.

Esempio

Il file diartifact.xml seguente viene generato dopo l'esecuzione dell'esempio precedente. Si noti che Castle.Core è una dipendenza di Moq, quindi viene inclusa automaticamente e viene visualizzata nel file manifestoartifacts.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>

Pubblicazione di un'app contro un manifest di destinazione

Se si dispone di un file manifesto di destinazione su disco, specificare il percorso del file durante la pubblicazione dell'app con il dotnet publish comando :

dotnet publish --manifest <PATH_TO_MANIFEST_FILE>

Esempio

dotnet publish --manifest manifest.xml

L'app pubblicata risultante viene distribuita in un ambiente con i pacchetti descritti nel manifesto di destinazione. In caso contrario, l'avvio dell'app non riesce.

Specificare più manifesti di destinazione durante la pubblicazione di un'app ripetendo l'opzione e il percorso , ad esempio --manifest manifest1.xml --manifest manifest2.xml. In questo caso, l'app viene tagliata per l'unione dei pacchetti specificati nei file manifesto di destinazione forniti al comando.

Se si distribuisce un'applicazione con una dipendenza manifesto presente nella distribuzione (l'assembly è presente nella cartella bin ), l'archivio pacchetti di runtime non viene usato nell'host per tale assembly. L'assembly della cartella bin viene utilizzato indipendentemente dalla sua presenza nel store di pacchetti runtime sull'host.

La versione della dipendenza indicata nel manifesto deve corrispondere alla versione della dipendenza nell'archivio pacchetti di runtime. Se si verifica una mancata corrispondenza della versione tra la dipendenza nel manifesto di destinazione e la versione esistente nell'archivio pacchetti di runtime e l'app non include la versione richiesta del pacchetto nella distribuzione, l'app non viene avviata. L'eccezione include il nome del manifesto di destinazione che ha richiesto l'assembly dell'archivio pacchetti di runtime, il che aiuta a risolvere la mancata corrispondenza.

Quando la distribuzione viene esclusa durante la pubblicazione, solo le versioni specifiche dei pacchetti manifesto indicate vengono escluse dall'output pubblicato. I pacchetti nelle versioni indicate devono essere presenti nell'host per l'avvio dell'app.

Specifica dei manifesti di destinazione nel file di progetto

Un'alternativa alla specifica dei manifesti di destinazione con il dotnet publish comando consiste nel specificarli nel file di progetto come elenco di percorsi separati da punto e virgola in un <tag TargetManifestFiles> .

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

Specificare i manifesti di destinazione nel file di progetto solo quando l'ambiente di destinazione per l'app è noto, ad esempio per i progetti .NET Core. Questo non è il caso per i progetti open source. Gli utenti di un progetto open source lo distribuiscono in genere in ambienti di produzione diversi. Questi ambienti di produzione hanno in genere set diversi di pacchetti preinstallati. Non è possibile fare ipotesi sul manifesto di destinazione in tali ambienti, quindi è consigliabile usare l'opzione --manifest di dotnet publish.

archivio implicito di ASP.NET Core (solo .NET Core 2.0)

Il negozio implicito di ASP.NET Core si applica solo ad ASP.NET Core 2.0. È consigliabile che le applicazioni usino ASP.NET Core 2.1 e versioni successive, che non usano l'archivio implicito. ASP.NET Core 2.1 e versioni successive usano il framework condiviso.

Per .NET Core 2.0, la funzionalità dell'archivio pacchetti di runtime viene usata in modo implicito da un'app ASP.NET Core quando l'app viene distribuita come app di distribuzione dipendente dal framework . Le destinazioni in Microsoft.NET.Sdk.Web includono manifesti che fanno riferimento all'archivio implicito dei pacchetti nel sistema di destinazione. Inoltre, qualsiasi app dipendente dal framework che dipende dal pacchetto Microsoft.AspNetCore.All genera un'app pubblicata che contiene solo l'app e i relativi asset e non i pacchetti elencati nel Microsoft.AspNetCore.All metapacchetto. Si presuppone che tali pacchetti siano presenti nel sistema di destinazione.

L'archivio pacchetti di runtime viene installato nell'host quando è installato .NET SDK. Altri programmi di installazione possono fornire l'archivio pacchetti di runtime, incluse le installazioni Zip/tarball di .NET SDK, apt-get, Red Hat Yum, il bundle di hosting di Windows Server .NET Core e le installazioni manuali dell'archivio pacchetti di runtime.

Quando si distribuisce un'app di distribuzione dipendente dal framework , assicurarsi che nell'ambiente di destinazione sia installato .NET SDK. Se l'app viene distribuita in un ambiente che non include ASP.NET Core, è possibile rifiutare esplicitamente l'archivio implicito specificando <PublishWithAspNetCoreTargetManifest> impostato su false nel file di progetto come nell'esempio seguente:

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

Annotazioni

Per le app di distribuzione autonome , si presuppone che il sistema di destinazione non contenga necessariamente i pacchetti manifesto necessari. Pertanto, <PublishWithAspNetCoreTargetManifest> non può essere impostato su true per un'app autonoma.

Vedere anche