.NET dağıtım paketleme

.NET 5 (ve .NET Core) ve sonraki sürümleri giderek daha fazla platformda kullanılabilir hale geldikçe, bunu kullanan uygulama ve kitaplıkları paketlemeyi, adlandırmayı ve sürüm yapmayı öğrenmek yararlı olur. Bu şekilde, paket bakımcıları kullanıcıların .NET'i nerede çalıştırmayı seçtiklerine bakılmaksızın tutarlı bir deneyim sağlamaya yardımcı olabilir. Bu makale şu kullanıcılar için kullanışlıdır:

  • Kaynaktan .NET derlemeye çalışılıyor.
  • .NET CLI'da sonuçta elde edilen düzeni veya üretilen paketleri etkileyebilecek değişiklikler yapmak isteme.

Disk düzeni

.NET yüklendiğinde, dosya sisteminde aşağıdaki gibi yerleştirilmiş birkaç bileşenden oluşur:

{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} , tüm .NET ana ve ikincil sürümleri için paylaşılan bir kök. Birden çok çalışma zamanı yüklenirse, {dotnet_root} klasörünü (örneğin ve {dotnet_root}/shared/Microsoft.NETCore.App/6.0.11{dotnet_root}/shared/Microsoft.NETCore.App/7.0.0) paylaşırlar. Klasörün adı {dotnet_root} sürümden bağımsız, yani basitçe dotnetolmalıdır.

  • (1) dotnet Konağın ("muxer" olarak da bilinir) iki ayrı rolü vardır: uygulamayı başlatmak için çalışma zamanını etkinleştirme ve komut göndermek için SDK'yı etkinleştirme. Ana bilgisayar yerel bir yürütülebilir dosyadır (dotnet.exe).

Tek bir konak olsa da, diğer bileşenlerin çoğu sürüm dizinlerindedir (2,3,5,6). Bu, yan yana yüklendiklerine göre sistemde birden çok sürümün bulunabileceği anlamına gelir.

  • (2) host/fxr/<fxr sürümü> , konak tarafından kullanılan çerçeve çözümleme mantığını içerir. Konak, yüklenen en son hostfxr'ı kullanır. Hostfxr, bir .NET uygulamasını yürütürken uygun çalışma zamanını seçmekten sorumludur. Örneğin, .NET 7.0.0 için oluşturulan bir uygulama kullanılabilir olduğunda 7.0.5 çalışma zamanını kullanır. Benzer şekilde, hostfxr geliştirme sırasında uygun SDK'yı seçer.

  • (3) sdk/<sdk sürümü> SDK ("araç" olarak da bilinir), .NET kitaplıkları ve uygulamaları yazmak ve oluşturmak için kullanılan bir dizi yönetilen araçtır. SDK.NET CLI'yı, yönetilen dil derleyicilerini, MSBuild'i ve ilişkili derleme görevlerini ve hedeflerini, NuGet'i, yeni proje şablonlarını vb. içerir.

  • (4) sdk-manifests/<sdk özellik bandı sürümü> İsteğe bağlı bir iş yükü yüklemesinin gerektirdiği varlıkların adları ve sürümleri bu klasörde depolanan iş yükü bildirimlerinde tutulur. Klasör adı, SDK'nın özellik bandı sürümüdür. Bu nedenle, 7.0.102 gibi bir SDK sürümü için bu klasör yine de 7.0.100 olarak adlandırılabilir. Bir iş yükü yüklendiğinde, iş yükünün varlıkları için gereken şekilde aşağıdaki klasörler oluşturulur: kitaplık paketleri, meta veriler ve şablon paketleri. bir dağıtım, iş yüklerinin dotnet klasörü yerine bir kullanıcı yolu altına yüklenmesi gerekiyorsa boş bir /metadata/workloads</sdkfeatureband>/userlocal dosyası oluşturabilir. Daha fazla bilgi için bkz. GitHub sorunu dotnet/installer#12104.

