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 true
ayarlamanı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ğerlendirirDirectory.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.props
Repository\
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:
- Deponuzun kökünde, merkezi olarak tanımlanmış paket sürümlerinizi bildiren ve MSBuild özelliğini
ManagePackageVersionsCentrally
true
olarak ayarlayan adlıDirectory.Packages.props
yeni bir dosya oluşturun. - öğeleri içinde bildirin
<PackageVersion />
Directory.Packages.props
. - 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 CentralPackageTransitivePinningEnabled
true
bir projede veya bir veya Directory.Packages.props
Directory.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.props
Directory.Build.props
içeri aktarma dosyasında olarak ayarlayarak bu özelliği CentralPackageVersionOverrideEnabled
false
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 ManagePackageVersionsCentrally
false
olarak 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.