Penyimpanan paket runtime

Dimulai dengan .NET Core 2.0, dimungkinkan untuk mengemas dan menyebarkan aplikasi terhadap serangkaian paket yang diketahui yang ada di lingkungan target. Manfaatnya adalah penyebaran yang lebih cepat, penggunaan ruang disk yang lebih rendah, dan peningkatan performa startup dalam beberapa kasus.

Fitur ini diimplementasikan sebagai penyimpanan paket runtime, yang merupakan direktori pada disk tempat paket disimpan (biasanya di /usr/local/share/dotnet/store di macOS/Linux dan C:/Program Files/dotnet/store di Windows). Di bawah direktori ini, ada subdirektori untuk arsitektur dan kerangka kerja target. Tata letak file mirip dengan cara aset NuGet ditata pada disk:

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

File manifes target mencantumkan paket di penyimpanan paket runtime. Pengembang dapat menargetkan manifes ini saat menerbitkan aplikasi mereka. Manifes target biasanya disediakan oleh pemilik lingkungan produksi yang ditargetkan.

Menyiapkan lingkungan runtime

Administrator lingkungan runtime dapat mengoptimalkan aplikasi untuk penyebaran yang lebih cepat dan penggunaan ruang disk yang lebih rendah dengan membangun penyimpanan paket runtime dan manifes target yang sesuai.

Langkah pertama adalah membuat manifes penyimpanan paket yang mencantumkan paket yang menyusun penyimpanan paket runtime. Format file ini kompatibel dengan format file proyek (csproj).

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

Contoh

Contoh manifes penyimpanan paket berikut (packages.csproj) digunakan untuk menambahkan Newtonsoft.Json dan Moq ke penyimpanan paket runtime:

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

Provisikan penyimpanan paket runtime dengan mengeksekusi dotnet store dengan manifes penyimpanan paket, runtime, dan kerangka kerja:

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

Contoh

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

Anda dapat meneruskan beberapa jalur manifes penyimpanan paket target ke satu dotnet store perintah dengan mengulangi opsi dan jalur dalam perintah.

Secara default, output perintah adalah penyimpanan paket di bawah subdirektori .dotnet/store profil pengguna. Anda dapat menentukan lokasi lain menggunakan --output <OUTPUT_DIRECTORY> opsi . Direktori akar penyimpanan berisi manifes target artifact.xml file. File ini dapat dibuat tersedia untuk diunduh dan digunakan oleh penulis aplikasi yang ingin menargetkan penyimpanan ini saat menerbitkan.

Contoh

File artifact.xml berikut diproduksi setelah menjalankan contoh sebelumnya. Perhatikan bahwa Castle.Core adalah dependensi dari Moq, sehingga disertakan secara otomatis dan muncul dalam file manifes 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>

Menerbitkan aplikasi terhadap manifes target

Jika Anda memiliki file manifes target di disk, Anda menentukan jalur ke file saat menerbitkan aplikasi Anda dengan dotnet publish perintah :

dotnet publish --manifest <PATH_TO_MANIFEST_FILE>

Contoh

dotnet publish --manifest manifest.xml

Anda menyebarkan aplikasi yang diterbitkan yang dihasilkan ke lingkungan yang memiliki paket yang dijelaskan dalam manifes target. Gagal melakukannya mengalihkan aplikasi gagal dimulai.

Tentukan beberapa manifes target saat menerbitkan aplikasi dengan mengulangi opsi dan jalur (misalnya, --manifest manifest1.xml --manifest manifest2.xml). Saat Anda melakukannya, aplikasi dipangkas untuk gabungan paket yang ditentukan dalam file manifes target yang disediakan untuk perintah .

Jika Anda menyebarkan aplikasi dengan dependensi manifes yang ada dalam penyebaran (perakitan ada di folder bin ), penyimpanan paket runtime tidak digunakan pada host untuk perakitan tersebut. Rakitan folder bin digunakan terlepas dari keberadaannya di penyimpanan paket runtime pada host.