Paylaşılan klasör çerçeveler içerir. Paylaşılan çerçeve, farklı uygulamalar tarafından kullanılabilmesi için merkezi bir konumda bir kitaplık kümesi sağlar.

  • (5) shared/Microsoft.NETCore.App/<runtime sürümü> Bu çerçeve .NET çalışma zamanını ve desteklenen yönetilen kitaplıkları içerir.

  • (6) shared/Microsoft.AspNetCore.{ App,All}/<aspnetcore sürümü> ASP.NET Core kitaplıklarını içerir. altındaki Microsoft.AspNetCore.App kitaplıklar .NET projesinin bir parçası olarak geliştirilir ve desteklenir. altındaki Microsoft.AspNetCore.All kitaplıklar, üçüncü taraf kitaplıkları da içeren bir üst kümedir.

  • (7) shared/Microsoft.Desktop.App/<desktop uygulaması sürümü> Windows masaüstü kitaplıklarını içerir. Bu, Windows dışı platformlara dahil değildir.

  • (8) LICENSE.txt,ThirdPartyNotices.txt sırasıyla .NET'te kullanılan üçüncü taraf kitaplıklarının .NET lisansı ve lisanslarıdır.

  • (9,10) dotnet.1.gz, dotnetdotnet.1.gz el ile dotnet sayfasıdır. dotnet , dotnet konağına (1) bir symlink'tir. Bu dosyalar, sistem tümleştirmesi için iyi bilinen konumlara yüklenir.

  • (11,12) Microsoft.NETCore.App.Ref,Microsoft.AspNetCore.App.Ref sırasıyla .NET ve ASP.NET Core sürümlerinin API'sini x.y açıklar. Bu paketler, bu hedef sürümler için derleme yaparken kullanılır.

  • (13) Microsoft.NETCore.App.Host.<rid> , platformu ridiçin yerel bir ikili içerir. Bu ikili, bir .NET uygulamasını bu platform için yerel bir ikili dosyaya derlerken bir şablondur.

  • (14) Microsoft.WindowsDesktop.App.Ref , Windows Masaüstü uygulamalarının API'sini x.y açıklar. Bu dosyalar bu hedef için derlenirken kullanılır. Bu, Windows dışı platformlarda sağlanmamıştır.

  • (15) NETStandard.Library.Ref , netstandard x.y API'sini açıklar. Bu dosyalar bu hedef için derlenirken kullanılır.

  • (16) /etc/dotnet/install_location için {dotnet_root}tam yolu içeren bir dosyadır. Yol yeni bir satırla bitebilir. Kök /usr/share/dotnetolduğunda bu dosyayı eklemek gerekli değildir.

  • (17) şablonları SDK tarafından kullanılan şablonları içerir. Örneğin, dotnet new burada proje şablonlarını bulur.

  • (18) Microsoft.NETCore.App.Runtime.<rid>/<runtime sürümü,Microsoft.AspNetCore.App.Runtime>.<rid>/<aspnetcore sürümü> Bu dosyalar bağımsız uygulamalar oluşturmaya olanak tanır. Bu dizinler (2), (5) ve (6) içindeki dosyalara sembolik bağlantılar içerir.

ile (*) işaretlenmiş klasörler birden çok paket tarafından kullanılır. Bazı paket biçimleri (örneğin, rpm) bu tür klasörlerin özel işlenmesini gerektirir. Paket bakımcısı bununla ilgilenmelidir.

.NET sürüm oluşturma, çalışma zamanı bileşeni [major].[minor] sürüm numaralarını temel alır. SDK sürümü aynı [major].[minor] kullanır ve SDK için özellik ve düzeltme eki semantiğini birleştiren bağımsız [patch] bir sürüme sahiptir. Örneğin: SDK sürüm 7.0.302, SDK'nın 7.0 çalışma zamanını destekleyen üçüncü özellik sürümünün ikinci düzeltme eki sürümüdür. Sürüm oluşturmanın nasıl çalıştığı hakkında daha fazla bilgi için bkz . .NET sürümüne genel bakış.

Paketlerden bazıları, sürüm numarasının bir kısmını kendi adlarına ekler. Bu, belirli bir sürümü yüklemenize olanak tanır. Sürümün geri kalanı sürüm adına dahil değildir. Bu, işletim sistemi paket yöneticisinin paketleri güncelleştirmesine olanak tanır (örneğin, güvenlik düzeltmelerini otomatik olarak yükler). Desteklenen paket yöneticileri Linux'a özeldir.

