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)
├── dnx                          (22)
├── LICENSE.txt                  (8)
├── ThirdPartyNotices.txt        (8)
├── host                                          (*)
│   └── fxr                                       (*)
│       └── <fxr version>        (2)
├── sdk                                           (*)
│   └── <sdk version>            (3)
├── sdk-manifests                (4)              (*)
│   └── <sdk feature band version>
├── library-packs                (21)             (*)
├── 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)
│   ├── runtime.<rid>.Microsoft.DotNet.ILCompiler (*)
│   │   └── <runtime version>            (19)
│   └── Microsoft.NETCore.App.Runtime.NativeAOT.<rid> (*)
│       └── <runtime version>            (20)
├── 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)
        └── dnx                  (23)
  • (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 tidak tergantung versi, artinya cukup dotnet.

  • (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).

  • (22) dnxdnx Skrip ini adalah skrip shell yang dapat dieksekusi dengan tujuan melanjutkan perintah pengguna ke dotnet dnx perintah di dalam SDK. Fungsionalitas ini terutama ada untuk membuat memperoleh dan meluncurkan berbagai jenis aplikasi .NET, seperti .NET Tools, lebih mudah bagi pengguna akhir. Anggap saja mirip dengan npx perintah dari Node. Ini independen dari versi karena sebagian besar fungsi aktual dari dnx proses eksekusi sekali jalan ditangani dalam dotnet implementasi CLI di direktori SDK versi.

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) host/fxr/< versi fxr> berisi logika penentuan framework yang digunakan oleh host. Host menggunakan versi hostfxr terbaru yang telah 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) sdk/<versi sdk> SDK (juga dikenal sebagai "peralatan") 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) sdk-manifests/<versi pita fitur sdk> Nama dan versi aset yang diperlukan oleh penginstalan beban kerja opsional dicantumkan dalam manifes beban kerja yang tersimpan di 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: metadata dan paket templat. Distribusi dapat membuat file kosong /metadata/workloads/<sdkfeatureband>/userlocal jika beban kerja harus diinstal dalam 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) shared/Microsoft.NETCore.App/<runtime version> Kerangka kerja ini mencakup runtime .NET dan pustaka terkelola yang mendukung.

  • (6) shared/Microsoft.AspNetCore.{App,All}/<aspnetcore> berisi pustaka ASP.NET Core. Pustaka di bawah Microsoft.AspNetCore.App dikembangkan dan didukung sebagai bagian dari proyek .NET. Pustaka di bawah Microsoft.AspNetCore.All adalah superset yang juga berisi pustaka pihak ketiga.

  • (7) shared/Microsoft.Desktop.App/<versi aplikasi 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, 23) dotnet.1.gz, dotnetdotnet.1.gz adalah halaman manual dotnet. dotnet adalah symlink ke host dotnet(1). dnx adalah link simbolis ke skrip shell dnx (22). 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.<rid>/<versi runtime>,Microsoft.AspNetCore.App.Runtime.<rid>/<versi aspnetcore> File-file ini memungkinkan pembuatan aplikasi mandiri. Direktori ini berisi tautan simbolis ke file dalam (2), (5) dan (6).

  • (19) runtime.<rid>.Microsoft.DotNet.ILCompiler/<versi runtime> File ini memungkinkan pembuatan aplikasi NativeAOT pada platform target. Di .NET 9, memungkinkan pembuatan aplikasi NativeAOT untuk platform target juga. Mungkin ada di .NET 9 dan yang lebih baru.

  • (20) Microsoft.NETCore.App.Runtime.NativeAOT.<rid>/<versi runtime> File ini memungkinkan pembuatan aplikasi NativeAOT untuk platform target. Mungkin ada di .NET 10 dan yang lebih baru.

  • (21) library-packs berisi file paket NuGet. SDK dikonfigurasi untuk menggunakan folder ini sebagai sumber NuGet. Daftar paket NuGet yang disediakan oleh build .NET dijelaskan di bawah ini.

Folder yang ditandai dengan (*) digunakan oleh beberapa paket. Beberapa format paket (misalnya, rpm) memerlukan penanganan khusus folder tersebut. Pengelola paket harus mengurus hal ini.

File paket yang ditambahkan ke library-packs (21) dapat berupa paket yang tidak didistribusikan Microsoft untuk platform target. File juga dapat menjadi paket-paket yang didistribusikan oleh Microsoft dan dimana library-packs menyediakan paket yang dibangun dari kode sumber untuk memenuhi pedoman distribusi paket platform. Paket berikut disertakan oleh build .NET:

Nama paket Diterbitkan oleh Microsoft Diperlukan untuk
Microsoft.DotNet.ILCompiler.<version>.nupkg
Microsoft.NET.ILLink.Tasks.<version>.nupkg
NativeAOT

Penerapan versi .NET didasarkan pada nomor versi komponen [major].[minor] runtime. Versi SDK menggunakan versi yang sama [major].[minor] dan memiliki [patch] independen yang menggabungkan fitur dan semantik 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),(21)
    • 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]
  • dotnet-sdk-aot-[major].[minor] - Menginstal komponen SDK untuk platform NativeAOT

    • Versi:<versi sdk>
    • Contoh: dotnet-sdk-aot-9.0
    • Berisi: (19, 20)
    • Dependensi:dotnet-sdk-[major].[minor], toolchain pengompilasi dan paket pengembang untuk pustaka yang diperlukan oleh runtime .NET
  • aspnetcore-runtime-[major].[minor] - Menginstal runtime ASP.NET Core tertentu

    • Versi:<aspnetcore runtime versi>
    • 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),(22),(23)
  • 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:<aspnetcore runtime versi>
    • 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]

Memahami dotnet-runtime-deps-[major].[minor] membutuhkan pemahaman tentang dependensi yang spesifik untuk 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 dengan 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 dari aspnetcore-runtime paket.

  • NuGetFallbackFolder diisi dengan menggunakan artefak biner dari nuget.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 file biner.

Berikut adalah beberapa contoh biner:

Dalam direktori {dotnet_root}/sdk/<sdk version>, diharapkan ada dua file berikut:

  • dotnet.dll - diinstal dengan dotnet-sdk-[major].[minor] paket
  • dotnet.pdb - diinstal dengan dotnet-sdk-dbg-[major].[minor] paket

Dalam direktori {dotnet_root}/shared/Microsoft.NETCore.App/<runtime version>, dua file berikut diharapkan:

  • System.Text.Json.dll - diinstal dengan dotnet-runtime-[major].[minor] paket
  • System.Text.Json.pdb - diinstal dengan dotnet-runtime-dbg-[major].[minor] paket

Di dalam direktori {dotnet_root/shared/Microsoft.AspNetCore.App/<aspnetcore version>, dua file berikut diharuskan:

  • Microsoft.AspNetCore.Routing.dll - diinstal dengan paket aspnetcore-runtime-[major].[minor]
  • Microsoft.AspNetCore.Routing.pdb - diinstal dengan aspnetcore-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 memiliki tingkat kepentingan yang sama. 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 perangkat lunak

Repositori dotnet/source-build menyediakan instruksi tentang cara membangun tarball sumber dari .NET SDK dan semua komponennya. Hasil keluaran repositori build dari sumber sesuai dengan susunan yang dijelaskan di bagian pertama artikel ini.