共用方式為


執行階段套件儲存庫

從 .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.Core 是的 Moq相依性,因此它會自動包含在 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>

針對目標 manifest 發佈應用程式

如果您在磁碟上有目標指令清單檔案,請在發佈應用程式時使用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-getRed Hat Yum、.NET Core Windows Server 主機套件,以及手動執行時套件存儲安裝。

部署 架構相依部署 應用程式時,請確定目標環境已安裝 .NET SDK。 如果應用程式部署到不包含 ASP.NET Core 的環境,你可以透過在專案檔案中指定 <PublishWithAspNetCoreTargetManifest> set to false 來選擇退出隱式儲存,如下範例所示:

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

備註

針對 獨立式部署 應用程式,假設目標系統不一定包含必要的指令清單套件。 因此,<PublishWithAspNetCoreTargetManifest>無法設定為true,對於獨立部署應用程式來說。

另請參閱