Önerilen paketler aşağıda listelenmiştir:

  • dotnet-sdk-[major].[minor] - Belirli bir çalışma zamanı için en son SDK'yi yükler

    • Sürüm:<sdk sürümü>
    • Örnek: dotnet-sdk-7.0
    • şunları içerir: (3),(4),(18)
    • Bağımlılıklar: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] - Belirli bir ASP.NET Core çalışma zamanını yükler

    • Sürüm:<aspnetcore çalışma zamanı sürümü>
    • Örnek: aspnetcore-runtime-7.0
    • İçerir: (6)
    • Bağımlılıklardotnet-runtime-[major].[minor]:
  • dotnet-runtime-deps-[major].[minor](İsteğe bağlı) - Bağımsız uygulamaları çalıştırmak için bağımlılıkları yükler

    • Sürüm:<çalışma zamanı sürümü>
    • Örnek: dotnet-runtime-deps-7.0
    • Bağımlılıklar:dağıtıma özgü bağımlılıklar
  • dotnet-runtime-[major].[minor] - Belirli bir çalışma zamanını yükler

    • Sürüm:<çalışma zamanı sürümü>
    • Örnek: dotnet-runtime-7.0
    • İçerir: (5)
    • Bağımlılıklar:dotnet-hostfxr-[major].[minor], dotnet-runtime-deps-[major].[minor]
  • dotnet-hostfxr-[major].[minor] -Bağımlılık

    • Sürüm:<çalışma zamanı sürümü>
    • Örnek: dotnet-hostfxr-7.0
    • İçerir: (2)
    • Bağımlılıklardotnet-host:
  • dotnet-host -Bağımlılık

    • Sürüm:<çalışma zamanı sürümü>
    • Örnek: dotnet-host
    • şunları içerir: (1),(8),(9),(10),(16)
  • dotnet-apphost-pack-[major].[minor] -Bağımlılık

    • Sürüm:<çalışma zamanı sürümü>
    • İçer: (13)
  • dotnet-targeting-pack-[major].[minor] - En son olmayan çalışma zamanını hedeflemeye izin verir

    • Sürüm:<çalışma zamanı sürümü>
    • İçerir: (12)
  • aspnetcore-targeting-pack-[major].[minor] - En son olmayan çalışma zamanını hedeflemeye izin verir

    • Sürüm:<aspnetcore çalışma zamanı sürümü>
    • İçerir: (11)
  • netstandard-targeting-pack-[netstandard_major].[netstandard_minor] - Netstandard sürümünü hedeflemeye izin verir

    • Sürüm:<sdk sürümü>
    • İçerir: (15)
  • dotnet-templates-[major].[minor]

    • Sürüm:<sdk sürümü>
    • İçerir: (17)

Aşağıdaki iki meta paket isteğe bağlıdır. Üst düzey paketi (dotnet-sdk) soyutlamaları nedeniyle son kullanıcılar için değer getirir ve bu da tüm .NET paketlerinin yüklenmesini basitleştirir. Bu meta paketleri belirli bir .NET SDK sürümüne başvurur.

  • dotnet[major] - Belirtilen SDK sürümünü yükler

    • Sürüm:<sdk sürümü>
    • Örnek: dotnet7
    • Bağımlılıklardotnet-sdk-[major].[minor]:
  • dotnet - Dağıtımlar tarafından birincil sürüm olarak belirlenen belirli bir SDK sürümünü (genellikle en son kullanılabilir sürüm) yükler

    • Sürüm:<sdk sürümü>
    • Örnek: dotnet
    • Bağımlılıklardotnet-sdk-[major].[minor]:

dağıtıma dotnet-runtime-deps-[major].[minor] özgü bağımlılıkların anlaşılmasını gerektirir. Dağıtım derleme sistemi bunu otomatik olarak türetebileceğinden, paket isteğe bağlıdır ve bu durumda bu bağımlılıklar doğrudan pakete dotnet-runtime-[major].[minor] eklenir.

Paket içeriği sürümlenmiş bir klasörün altında olduğunda, paket adı [major].[minor] sürümlenmiş klasör adıyla eşleşilir. dışındaki netstandard-targeting-pack-[netstandard_major].[netstandard_minor]tüm paketler için bu, .NET sürümüyle de eşleşir.

Paketler arasındaki bağımlılıklar sürüm gereksinimine eşit veya ondan büyük olmalıdır. Örneğin, dotnet-sdk-7.0:7.0.401 gerektirir aspnetcore-runtime-7.0 >= 7.0.6. Bu, kullanıcının yüklemesini bir kök paket (örneğin, dnf update dotnet-sdk-7.0) aracılığıyla yükseltmesini mümkün kılar.

Çoğu dağıtım, tüm yapıtların kaynaktan derlenmesini gerektirir. Bunun paketler üzerinde bazı etkileri vardır:

  • altındaki shared/Microsoft.AspNetCore.All üçüncü taraf kitaplıkları kaynaktan kolayca oluşturulamaz. Bu nedenle bu klasör paketten aspnetcore-runtime atlanır.

  • , NuGetFallbackFolder dosyasından nuget.orgikili yapıtlar kullanılarak doldurulur. Boş kalmalıdır.

Birden çok dotnet-sdk paket için NuGetFallbackFolderaynı dosyaları sağlayabilir. Paket yöneticisiyle ilgili sorunları önlemek için bu dosyaların aynı olması gerekir (sağlama toplamı, değişiklik tarihi vb.).

Paketlerde hata ayıklama

