Kemasan distribusi .NET
Karena .NET 5 (dan .NET Core) dan versi yang lebih baru tersedia di semakin banyak platform, berguna untuk mempelajari cara mengemas, memberi nama, dan membuat versi aplikasi dan pustaka yang menggunakannya. Dengan cara ini, pengelola paket dapat membantu memastikan pengalaman yang konsisten di mana pun pengguna memilih untuk menjalankan .NET. Artikel ini berguna untuk pengguna yang:
- Mencoba membangun .NET dari sumber.
- Ingin membuat perubahan pada .NET CLI yang dapat memengaruhi tata letak atau paket yang dihasilkan.
Tata letak disk
Saat diinstal, .NET terdiri dari beberapa komponen yang ditata sebagai berikut dalam sistem file:
{dotnet_root} (0) (*)
├── dotnet (1)
├── LICENSE.txt (8)
├── ThirdPartyNotices.txt (8)
├── host (*)
│ └── fxr (*)
│ └── <fxr version> (2)
├── sdk (*)
│ └── <sdk version> (3)
├── sdk-manifests (4) (*)
│ └── <sdk feature band version>
├── library-packs (4) (*)
├── metadata (4) (*)
│ └── workloads
│ └── <sdk feature band version>
├── template-packs (4) (*)
├── packs (*)
│ ├── Microsoft.AspNetCore.App.Ref (*)
│ │ └── <aspnetcore ref version> (11)
│ ├── Microsoft.NETCore.App.Ref (*)
│ │ └── <netcore ref version> (12)
│ ├── Microsoft.NETCore.App.Host.<rid> (*)
│ │ └── <apphost version> (13)
│ ├── Microsoft.WindowsDesktop.App.Ref (*)
│ │ └── <desktop ref version> (14)
│ ├── NETStandard.Library.Ref (*)
│ │ └── <netstandard version> (15)
│ ├── Microsoft.NETCore.App.Runtime.<rid> (*)
│ │ └── <runtime version> (18)
│ └── Microsoft.AspNetCore.App.Runtime.<rid> (*)
│ └── <aspnetcore version> (18)
├── shared (*)
│ ├── Microsoft.NETCore.App (*)
│ │ └── <runtime version> (5)
│ ├── Microsoft.AspNetCore.App (*)
│ │ └── <aspnetcore version> (6)
│ ├── Microsoft.AspNetCore.All (*)
│ │ └── <aspnetcore version> (6)
│ └── Microsoft.WindowsDesktop.App (*)
│ └── <desktop app version> (7)
└── templates (*)
│ └── <templates version> (17)
/
├── etc/dotnet
│ └── install_location (16)
├── usr/share/man/man1
│ └── dotnet.1.gz (9)
└── usr/bin
└── dotnet (10)
(0) {dotnet_root} adalah akar bersama untuk semua versi utama dan minor .NET. Jika beberapa runtime diinstal, mereka berbagi folder {dotnet_root} , misalnya,
{dotnet_root}/shared/Microsoft.NETCore.App/6.0.11
dan{dotnet_root}/shared/Microsoft.NETCore.App/7.0.0
. Nama{dotnet_root}
folder harus agnostik versi, yaitu, cukupdotnet
.(1) dotnet Host (juga dikenal sebagai "muxer") memiliki dua peran yang berbeda: mengaktifkan runtime untuk meluncurkan aplikasi, dan mengaktifkan SDK untuk mengirimkan perintah ke dalamnya. Host adalah executable asli (
dotnet.exe
).
Meskipun ada satu host, sebagian besar komponen lain berada dalam direktori versi (2,3,5,6). Ini berarti beberapa versi dapat ada di sistem karena diinstal secara berdampingan.
(2) versi> host/fxr/<fxr berisi logika resolusi kerangka kerja yang digunakan oleh host. Host menggunakan hostfxr terbaru yang diinstal. Hostfxr bertanggung jawab untuk memilih runtime yang sesuai saat menjalankan aplikasi .NET. Misalnya, aplikasi yang dibangun untuk .NET 7.0.0 menggunakan runtime 7.0.5 saat tersedia. Demikian pula, hostfxr memilih SDK yang sesuai selama pengembangan.
(3) versi> sdk/<sdk SDK (juga dikenal sebagai "alat") adalah sekumpulan alat terkelola yang digunakan untuk menulis dan membangun pustaka dan aplikasi .NET. SDK mencakup .NET CLI, pengkompilasi bahasa terkelola, MSBuild, dan tugas dan target build terkait, NuGet, templat proyek baru, dan sebagainya.
(4) versi> pita fitur sdk-manifests/<sdk Nama dan versi aset yang diperlukan penginstalan beban kerja opsional dipertahankan dalam manifes beban kerja yang disimpan dalam folder ini. Nama folder adalah versi pita fitur SDK. Jadi untuk versi SDK seperti 7.0.102, folder ini masih akan diberi nama 7.0.100. Saat beban kerja diinstal, folder berikut dibuat sesuai kebutuhan untuk aset beban kerja: paket pustaka, metadata, dan paket templat. Distribusi dapat membuat file /metadata/workloads/sdkfeatureband>/userlocal kosong jika beban kerja harus diinstal di bawah jalur pengguna daripada di folder dotnet.< Untuk informasi selengkapnya, lihat Masalah GitHub dotnet/installer#12104.
Folder bersama berisi kerangka kerja. Kerangka kerja bersama menyediakan sekumpulan pustaka di lokasi pusat sehingga dapat digunakan oleh aplikasi yang berbeda.
(5) versi> shared/Microsoft.NETCore.App/<runtime Kerangka kerja ini berisi runtime .NET dan mendukung pustaka terkelola.
(6) shared/Microsoft.AspNetCore.{ Versi App,All}/<aspnetcore> berisi pustaka ASP.NET Core. Pustaka di bawah
Microsoft.AspNetCore.App
dikembangkan dan didukung sebagai bagian dari proyek .NET. Pustaka di bawahMicrosoft.AspNetCore.All
adalah superset yang juga berisi pustaka pihak ketiga.(7) versi> aplikasi bersama/Microsoft.Desktop.App/<desktop berisi pustaka desktop Windows. Ini tidak termasuk pada platform non-Windows.
(8) LICENSE.txt,ThirdPartyNotices.txt adalah lisensi .NET dan lisensi pustaka pihak ketiga yang masing-masing digunakan dalam .NET.
(9,10) dotnet.1.gz, dotnet
dotnet.1.gz
adalah halaman manual dotnet.dotnet
adalah symlink ke host dotnet(1). File-file ini diinstal di lokasi terkenal untuk integrasi sistem.(11,12) Microsoft.NETCore.App.Ref,Microsoft.AspNetCore.App.Ref menjelaskan API
x.y
versi .NET dan ASP.NET Core masing-masing. Paket ini digunakan saat mengkompilasi untuk versi target tersebut.(13) Microsoft.NETCore.App.Host.<rid> berisi biner asli untuk platform
rid
. Biner ini adalah templat saat mengkompilasi aplikasi .NET ke dalam biner asli untuk platform tersebut.(14) Microsoft.WindowsDesktop.App.Ref menjelaskan API
x.y
versi aplikasi Windows Desktop. File-file ini digunakan saat mengkompilasi untuk target tersebut. Ini tidak disediakan pada platform non-Windows.(15) NETStandard.Library.Ref menjelaskan API netstandard
x.y
. File-file ini digunakan saat mengkompilasi untuk target tersebut.(16) /etc/dotnet/install_location adalah file yang berisi jalur lengkap untuk
{dotnet_root}
. Jalur mungkin berakhir dengan baris baru. Tidak perlu menambahkan file ini ketika akarnya adalah/usr/share/dotnet
.(17) templat berisi templat yang digunakan oleh SDK. Misalnya,
dotnet new
menemukan templat proyek di sini.(18) Microsoft.NETCore.App.Runtime.<versi> rid>/<runtime,Microsoft.AspNetCore.App.Runtime.<versi> rid>/<aspnetcore File-file ini memungkinkan pembuatan aplikasi mandiri. Direktori ini berisi tautan simbolis ke file dalam (2), (5) dan (6).
Folder yang ditandai dengan (*)
digunakan oleh beberapa paket. Beberapa format paket (misalnya, rpm
) memerlukan penanganan khusus folder tersebut. Pengelola paket harus mengurus hal ini.
Paket yang direkomendasikan
Penerapan versi .NET didasarkan pada nomor versi komponen [major].[minor]
runtime.
Versi SDK menggunakan hal yang sama [major].[minor]
dan memiliki independen [patch]
yang menggabungkan semantik fitur dan patch untuk SDK.
Misalnya: SDK versi 7.0.302 adalah rilis patch kedua dari rilis fitur ketiga SDK yang mendukung runtime 7.0. Untuk informasi selengkapnya tentang cara kerja penerapan versi, lihat Gambaran umum penerapan versi .NET.
Beberapa paket menyertakan bagian dari nomor versi dalam namanya. Ini memungkinkan Anda menginstal versi tertentu. Versi lainnya tidak disertakan dalam nama versi. Ini memungkinkan manajer paket OS memperbarui paket (misalnya, menginstal perbaikan keamanan secara otomatis). Manajer paket yang didukung khusus Linux.
Berikut ini mencantumkan paket yang direkomendasikan:
dotnet-sdk-[major].[minor]
- Menginstal SDK terbaru untuk runtime tertentu- Versi:<versi sdk>
- Contoh: dotnet-sdk-7.0
- Berisi: (3),(4),(18)
- Dependensi:
dotnet-runtime-[major].[minor]
, ,aspnetcore-runtime-[major].[minor]
,dotnet-targeting-pack-[major].[minor]
,aspnetcore-targeting-pack-[major].[minor]
,netstandard-targeting-pack-[netstandard_major].[netstandard_minor]
,dotnet-apphost-pack-[major].[minor]
,dotnet-templates-[major].[minor]
aspnetcore-runtime-[major].[minor]
- Menginstal runtime ASP.NET Core tertentu- Versi:<versi runtime aspnetcore>
- Contoh: aspnetcore-runtime-7.0
- Berisi: (6)
- Dependensi:
dotnet-runtime-[major].[minor]
dotnet-runtime-deps-[major].[minor]
(Opsional) - Menginstal dependensi untuk menjalankan aplikasi mandiri- Versi:<versi runtime>
- Contoh: dotnet-runtime-deps-7.0
- Dependensi: dependensi khusus distribusi
dotnet-runtime-[major].[minor]
- Menginstal runtime tertentu- Versi:<versi runtime>
- Contoh: dotnet-runtime-7.0
- Berisi: (5)
- Dependensi:
dotnet-hostfxr-[major].[minor]
,dotnet-runtime-deps-[major].[minor]
dotnet-hostfxr-[major].[minor]
-Ketergantungan- Versi:<versi runtime>
- Contoh: dotnet-hostfxr-7.0
- Berisi: (2)
- Dependensi:
dotnet-host
dotnet-host
-Ketergantungan- Versi:<versi runtime>
- Contoh: dotnet-host
- Berisi: (1),(8),(9),(10),(16)
dotnet-apphost-pack-[major].[minor]
-Ketergantungan- Versi:<versi runtime>
- Berisi: (13)
dotnet-targeting-pack-[major].[minor]
- Memungkinkan penargetan runtime non-terbaru- Versi:<versi runtime>
- Berisi: (12)
aspnetcore-targeting-pack-[major].[minor]
- Memungkinkan penargetan runtime non-terbaru- Versi:<versi runtime aspnetcore>
- Berisi: (11)
netstandard-targeting-pack-[netstandard_major].[netstandard_minor]
- Memungkinkan penargetan versi netstandard- Versi:<versi sdk>
- Berisi: (15)
dotnet-templates-[major].[minor]
- Versi:<versi sdk>
- Berisi: (17)
Dua paket meta berikut bersifat opsional. Mereka membawa nilai untuk pengguna akhir karena mereka mengabstraksi paket tingkat atas (dotnet-sdk), yang menyederhanakan penginstalan set lengkap paket .NET. Paket meta ini mereferensikan versi .NET SDK tertentu.
dotnet[major]
- Menginstal versi SDK yang ditentukan- Versi:<versi sdk>
- Contoh: dotnet7
- Dependensi:
dotnet-sdk-[major].[minor]
dotnet
- Menginstal versi SDK tertentu yang ditentukan oleh distro untuk menjadi versi utama—biasanya versi terbaru yang tersedia- Versi:<versi sdk>
- Contoh: dotnet
- Dependensi:
dotnet-sdk-[major].[minor]
Membutuhkan dotnet-runtime-deps-[major].[minor]
pemahaman dependensi khusus distro. Karena sistem build distro mungkin dapat memperoleh ini secara otomatis, paket bersifat opsional, dalam hal ini dependensi ditambahkan langsung ke dotnet-runtime-[major].[minor]
paket.
Saat konten paket berada di bawah folder versi, nama [major].[minor]
paket cocok dengan nama folder versi. Untuk semua paket, kecuali netstandard-targeting-pack-[netstandard_major].[netstandard_minor]
, ini juga cocok dengan versi .NET.
Dependensi antar paket harus menggunakan persyaratan versi yang sama atau lebih besar dari. Misalnya, dotnet-sdk-7.0:7.0.401
memerlukan aspnetcore-runtime-7.0 >= 7.0.6
. Ini memungkinkan pengguna untuk meningkatkan penginstalan mereka melalui paket root (misalnya, dnf update dotnet-sdk-7.0
).
Sebagian besar distribusi mengharuskan semua artefak dibangun dari sumber. Hal ini berdampak pada paket:
Pustaka pihak ketiga di bawah
shared/Microsoft.AspNetCore.All
tidak dapat dengan mudah dibangun dari sumber. Jadi folder tersebut dihilangkan dariaspnetcore-runtime
paket.diisi
NuGetFallbackFolder
menggunakan artefak biner darinuget.org
. Ini harus tetap kosong.
Beberapa dotnet-sdk
paket dapat menyediakan file yang sama untuk NuGetFallbackFolder
. Untuk menghindari masalah dengan manajer paket, file-file ini harus identik (checksum, tanggal modifikasi, dan sebagainya).
Paket debug
Konten debug harus dikemas dalam paket bernama debug yang mengikuti pemisahan paket .NET yang dijelaskan sebelumnya dalam artikel ini. Misalnya, konten debug untuk dotnet-sdk-[major].[minor]
paket harus disertakan dalam paket bernama dotnet-sdk-dbg-[major].[minor]
. Anda harus menginstal konten debug ke lokasi yang sama dengan biner.
Berikut adalah beberapa contoh biner:
{dotnet_root}/sdk/<sdk version>
Dalam direktori, dua file berikut diharapkan:
dotnet.dll
- diinstal dengandotnet-sdk-[major].[minor]
paketdotnet.pdb
- diinstal dengandotnet-sdk-dbg-[major].[minor]
paket
{dotnet_root}/shared/Microsoft.NETCore.App/<runtime version>
Dalam direktori, dua file berikut diharapkan:
System.Text.Json.dll
- diinstal dengandotnet-runtime-[major].[minor]
paketSystem.Text.Json.pdb
- diinstal dengandotnet-runtime-dbg-[major].[minor]
paket
{dotnet_root/shared/Microsoft.AspNetCore.App/<aspnetcore version>
Dalam direktori, dua file berikut diharapkan:
Microsoft.AspNetCore.Routing.dll
- diinstal denganaspnetcore-runtime-[major].[minor]
paketMicrosoft.AspNetCore.Routing.pdb
- diinstal denganaspnetcore-runtime-dbg-[major].[minor]
paket
Dimulai dengan .NET 8.0, semua konten debug .NET (file PDB), diproduksi oleh source-build, tersedia dalam tarball bernama dotnet-symbols-sdk-<version>-<rid>.tar.gz
. Arsip ini berisi PDB dalam subdirektori yang cocok dengan struktur direktori tarball .NET SDK - dotnet-sdk-<version>-<rid>.tar.gz
.
Meskipun semua konten debug tersedia di tarball debug, tidak semua konten debug sama pentingnya. Pengguna akhir sebagian besar tertarik pada konten shared/Microsoft.AspNetCore.App/<aspnetcore version>
direktori dan shared/Microsoft.NETCore.App/<runtime version>
.
Konten SDK di bawah sdk/<sdk version>
berguna untuk penelusuran kesalahan toolset .NET SDK.
Paket berikut adalah paket debug yang direkomendasikan:
aspnetcore-runtime-dbg-[major].[minor]
- Menginstal konten debug untuk runtime ASP.NET Core tertentu- Versi:<versi runtime aspnetcore>
- Contoh: aspnetcore-runtime-dbg-8.0
- Berisi: konten debug untuk (6)
- Dependensi:
aspnetcore-runtime-[major].[minor]
dotnet-runtime-dbg-[major].[minor]
- Menginstal konten debug untuk runtime tertentu- Versi:<versi runtime>
- Contoh: dotnet-runtime-dbg-8.0
- Berisi: konten debug untuk (5)
- Dependensi:
dotnet-runtime-[major].[minor]
Paket debug berikut bersifat opsional:
dotnet-sdk-dbg-[major].[minor]
- Menginstal konten debug untuk versi SDK tertentu- Versi:<versi sdk>
- Contoh: dotnet-sdk-dbg-8.0
- Berisi: konten debug untuk (3),(4),(18)
- Dependensi:
dotnet-sdk-[major].[minor]
Tarball debug juga berisi beberapa konten debug di bawah packs
, yang mewakili salinan konten di bawah shared
. Dalam tata letak .NET, packs
direktori digunakan untuk membangun aplikasi .NET. Tidak ada skenario penelusuran kesalahan, jadi Anda tidak boleh mengemas konten debug di bawah packs
dalam tarball debug.
Membangun paket
Repositori dotnet/source-build menyediakan instruksi tentang cara membangun tarball sumber dari .NET SDK dan semua komponennya. Output repositori build sumber cocok dengan tata letak yang dijelaskan di bagian pertama artikel ini.