Merkezi Paket Yönetimi (CPM)

Bağımlılık yönetimi, NuGet'in temel bir özelliğidir. Tek bir proje için bağımlılıkları yönetmek kolay olabilir. Çok projeli çözümler için bağımlılıkları yönetmek, boyut ve karmaşıklık ölçeğini genişletmeye başladıklarında zor olabilir. Birçok farklı proje için ortak bağımlılıkları yönettiğiniz durumlarda, tüm bunları tek bir konum kolaylığından gerçekleştirmek için NuGet'in merkezi paket yönetimi (CPM) özelliklerinden yararlanabilirsiniz.

Geçmişte NuGet paket bağımlılıkları iki konumdan birinde yönetilmiştir:

  • packages.config - Proje tarafından başvurulan paketlerin listesini korumak için eski proje türlerinde kullanılan bir XML dosyası.
  • <PackageReference /> - MSBuild projelerinde kullanılan bir XML öğesi NuGet paket bağımlılıklarını tanımlar.

NuGet 6.2'den başlayarak, projelerinizdeki bağımlılıklarınızı bir Directory.Packages.props dosya ve MSBuild özelliği oluşturduğunuzda merkezi olarak yönetebilirsiniz.

Bu özellik, aşağıdaki sürümlerden başlayarak tüm NuGet tümleşik araçlarda kullanılabilir.

Eski araçlar merkezi paket yönetimi yapılandırmalarını ve özelliklerini yoksayar. Bu özelliği en kapsamlı şekilde kullanmak için tüm derleme ortamlarınızın en son uyumlu araç sürümlerini kullandığından emin olun.

Merkezi paket yönetimi, uyumlu araçlar kullanıldığı sürece tüm <PackageReference>tabanlı MSBuild projeleri (eski CSPROJ dahil) için geçerlidir.

Merkezi Paket Yönetimini Etkinleştirme

Merkezi paket yönetimini kullanmaya başlamak için, deponuzun kökünde bir Directory.Packages.props dosya oluşturmanız ve MSBuild özelliğini ManagePackageVersionsCentrally olarak trueayarlamanız gerekir.

daha sonra, paket kimliğini ve sürümünü tanımlayan öğeleri kullanarak <PackageVersion /> projelerinizin gerekli olan ilgili paket sürümlerinin her birini tanımlarsınız.

<Project>
  <PropertyGroup>
    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
  </PropertyGroup>
  <ItemGroup>
    <PackageVersion Include="Newtonsoft.Json" Version="13.0.1" />
  </ItemGroup>
</Project>

Her proje için, sürüm ilgili <PackageVersion /> bir <PackageReference /> öğeden alınacağı için özniteliğini tanımlar ancak atlarsınızVersion.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" />
  </ItemGroup>
</Project>

Şimdi merkezi paket yönetimini kullanıyor ve sürümlerinizi merkezi bir konumda yönetiyorsunuz!

Merkezi Paket Yönetimi kuralları

Dosya Directory.Packages.props , bir deponun dizininde ve bağlamında nerede bulunduğuyla ilgili olarak bir dizi kurala sahiptir. Basitlik açısından, belirli bir proje için yalnızca Directory.Packages.props bir dosya değerlendirilir.

Bunun anlamı, deponuzda birden çok Directory.Packages.props dosya varsa projenizin dizinine en yakın dosyanın bu dosya için değerlendirileceğidir. Bu, deponuzun çeşitli düzeylerinde ek denetime olanak tanır.

Aşağıda aşağıdaki depo yapısını göz önünde bulundurarak bir örnek verilmişti:

Repository
 |-- Directory.Packages.props
 |-- Solution1
     |-- Directory.Packages.props
     |-- Project1
 |-- Solution2
     |-- Project2
  • Project1, dizindeki Repository\Solution1\ dosyayı değerlendirir Directory.Packages.props ve isterseniz sonraki dosyayı el ile içeri aktarması gerekir.
    <Project>
      <Import Project="$([MSBuild]::GetPathOfFileAbove(Directory.Packages.props, $(MSBuildThisFileDirectory)..))" />
      <ItemGroup>
        <PackageVersion Update="Newtonsoft.Json" Version="12.0.1" />
      </ItemGroup>
    </Project>
    
  • Project2, dizindeki Directory.Packages.propsRepository\ dosyayı değerlendirir.

Not: MSBuild her Directory.Packages.props birini sizin için otomatik olarak içeri aktarmaz, yalnızca projeye en yakın olanı içeri aktarır. Birden çok Directory.Packages.propsöğeniz varsa, kök Directory.Packages.props içeri aktarmazken üst öğeyi el ile içeri aktarmanız gerekir.

Kullanmaya başlayın