Versi dependensi yang ditunjukkan dalam manifes harus cocok dengan versi dependensi di penyimpanan paket runtime. Jika Anda memiliki ketidakcocokan versi antara dependensi dalam manifes target dan versi yang ada di penyimpanan paket runtime dan aplikasi tidak menyertakan versi paket yang diperlukan dalam penyebarannya, aplikasi gagal dimulai. Pengecualian mencakup nama manifes target yang menyerukan perakitan penyimpanan paket runtime, yang membantu Anda memecahkan masalah ketidakcocokan.

Saat penyebaran dipangkas saat diterbitkan, hanya versi tertentu dari paket manifes yang Anda tunjukkan yang ditahan dari output yang diterbitkan. Paket pada versi yang ditunjukkan harus ada di host agar aplikasi dapat dimulai.

Menentukan manifes target dalam file proyek

Alternatif untuk menentukan manifes target dengan dotnet publish perintah adalah menentukannya dalam file proyek sebagai daftar jalur yang dipisahkan titik koma di bawah <tag TargetManifestFiles> .

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

Tentukan manifes target dalam file proyek hanya ketika lingkungan target untuk aplikasi terkenal, seperti untuk proyek .NET Core. Ini bukan kasus untuk proyek sumber terbuka. Pengguna proyek sumber terbuka biasanya menyebarkannya ke lingkungan produksi yang berbeda. Lingkungan produksi ini umumnya memiliki set paket yang berbeda yang telah diinstal sebelumnya. Anda tidak dapat membuat asumsi tentang manifes target di lingkungan tersebut--manifest, jadi Anda harus menggunakan opsi .dotnet publish

penyimpanan implisit ASP.NET Core (hanya.NET Core 2.0)

Penyimpanan implisit ASP.NET Core hanya berlaku untuk ASP.NET Core 2.0. Kami sangat menyarankan aplikasi menggunakan ASP.NET Core 2.1 dan yang lebih baru, yang tidak menggunakan penyimpanan implisit. ASP.NET Core 2.1 dan yang lebih baru menggunakan kerangka kerja bersama.

Untuk .NET Core 2.0, fitur penyimpanan paket runtime digunakan secara implisit oleh aplikasi ASP.NET Core saat aplikasi disebarkan sebagai aplikasi penyebaran yang bergantung pada kerangka kerja. Target termasuk Microsoft.NET.Sdk.Web manifes yang mereferensikan penyimpanan paket implisit pada sistem target. Selain itu, aplikasi yang bergantung pada kerangka kerja apa pun yang bergantung pada Microsoft.AspNetCore.All paket menghasilkan aplikasi yang diterbitkan yang hanya berisi aplikasi dan asetnya dan bukan paket yang tercantum dalam Microsoft.AspNetCore.All metapackage. Diasumsikan bahwa paket-paket tersebut ada pada sistem target.

Penyimpanan paket runtime diinstal pada host saat .NET SDK diinstal. Penginstal lain dapat menyediakan penyimpanan paket runtime, termasuk penginstalan Zip/tarball dari .NET SDK, apt-get, Red Hat Yum, bundel .NET Core Windows Server Hosting, dan penginstalan penyimpanan paket runtime manual.

Saat menyebarkan aplikasi penyebaran yang bergantung pada kerangka kerja, pastikan bahwa lingkungan target telah menginstal .NET SDK. Jika aplikasi disebarkan ke lingkungan yang tidak menyertakan ASP.NET Core, Anda dapat memilih keluar dari penyimpanan implisit dengan menentukan <PublishWithAspNetCoreTargetManifest> yang diatur ke false dalam file proyek seperti dalam contoh berikut:

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

Catatan

Untuk aplikasi penyebaran mandiri, diasumsikan bahwa sistem target tidak selalu berisi paket manifes yang diperlukan. Oleh karena itu, <PublishWithAspNetCoreTargetManifest> tidak dapat diatur ke true untuk aplikasi mandiri.

Lihat juga