Aracılığıyla paylaş


Çalışma zamanı paket mağazası

Uyarı

Çalışma zamanı paket deposu özelliği artık desteklenmiyor veya etkin geliştirme aşamasında değil. dotnet store Komut hala mevcut olsa da ,NET 6 ve sonraki sürümleriyle ilgili bilinen sorunlar vardır ve kullanılması önerilmez. .NET ekibi sonunda bu komutun gönderilmesini tamamen durdurmayı planlıyor. Daha fazla bilgi için bkz. GitHub sorunu #24752.

.NET Core 2.0'dan başlayarak, uygulamaları hedef ortamda bulunan bilinen bir paket kümesine göre paketlemek ve dağıtmak mümkündü. Amaçlanan avantajlar daha hızlı dağıtımlar, düşük disk alanı kullanımı ve bazı durumlarda geliştirilmiş başlangıç performansıydı. Ancak bu özellik artık kullanım dışı bırakılmıştır.

Bu özellik, diskte paketlerin depolandığı bir dizin olan bir çalışma zamanı paket deposu olarak uygulanır (genellikle macOS/Linux'ta /usr/local/share/dotnet/store ve C:/Program Files/dotnet/store on Windows). Bu dizin altında, mimariler ve hedef çerçeveler için alt dizinler vardır. Dosya düzeni, NuGet varlıklarının diske yerleştirildiğindekine benzer:

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

Hedef bildirim dosyası, çalışma zamanı paket deposundaki paketleri listeler. Geliştiriciler, uygulamalarını yayımlarken bu bildirimi hedefleyebilir. Hedef bildirim genellikle hedeflenen üretim ortamının sahibi tarafından sağlanır.

Çalışma ortamı hazırlama

Çalışma zamanı ortamının yöneticisi, bir çalışma zamanı paket deposu ve ilgili hedef bildirimi oluşturarak uygulamaları daha hızlı dağıtımlar ve daha düşük disk alanı kullanımı için iyileştirebilir.

İlk adım, çalışma zamanı paket depolarını oluşturan paketleri listeleyen bir paket deposu bildirimi oluşturmaktır. Bu dosya biçimi proje dosya biçimi (csproj) ile uyumludur.

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

Örnek

Bir çalışma zamanı paket deposuna ve Newtonsoft.Json eklemek için aşağıdaki örnek paket deposu manifestosu (Moq) kullanılır.

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

Uyarı

Eksik çapraz bağımlılıklar nedeniyle .NET 6 ve sonraki sürümlerde aşağıdaki komutlar başarısız olabilir. Geçici çözümde --skip-optimization bile, oluşturulan bildirimler düzgün çalışmayabilir.

Paket depo manifestini, çalışma zamanı ve çerçeve ile yürüterek dotnet store çalışma zamanı paket deposunu yapılandırın.

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

Örnek

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

.NET 6+ için geçici çözüm (önerilmez)

Bu kullanım dışı bırakılmış özelliği .NET 6 veya üzeri ile kullanmanız gerekiyorsa bayrağını --skip-optimization eklemeyi deneyebilirsiniz ancak bu işlem güvenilir bir şekilde çalışmayabilir:

dotnet store --manifest packages.csproj --runtime win-x64 --framework net6.0 --skip-optimization

Komuttaki seçeneği ve yolu yineleyerek tek dotnet store bir komuta birden çok hedef paket deposu bildirim yolu geçirebilirsiniz.

Varsayılan olarak, komutun çıktısı kullanıcı profilinin .dotnet/store alt dizini altında bir paket deposudur. seçeneğini kullanarak --output <OUTPUT_DIRECTORY> farklı bir konum belirtebilirsiniz. Deponun kök dizini bir hedef bildirim artifact.xml dosyası içerir. Bu dosya indirilebilir ve yayımlama sırasında bu mağazayı hedeflemek isteyen uygulama yazarları tarafından kullanılabilir.

Örnek

Aşağıdaki artifact.xml dosyası, önceki örnek çalıştırıldıktan sonra oluşturulur. Castle.Core'nın Moq için bir bağımlılık olduğunu ve bu nedenle otomatik olarak eklendiğini, artifacts.xml bildirim dosyasında göründüğünü unutmayın.

<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>

Hedef manifest dosyasına karşı uygulama yayımlama

Dikkat

Kullanım dışı bırakılmış çalışma zamanı paket deposuyla oluşturulan hedef bildirimlere karşı yayımlama işlemi başarısız olabilir veya özellikle .NET 6 ve sonraki sürümlerde beklenmedik şekilde davranabilir.

Diskte hedef bildirim dosyanız varsa, uygulamanızı şu komutla dotnet publish yayımlarken dosyanın yolunu belirtirsiniz:

dotnet publish --manifest <PATH_TO_MANIFEST_FILE>

Örnek

dotnet publish --manifest manifest.xml

Sonuçta yayımlanan uygulamayı, hedef bildirimde açıklanan paketleri içeren bir ortama dağıtırsınız. Bunun başarısız olması, uygulamanın başlatılaamamasına neden olur.

Bir uygulamayı yayımlarken seçeneği ve yolu yineleyerek birden çok hedef bildirimi belirtin (örneğin, --manifest manifest1.xml --manifest manifest2.xml). Bunu yaptığınızda, uygulama komutuna sağlanan hedef bildirim dosyalarında belirtilen paketlerin birleşimi için kırpılır.

Dağıtımda yer alan bir bildirim bağımlılığına sahip bir uygulama dağıttığınızda (derleme bin klasöründe yer alıyorsa), çalışma zamanı paket deposu konakta bu derleme için kullanılmaz. Bin klasörü derlemesi, konaktaki çalışma zamanı paket deposundaki varlığından bağımsız olarak kullanılır.

Bildirimde belirtilen bağımlılığın sürümü, çalışma zamanı paket deposundaki bağımlılığın sürümüyle eşleşmelidir. Hedef bildirimdeki bağımlılık ile çalışma zamanı paket deposunda bulunan sürüm arasında bir sürüm uyuşmazlığınız varsa ve uygulama paketin gerekli sürümünü dağıtımında içermiyorsa, uygulama başlatılamaz. Özel durum, uyuşmazlığı gidermenize yardımcı olan çalışma zamanı paket deposu derlemesi için çağrılan hedef bildirimin adını içerir.

Dağıtım, yayımlama sırasında kırpıldığında, yalnızca belirttiğiniz manifest paketlerinin belirli sürümleri yayınlanan çıktıda tutulmaz. Uygulamanın başlatılması için belirtilen sürümlerde paketlerin konakta mevcut olması gerekir.

Proje dosyasında hedef bildirimleri belirtme

Komutuyla hedef bildirimleri belirtmenin dotnet publish bir alternatifi, bunları proje dosyasında etiketin altındaki <TargetManifestFiles> yolların noktalı virgülle ayrılmış bir listesi olarak belirtmektir.

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

Proje dosyasındaki hedef bildirimleri yalnızca uygulamanın hedef ortamı .NET Core projeleri gibi iyi biliniyorsa belirtin. Açık kaynak projelerde böyle bir durum söz konusu değildir. Açık kaynak projenin kullanıcıları genellikle bunu farklı üretim ortamlarına dağıtır. Bu üretim ortamlarında genellikle önceden yüklenmiş farklı paket kümeleri bulunur. Bu tür ortamlarda hedef bildirim hakkında varsayımlarda bulunamazsınız, bu nedenle --manifest seçeneğini dotnet publish kullanmalısınız.

ASP.NET Core varsayılan depo (.NET Core 2.0, legacy)

Uyarı

Bu bölümde yalnızca .NET Core 2.0'a uygulanan eski işlevler açıklanmaktadır. Bu özellik artık modern .NET uygulamaları için uygun değildir.

ASP.NET Core örtük deposu yalnızca ASP.NET Core 2.0'a uygulanır. Uygulamaların, örtük depoyu kullanmayan ASP.NET Core 2.1 ve sonraki sürümleri kullanmasını kesinlikle öneririz. ASP.NET Core 2.1 ve üzeri paylaşılan çerçeveyi kullanır.

.NET Core 2.0 için çalışma zamanı paket deposu özelliği, uygulama çerçeveye bağımlı bir dağıtım uygulaması olarak dağıtıldığında ASP.NET Core uygulaması tarafından örtük olarak kullanılır. İçinde yer alan Microsoft.NET.Sdk.Web hedefler, hedef sistemdeki gizli paket deposuna referans veren bildirimleri içerir. Çerçeveye bağımlı olup Microsoft.AspNetCore.All paketine bağlı olan tüm uygulamalar, yalnızca uygulamayı ve varlıklarını içeren yayımlanmış bir uygulamayla sonuçlanır ve meta pakette listelenen paketleri içermez. Bu paketlerin hedef sistemde mevcut olduğu varsayılır.

.NET SDK yüklendiğinde ana bilgisayara çalışma zamanı paket deposu kurulur. Diğer yükleyiciler .NET SDK'sının Zip/tarball yüklemeleri, , Red Hat Yum, apt-get.NET Core Windows Server Barındırma paketi ve el ile çalışma zamanı paket deposu yüklemeleri dahil olmak üzere çalışma zamanı paket deposu sağlayabilir.

Çerçeveye bağımlı bir dağıtım uygulaması dağıtırken hedef ortamda .NET SDK'sının yüklü olduğundan emin olun. Uygulama ASP.NET Core içermeyen bir ortama dağıtıldıysa, aşağıdaki örnekte olduğu gibi proje dosyasında <PublishWithAspNetCoreTargetManifest>false olarak belirterek, varsayılan depoyu devre dışı bırakabilirsiniz:

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

Uyarı

Bağımsız dağıtım uygulamaları için hedef sistemin gerekli bildirim paketlerini içermemesi gerektiği varsayılır. Bu nedenle, bağımsız bir uygulama için <PublishWithAspNetCoreTargetManifest>true olarak ayarlanamaz.

Ayrıca bakınız