Deponuzu tamamen eklemek için şu adımları uygulamayı göz önünde bulundurun:

  1. Deponuzun kökünde, merkezi olarak tanımlanmış paket sürümlerinizi bildiren ve MSBuild özelliğini ManagePackageVersionsCentrallytrueolarak ayarlayan adlı Directory.Packages.props yeni bir dosya oluşturun.
  2. öğeleri içinde bildirin <PackageVersion />Directory.Packages.props.
  3. Proje dosyalarınızda öznitelikleri olmayan Version öğeleri bildirin<PackageReference />.

Merkezi paket yönetiminin nasıl görünebileceği hakkında bir fikir edinmek için örnek depomuza bakın.

Geçişli sabitleme

Geçişli sabitleme olarak bilinen bir özelliği kabul ederek, açık bir üst düzey <PackageReference /> olmadan bile geçişli paket sürümünü otomatik olarak geçersiz kılabilirsiniz. Bu, geçişli bağımlılığı gerektiğinde sizin yerinize örtük olarak üst düzey bir bağımlılık olarak yükseltmektedir.

MsBuild özelliğini CentralPackageTransitivePinningEnabledtrue bir projede veya bir veya Directory.Packages.propsDirectory.Build.props içeri aktarma dosyasında olarak ayarlayarak bu özelliği etkinleştirebilirsiniz:

<PropertyGroup>
  <CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
</PropertyGroup>

Paket sürümlerini geçersiz kılma

Bir öğedeki özelliğini kullanarak VersionOverride tek bir <PackageReference /> paket sürümünü geçersiz kılabilirsiniz. Bu, merkezi olarak tanımlanan her türlü <PackageVersion /> geçersiz kılar.

<Project>
  <ItemGroup>
    <PackageVersion Include="PackageA" Version="1.0.0" />
    <PackageVersion Include="PackageB" Version="2.0.0" />
  </ItemGroup>
</Project>
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="PackageA" VersionOverride="3.0.0" />
  </ItemGroup>
</Project>

MsBuild özelliğini bir projede veya bir veya Directory.Packages.propsDirectory.Build.props içeri aktarma dosyasında olarak ayarlayarak bu özelliği CentralPackageVersionOverrideEnabledfalse devre dışı bırakabilirsiniz:

<PropertyGroup>
  <CentralPackageVersionOverrideEnabled>false</CentralPackageVersionOverrideEnabled>
</PropertyGroup>

Bu özellik devre dışı bırakıldığında, herhangi bir <PackageReference /> öğede bir VersionOverride belirtilmesi, geri yükleme sırasında özelliğin devre dışı bırakıldığını belirten bir hataya neden olur.

Merkezi Paket Yönetimini Devre Dışı Bırakma

Belirli bir proje için merkezi paket yönetimini devre dışı bırakmak isterseniz, MSBuild özelliğini ManagePackageVersionsCentrallyfalseolarak ayarlayarak devre dışı bırakabilirsiniz:

<PropertyGroup>
  <ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally>
</PropertyGroup>

Genel Paket Başvuruları

Not

Bu özellik yalnızca Visual Studio 2022 17.4 veya üzeri, .NET SDK 7.0.100.preview7 veya üzeri ve NuGet 6.4 veya üzeri sürümlerde kullanılabilir.

Genel paket başvurusu, bir paketin depodaki her proje tarafından kullanılacağını belirtmek için kullanılır. Bu sürüm oluşturma, derlemenizi genişletme veya tüm projeler için gereken diğer paketleri içerir. Genel paket başvuruları PackageReference öğe grubuna aşağıdaki meta verilerle eklenir:

  • IncludeAssets="Runtime;Build;Native;contentFiles;Analyzers"
    Bu, paketin yalnızca geliştirme bağımlılığı olarak kullanılmasını sağlar ve derleme zamanı derleme başvurularını önler.
  • PrivateAssets="All"
    Bu, genel paket başvurularının aşağı akış bağımlılıkları tarafından alınmasını engeller.

GlobalPackageReference öğeler depodaki her proje tarafından kullanılmak üzere sizin öğelerinize Directory.Packages.props yerleştirilmelidir:

<Project>
  <ItemGroup>
    <GlobalPackageReference Include="Nerdbank.GitVersioning" Version="3.5.109" />
  </ItemGroup>
</Project>

Birden çok paket kaynağı kullanılırken uyarı

Merkezi paket yönetimini kullanırken, yapılandırmanızda tanımlanan birden fazla paket kaynağınız varsa bir NU1507 uyarı görürsünüz. Bu uyarıyı çözmek için paket kaynaklarınızı paket kaynağı eşlemesiyle eşleyin veya tek bir paket kaynağı belirtin.

There are 3 package sources defined in your configuration. When using central package management, please map your package sources with package source mapping (https://aka.ms/nuget-package-source-mapping) or specify a single package source.

Not

Merkezi paket yönetimi etkin geliştirme aşamasındadır. Bunu denemeniz ve NuGet/Home'da sahip olabileceğiniz geri bildirimleri sağladığınız için teşekkür ederiz.