次の方法で共有


ランタイム パッケージ ストア

.NET Core 2.0 以降では、ターゲット環境に存在する既知のパッケージ セットに対してアプリをパッケージ化および展開できます。 利点は、デプロイの高速化、ディスク領域の使用量の削減、場合によっては起動時のパフォーマンスの向上です。

この機能は、パッケージが格納されているディスク上のディレクトリである ランタイム パッケージ ストアとして実装されます (通常は macOS/Linux の /usr/local/share/dotnet/store 、Windows 上の C:/Program Files/dotnet/store )。 このディレクトリの下には、アーキテクチャと ターゲット フレームワークのサブディレクトリがあります。 ファイル レイアウトは、 NuGet アセットをディスクに配置する方法と似ています。

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

ターゲット マニフェスト ファイルには、ランタイム パッケージ ストア内のパッケージが一覧表示されます。 開発者は、アプリを発行するときにこのマニフェストを対象にすることができます。 ターゲット マニフェストは、通常、対象となる運用環境の所有者によって提供されます。

ランタイム環境の準備

ランタイム環境の管理者は、ランタイム パッケージ ストアと対応するターゲット マニフェストを構築することで、より高速なデプロイとディスク領域の使用のためにアプリを最適化できます。

最初の手順では、ランタイム パッケージ ストア を構成するパッケージを一覧表示するパッケージ ストア マニフェストを作成します。 このファイル形式は、プロジェクト ファイル形式 (csproj) と互換性があります。

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

次のパッケージ ストア マニフェストの例 (packages.csproj) を使用して、ランタイム パッケージ ストアに Newtonsoft.JsonMoq を追加します。

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

パッケージ ストア マニフェスト、ランタイム、フレームワークを使用して dotnet store を実行して、ランタイム パッケージ ストアをプロビジョニングします。

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

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

コマンドでオプションとパスを繰り返すことで、1 つの dotnet store コマンドに複数のターゲット パッケージ ストア マニフェスト パスを渡すことができます。

既定では、コマンドの出力は、ユーザーのプロファイルの .dotnet/store サブディレクトリの下のパッケージ ストアです。 --output <OUTPUT_DIRECTORY> オプションを使用して、別の場所を指定できます。 ストアのルート ディレクトリには、ターゲット マニフェスト artifact.xml ファイルが含まれています。 このファイルはダウンロード可能にすることができ、公開時にこのストアを対象とするアプリ作成者が使用できます。

次の artifact.xml ファイルは、前の例を実行した後に生成されます。 Castle.CoreMoqの依存関係であるため、自動的にインクルードされ、artifacts.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>

ターゲット マニフェストに対してアプリを発行する

ディスク上にターゲット マニフェスト ファイルがある場合は、 dotnet publish コマンドを使用してアプリを発行するときにファイルへのパスを指定します。

dotnet publish --manifest <PATH_TO_MANIFEST_FILE>

dotnet publish --manifest manifest.xml

結果として発行されたアプリは、ターゲット マニフェストで説明されているパッケージを含む環境にデプロイします。 そうしないと、アプリの起動に失敗します。

オプションとパス (たとえば、 --manifest manifest1.xml --manifest manifest2.xml) を繰り返して、アプリを発行するときに複数のターゲット マニフェストを指定します。 これを行うと、コマンドに指定されたターゲット マニフェスト ファイルで指定されたパッケージの和集合に対してアプリがトリミングされます。

配置に存在するマニフェスト依存関係を持つアプリケーションを配置する場合 (アセンブリは bin フォルダーに存在します)、ランタイム パッケージ ストアはそのアセンブリのホストでは 使用されませんbin フォルダー アセンブリは、ホスト上のランタイム パッケージ ストアに存在するかどうかにかかわらず使用されます。

マニフェストに示されている依存関係のバージョンは、ランタイム パッケージ ストア内の依存関係のバージョンと一致している必要があります。 ターゲット マニフェストの依存関係とランタイム パッケージ ストアに存在するバージョンの間にバージョンが一致せず、アプリに必要なバージョンのパッケージが配置に含まれていない場合、アプリは起動に失敗します。 例外には、ランタイム パッケージ ストア アセンブリに対して呼び出されたターゲット マニフェストの名前が含まれています。これは、不一致のトラブルシューティングに役立ちます。

発行時に配置が トリミング されると、指定したマニフェスト パッケージの特定のバージョンのみが、発行された出力から保留されます。 示されているバージョンのパッケージは、アプリを起動するためにホスト上に存在する必要があります。

プロジェクト ファイルでのターゲット マニフェストの指定

dotnet publish コマンドを使用してターゲット マニフェストを指定する代わりに、プロジェクト ファイルで、<TargetManifestFiles> タグの下にあるパスのセミコロン区切りのリストとして指定することもできます。

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

.NET Core プロジェクトなど、アプリのターゲット環境がよく知られている場合にのみ、プロジェクト ファイルでターゲット マニフェストを指定します。 これは、オープンソース プロジェクトの場合ではありません。 通常、オープンソース プロジェクトのユーザーは、それをさまざまな運用環境にデプロイします。 通常、これらの運用環境には、プレインストールされているパッケージのセットが異なります。 このような環境ではターゲット マニフェストについて想定できないため、--manifestdotnet publish オプションを使用する必要があります。

ASP.NET Core 暗黙的ストア (.NET Core 2.0 のみ)

ASP.NET Core 暗黙的ストアは、ASP.NET Core 2.0 にのみ適用されます。 アプリケーションでは、暗黙的なストアを使用 しない ASP.NET Core 2.1 以降を使用することを強くお勧めします。 ASP.NET Core 2.1 以降では、共有フレームワークを使用します。

.NET Core 2.0 の場合、ランタイム パッケージ ストア機能は、アプリが フレームワークに依存するデプロイ アプリとして展開されるときに、ASP.NET Core アプリによって暗黙的に使用されます。 Microsoft.NET.Sdk.Webのターゲットには、ターゲット システム上の暗黙的なパッケージ ストアを参照するマニフェストが含まれます。 さらに、 Microsoft.AspNetCore.All パッケージに依存するフレームワークに依存するアプリは、 Microsoft.AspNetCore.All メタパッケージに一覧表示されているパッケージではなく、アプリとその資産のみを含む発行済みアプリになります。 これらのパッケージがターゲット システムに存在することを前提としています。

ランタイム パッケージ ストアは、.NET SDK のインストール時にホストにインストールされます。 他のインストーラーは、.NET SDK の Zip/tarball インストール、 apt-get、Red Hat Yum、.NET Core Windows Server ホスティング バンドル、手動ランタイム パッケージ ストアのインストールなど、ランタイム パッケージ ストアを提供する場合があります。

フレームワークに依存するデプロイ アプリをデプロイするときは、ターゲット環境に .NET SDK がインストールされていることを確認します。 ASP.NET Core を含まない環境にアプリがデプロイされている場合は、次の例のようにプロジェクト ファイルでfalseを指定することで、暗黙的なストアをオプトアウトできます。

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

自己完結型配置アプリの場合、ターゲット システムに必要なマニフェスト パッケージが必ずしも含まれていないと想定されます。 したがって、 <PublishWithAspNetCoreTargetManifest> 自己完結型アプリの true に設定することはできません。

こちらも参照ください