Hata ayıklama içeriği, bu makalede daha önce açıklanan .NET paket bölme işlemini izleyen hata ayıklama adlı paketlerde paketlenmelidir. Örneğin, paket için dotnet-sdk-[major].[minor] hata ayıklama içeriği adlı dotnet-sdk-dbg-[major].[minor]bir pakete eklenmelidir. Hata ayıklama içeriğini ikili dosyayla aynı konuma yüklemeniz gerekir.

Aşağıda birkaç ikili örnek verilmiştir:

Dizininde {dotnet_root}/sdk/<sdk version> aşağıdaki iki dosya beklenir:

  • dotnet.dll - paketle dotnet-sdk-[major].[minor] birlikte yüklendi
  • dotnet.pdb - paketle dotnet-sdk-dbg-[major].[minor] birlikte yüklendi

Dizininde {dotnet_root}/shared/Microsoft.NETCore.App/<runtime version> aşağıdaki iki dosya beklenir:

  • System.Text.Json.dll - paketle dotnet-runtime-[major].[minor] birlikte yüklendi
  • System.Text.Json.pdb - paketle dotnet-runtime-dbg-[major].[minor] birlikte yüklendi

Dizininde {dotnet_root/shared/Microsoft.AspNetCore.App/<aspnetcore version> aşağıdaki iki dosya beklenir:

  • Microsoft.AspNetCore.Routing.dll - paketlerle aspnetcore-runtime-[major].[minor] birlikte yüklenir
  • Microsoft.AspNetCore.Routing.pdb - paketlerle aspnetcore-runtime-dbg-[major].[minor] birlikte yüklenir

.NET 8.0'dan başlayarak, kaynak derlemesi tarafından üretilen tüm .NET hata ayıklama içeriği (PDB dosyaları) adlı dotnet-symbols-sdk-<version>-<rid>.tar.gzbir tarball'da kullanılabilir. Bu arşiv, .NET SDK tarball - dotnet-sdk-<version>-<rid>.tar.gzdizin yapısıyla eşleşen alt dizinlerdeki PDB'leri içerir.

Tüm hata ayıklama içeriği hata ayıklama tarball'ında kullanılabilir olsa da, tüm hata ayıklama içeriği aynı derecede önemli değildir. Son kullanıcılar çoğunlukla ve shared/Microsoft.NETCore.App/<runtime version> dizinlerinin içeriğiyle shared/Microsoft.AspNetCore.App/<aspnetcore version> ilgilenir.

altındaki sdk/<sdk version> SDK içeriği .NET SDK araç kümelerinin hatalarını ayıklamak için kullanışlıdır.

Aşağıdaki paketler önerilen hata ayıklama paketleridir:

  • aspnetcore-runtime-dbg-[major].[minor] - Belirli bir ASP.NET Core çalışma zamanı için hata ayıklama içeriği yükler

    • Sürüm:<aspnetcore çalışma zamanı sürümü>
    • Örnek: aspnetcore-runtime-dbg-8.0
    • İçerir: (6) için içerikte hata ayıklama
    • Bağımlılıklaraspnetcore-runtime-[major].[minor]:
  • dotnet-runtime-dbg-[major].[minor] - Belirli bir çalışma zamanı için hata ayıklama içeriği yükler

    • Sürüm:<çalışma zamanı sürümü>
    • Örnek: dotnet-runtime-dbg-8.0
    • İçerir: (5) için içerikte hata ayıklama
    • Bağımlılıklardotnet-runtime-[major].[minor]:

Aşağıdaki hata ayıklama paketi isteğe bağlıdır:

  • dotnet-sdk-dbg-[major].[minor] - Belirli bir SDK sürümü için hata ayıklama içeriği yükler
    • Sürüm:<sdk sürümü>
    • Örnek: dotnet-sdk-dbg-8.0
    • İçerir: (3),(4),(18) için hata ayıklama içeriği
    • Bağımlılıklardotnet-sdk-[major].[minor]:

Hata ayıklama tarball'ı altında, altındaki packssharediçeriğin kopyalarını temsil eden bazı hata ayıklama içeriği de içerir. .NET düzeninde packs dizin, .NET uygulamaları oluşturmak için kullanılır. Hata ayıklama senaryosu olmadığından, hata ayıklama içeriğini packs hata ayıklama tarball içinde paketlememelisiniz.

Paket oluşturma

dotnet/source-build deposu, .NET SDK'sının ve tüm bileşenlerinin kaynak tarball'unu oluşturma yönergelerini sağlar. Kaynak derleme deposunun çıkışı, bu makalenin ilk bölümünde açıklanan düzen ile eşleşir.