次の方法で共有


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

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

複数のターゲット パッケージ ストアのマニフェストのパスは、コマンドにオプションとパスを繰り返すことで、単一の 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 プロジェクトのようによく知られている場合にのみ、プロジェクト ファイルにターゲット マニフェストを指定します。 これは、オープンソース プロジェクトには該当しません。 オープンソース プロジェクトのユーザーは通常、さまざまな運用環境にアプリを展開します。 一般的に、これらの運用環境には、さまざまなインストール済みのパッケージのセットがあります。 このような環境でターゲット マニフェストについて想定することができないため、dotnet publish--manifest オプションを使用する必要があります。

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 がインストールされるときに、ホストにインストールされます。 その他のインストーラーでは、Zip/tarball インストールの .NET SDK、apt-get、Red Hat Yum、.NET Core Windows Server Hosting バンドル、および手動のランタイム パッケージ ストアのインストールなど、ランタイム パッケージ ストアを提供する場合があります。

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

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

Note

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

関連項目