NuGet paket çakışması teşhis edilirken ilk adım hemen sürüm değiştirmek değil, hata veya uyarı metnini sınıflandırmaktır. Paket adı, istenen ve çözümlenen sürümler, hatanın oluştuğu proje ve hedef framework ayrıştırıldığında sorunun doğrudan referanstan mı, transitif bağımlılıktan mı, framework uyumsuzluğundan mı yoksa çalışma zamanı yüklemesinden mi kaynaklandığı daha net görünür.
Pratik sıra şöyledir: hata metnini değiştirmeden kaydedin, ilgili .csproj dosyasını belirleyin, son paket değişikliğini not edin ve ardından yalnızca sorunun türüne uygun kontrol noktasına ilerleyin. Bu yaklaşım, rastgele paket yükseltmek veya sürüm düşürmek yerine en küçük değişiklikle güvenli bir çözüm aramanızı sağlar.
NuGet Çakışmasını Önce Hata Mesajından Sınıflandırın
NuGet kaynaklı bir sorun gördüğünüzde mesajın tamamını kopyalayın. Sadece “restore başarısız oldu” veya “paket bulunamadı” kısmını not etmek yeterli değildir. Mesaj içindeki paket kimliği, sürüm aralıkları, proje adı, hedef framework ve hata kodu sonraki teşhisin temelini oluşturur. NuGet’in bağımlılık çözümleme mantığında farklı paketlerin aynı bağımlılık için farklı sürüm beklentileri oluşturabilmesi normaldir; önemli olan bu beklentilerin nasıl çözümlendiğini anlamaktır. Microsoft Learn bağımlılık çözümleme belgeleri bu davranışın, özellikle doğrudan bağımlılığın öncelik kazanması ve uyumsuz bağımlılıkların raporlanması açısından temel başvuru noktasıdır.
1. Derleme hatası mı, NuGet uyarısı mı?
İlk ayrım, problemin restore aşamasında mı, derleme aşamasında mı ortaya çıktığıdır. Visual Studio içindeki Error List ekranı iki farklı katmanı aynı yerde gösterebilir; bu nedenle mesajın başındaki kodu ve çıktının hangi aşamada üretildiğini birlikte okuyun.
- Derleme hataları: Genellikle
CSile başlayan kodlar görülür. ÖrneğinCS0234, beklenen bir ad alanının bulunamadığını;CS0246ise bir türün veya ad alanının çözümlenemediğini gösterebilir. Bu durumda ilk kontrol noktası, ilgili paketin gerçekten restore edilip edilmediği, doğru projeye eklenip eklenmediği ve gerekli assembly’nin derlemeye dahil edilip edilmediğidir. - NuGet sürüm uyarıları:
NU1603veyaNU1605gibi kodlar bağımlılık grafiğindeki sürüm beklentilerine işaret eder. Mesajda “detected package downgrade” ifadesi varsa, bir dal daha yüksek bir sürüm beklerken başka bir doğrudan referansın daha düşük sürümü seçtirdiği anlaşılabilir. - Framework uyumluluğu hataları:
NU1202gibi mesajlarda paket ile projenin hedef framework’ü arasında uyum bulunmadığı açıkça belirtilir. Bu, ilk bakışta paket çakışmasına benzese de doğrudan sürüm çatışması olmayabilir; paket, seçilen hedef framework için uygunlibveyarefvarlıklarını sunmuyor olabilir. - Çalışma zamanı yükleme hataları: Proje derlenmesine rağmen uygulama başlatılırken
FileNotFoundException,FileLoadException,TypeLoadExceptionveyaMissingMethodExceptionoluşabilir. Bu durumda ilk kontrol noktası restore değil, çıktı klasöründeki assembly’ler, uygulamanın yüklediği gerçek DLL sürümü ve çalışma zamanında çağrılan API’nin bulunan assembly ile uyumudur.
Bu sınıflandırma önemlidir çünkü her problem aynı çözümü kabul etmez. Bir CS0246 hatasında paket referansı eksik olabilir; NU1605 uyarısında sürüm seçimi incelenmelidir; NU1202 için hedef framework ve paketin desteklediği framework’ler karşılaştırılmalıdır. Çalışma zamanı istisnasında ise yalnızca .csproj içindeki sürüm numarasına bakmak yetersiz kalabilir.
Hata mesajından hangi bilgileri ayırmalısınız?
Mesajı okurken aşağıdaki alanları ayrı satırlara yazın. Bu küçük kayıt, özellikle birden fazla proje içeren solution yapılarında yanlış dosyada değişiklik yapmanızı engeller.
- Paket adı: Çakışmaya konu olan kütüphanenin tam kimliğini yazın. Büyük-küçük harf farkı çoğu durumda belirleyici olmasa da paket kimliğini mesajdaki biçimiyle korumak arama yapmayı kolaylaştırır.
- İstenen sürüm veya aralık: Mesajda
>=,[1.0.0, 2.0.0)veya belirli bir sürüm gibi bir ifade varsa aynen kaydedin. “Paketin son sürümü” gibi varsayımlarla bu bilgiyi sadeleştirmeyin. - Çözümlenen sürüm: NuGet’in restore sonunda seçtiği sürümü ayrıca not edin. Özellikle downgrade uyarılarında beklenen sürüm ile seçilen sürüm arasındaki fark teşhisin merkezindedir.
- Çağıran proje: Mesajda geçen proje adını ve solution içindeki konumunu belirleyin. Aynı paket başka bir projede doğru çalışıyor olabilir.
- Hedef framework:
TargetFrameworkveyaTargetFrameworksdeğerini kaydedin. Örneğin tek hedefli bir proje ile birden fazla framework hedefleyen proje aynı paketi farklı biçimde değerlendirebilir. - Hata aşaması: Mesajın restore, build, publish, test veya uygulama başlatma sırasında oluştuğunu belirtin.
Hata metnini değiştirmeden saklayın
İlk tepki olarak uyarıyı kapatmak, hata listesini temizlemek veya mesajdan yalnızca son satırı almak teşhisi zorlaştırır. Bunun yerine Visual Studio’nun Error List veya Output penceresinden mesajı kopyalayın. Komut satırında çalışıyorsanız terminal çıktısını bir metin dosyasına aktarabilir veya doğrudan kopyalayabilirsiniz. Mesajın başındaki kodu, bağımlılık zincirini ve hedef framework satırlarını özellikle koruyun.
Örneğin şu iki mesaj yüzeyde benzer görünse de farklı işlem gerektirir:
error NU1605: Detected package downgrade:
'Library.B' from 4.0.0 to 3.5.0.
Project -> Library.A 4.0.0 -> Library.B (>= 4.0.0)
Project -> Library.B (>= 3.5.0)
error NU1202: Package 'Library.C' is not compatible
with 'net8.0'. Package 'Library.C' supports: netstandard2.0;
İlk örnekte araştırılacak konu, aynı paket için iki farklı sürüm beklentisinin hangi referanslardan geldiğidir. İkinci örnekte ise önce Library.C paketinin hedef framework desteği ve projenin hedeflediği framework incelenmelidir. İkinci duruma doğrudan “paket sürümünü yükselt” yaklaşımıyla başlamak, asıl uyumluluk sorununu gizleyebilir.
Son paket değişikliğini teşhis kaydına ekleyin
Çakışma çoğu zaman yeni bir paket ekledikten, mevcut bir paketi güncelledikten, hedef framework değiştirdikten veya merkezi paket sürümü tanımını düzenledikten sonra görünür. Bu nedenle hata kaydının yanına şu bilgileri ekleyin:
- Son eklenen veya güncellenen paket adı
- Değişiklik yapılan proje dosyası
- Değişiklikten önce ve sonra görülen sürüm
- Varsa
Directory.Packages.propsdeğişikliği - Restore, build veya test sırasında alınan ilk hata
- Çözüm için daha önce yapılan değişiklikler
Birden fazla değişikliği aynı anda yaptıysanız neden-sonuç ilişkisini kaybedebilirsiniz. Örneğin hem bir paketi yükseltip hem de hedef framework’ü değiştirmek, hatanın hangi değişiklikten kaynaklandığını belirsizleştirir. Bu yüzden mümkünse son çalışan durumu, son değişikliği ve ilk başarısız restore çıktısını ayrı ayrı işaretleyin.
C# ad alanları, assembly referansları ve proje bağımlılıkları arasındaki farkları temel düzeyde gözden geçirmek isteyenler, C# temel bilgilerini ölçmeye yarayan bilgi testi ile hangi kavramlarda tekrar yapması gerektiğini görebilir.
İlk kontrol noktasını hata türüne göre seçin
| Mesaj türü | İlk kontrol noktası | Kaçınılması gereken ilk tepki |
|---|---|---|
| Derleme hatası | Paketin doğru projede referans edilmesi, restore sonucu ve assembly erişimi | Rastgele sürüm yükseltmek |
| NU1603 veya NU1605 gibi sürüm uyarısı | Doğrudan ve transitif referansların hangi sürümü istediği | Uyarıyı hemen bastırmak |
| NU1202 gibi uyumluluk hatası | Paketin desteklediği TFM ile projenin hedef framework’ünü karşılaştırmak | Çakışma varmış gibi paketleri topluca değiştirmek |
| Çalışma zamanı yükleme hatası | Çıktı klasöründeki DLL’ler, yüklenen assembly ve çağrılan API | Sadece bin ve obj klasörlerini silmek |
Bu tablo bir çözüm reçetesi değil, soru sorma sırasıdır. Önce hatanın hangi katmanda oluştuğunu belirleyin; sonra o katmanın girdilerini inceleyin. Böylece “NuGet paket çakışması” ifadesini tek tip bir problem gibi ele almak yerine, sürüm çözümleme, framework seçimi, derleme referansı ve çalışma zamanı yükleme sorunlarını birbirinden ayırabilirsiniz.
csproj Dosyasında Doğrudan Paket Referanslarını İnceleyin

Hata türünü belirledikten sonra ikinci adım, hatanın oluştuğu projenin .csproj dosyasındaki doğrudan PackageReference kayıtlarını okumaktır. Bu kayıtlar, projenin açıkça istediği paketleri gösterir; başka paketlerin kendi bağımlılıkları nedeniyle grafiğe eklenen paketler ise transitif bağımlılıklardır. Microsoft Learn PackageReference belgeleri, bu kayıtların MSBuild öğeleri olarak nasıl değerlendirildiğini, koşullu referansları ve varlık akışını kontrol eden metadata alanlarını açıklar.
PackageReference satırını parçalara ayırın
SDK tarzı bir projede temel kayıt genellikle aşağıdaki biçimdedir:
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Example.Logging"
Version="3.2.0" />
<PackageReference Include="Example.Testing"
Version="1.4.0"
PrivateAssets="all"
Condition="'$(Configuration)' == 'Debug'" />
</ItemGroup>
Include paket kimliğini, Version ise projenin doğrudan talep ettiği sürümü belirtir. Buradaki sürüm, mutlaka tüm bağımlılık grafiğinde kullanılacak son sürüm anlamına gelmez; NuGet’in çözümleme kuralları, diğer doğrudan ve transitif beklentilerle birlikte değerlendirme yapar. Ancak aynı paket projenin doğrudan referansları arasında bulunuyorsa, bu kayıt çözümleme sonucunu etkileyen en önemli girdilerden biridir.
Koşullu referansları ve çoklu hedef framework’ü kontrol edin
Bir PackageReference yalnızca belirli bir yapılandırmada veya hedef framework’te etkin olabilir. Örneğin paket sadece net8.0 için eklenmiş, fakat proje aynı anda başka bir framework de hedefliyor olabilir. Bu durumda Visual Studio’da gördüğünüz proje dosyasını tek başına okumak yetmez; Condition ifadelerinin hangi durumda doğru olduğunu da değerlendirin.
<PropertyGroup>
<TargetFrameworks>net8.0;netstandard2.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Example.Json"
Version="2.1.0"
Condition="'$(TargetFramework)' == 'net8.0'" />
<PackageReference Include="Example.Legacy"
Version="1.8.0"
Condition="'$(TargetFramework)' == 'netstandard2.0'" />
</ItemGroup>
Çoklu hedefleme kullanılan projelerde restore her hedef framework için farklı varlık seçebilir. Bu nedenle “paket projede var” demek tek başına yeterli değildir; hangi hedef için etkinleştiğini ve o hedefte hangi assembly’nin seçildiğini de kontrol etmek gerekir.
PrivateAssets değerini yanlış yorumlamayın
PrivateAssets, paketin projede kullanılmasını tamamen engelleyen bir sürüm sabitleme anahtarı değildir. Daha çok paketten gelen belirli varlıkların üst projelere veya tüketicilere akışını kontrol eder. Örneğin test araçları, analizörler veya yalnızca geliştirme aşamasında kullanılan bazı paketler için PrivateAssets="all" tercih edilebilir. Bu ayar, paketin mevcut projedeki derleme veya restore davranışını otomatik olarak ortadan kaldırmaz.
Bu nedenle bir paketin PrivateAssets="all" taşıdığını gördüğünüzde şu soruları sorun:
- Paket yalnızca bu projede mi kullanılmalı?
- Paketin analizör, build veya runtime varlıkları projeye dahil ediliyor mu?
- Üretilen NuGet paketine veya projeyi tüketen başka bir projeye bağımlılık olarak akması isteniyor mu?
- Bu metadata, gerçek bir sürüm çatışmasını çözmek için mi eklenmiş, yoksa yalnızca bağımlılığın dışarı taşmasını önlemek için mi kullanılmış?
Doğrudan ve transitif referansı ayırın
Şu iki durum farklıdır:
- Doğrudan referans: Paket adı ve çoğu durumda sürümü ilgili
.csprojiçinde açıkça yazılıdır. - Transitif bağımlılık: Projenizin eklediği başka bir paket tarafından bağımlılık olarak getirilir; proje dosyanızda doğrudan bir
PackageReferencesatırı bulunmayabilir.
Hata mesajında görülen paketi .csproj içinde bulamamanız, paketin kullanılmadığı anlamına gelmez. Paket, başka bir kütüphanenin bağımlılık zincirinde yer alıyor olabilir. Bu ayrım sonraki teşhis adımında, yani bağımlılık ağacının incelenmesinde belirleyici olacaktır.
Solution içindeki doğru projeyi ve merkezi sürüm dosyasını bulun
Bir solution içinde uygulama, sınıf kütüphanesi, test ve araç projeleri bulunabilir. Hata mesajında adı geçen proje ile üzerinde çalıştığınız proje aynı olmayabilir. Önce ilgili projenin .csproj dosyasını açın; sonra aynı paket adının solution içindeki diğer projelerde geçip geçmediğini arayın.
Merkezi paket yönetimi kullanılıyorsa sürüm bilgisi doğrudan PackageReference satırında bulunmayabilir. Bu durumda repository veya solution kökünde yer alan Directory.Packages.props dosyasını da inceleyin. Proje dosyasında yalnızca paket adı yazılıp sürüm merkezi dosyada tanımlanmış olabilir. Alt klasörlerde birden fazla merkezi paket dosyası varsa, hangi dosyanın ilgili proje için değerlendirildiğini ayrıca kontrol edin.
csproj inceleme kontrol listesi
- Hata veren projenin doğru
.csprojdosyasını açın. - Son değişen
PackageReferencekayıtlarını karşılaştırın. - Aynı kütüphane kimliğinin birden fazla kez veya farklı koşullarda tanımlanıp tanımlanmadığını arayın.
TargetFrameworkveTargetFrameworksdeğerlerini kontrol edin.- Koşullu referansların hangi yapılandırmada etkin olduğunu inceleyin.
PrivateAssets,IncludeAssetsveExcludeAssetsdeğerlerinin amacıyla uyumlu olup olmadığını değerlendirin.- Varsa
Directory.Packages.propsdosyasındakiPackageVersiontanımlarını kontrol edin. - Lock dosyası kullanılıyorsa kayıtlı çözümün güncel proje tanımlarıyla uyumlu olup olmadığını inceleyin.
- Restore ayarlarını ve paket kaynaklarını gözden geçirin; farklı kaynakların farklı paket içeriği sunabildiğini varsayarak kayıt alın.
Bu aşamada henüz paket sürümünü değiştirmeyin. Önce doğrudan referansın gerçekten gerekli olup olmadığını, merkezi bir sürüm tarafından ezilip ezilmediğini ve aynı paketin farklı projelerde farklı amaçlarla kullanılıp kullanılmadığını netleştirin. Teşhisin güvenilir olması için hedef, dosya ve bağımlılık kaynağı belirlenmeden yapılan değişiklikler genellikle yeni bir hata katmanı oluşturur.
Bağımlılık Ağacında Çakışmanın Gerçek Kaynağını Bulun
Bir NuGet paket çakışmasını çözmenin en güvenilir yolu, yalnızca hata mesajındaki paket adına bakmak değil, projenin tamamındaki bağımlılık ağacını incelemektir. Çünkü hata veren kütüphane, doğrudan eklediğiniz bir paket olmayabilir; başka bir paketin transitif bağımlılığı olarak projeye gelmiş olabilir.
Güncel .NET SDK’larda paket listesini görmek için kullanılan komut biçimi SDK sürümüne göre değişebilir. .NET 10 SDK ile isim-önce biçimi olan dotnet package list kullanılabilirken, .NET 9 SDK ve daha eski sürümlerde fiil-önce biçimi olan dotnet list package kullanılır. Her iki biçimde de --include-transitive seçeneği, doğrudan paketlere ek olarak onların getirdiği transitif paketleri listeler. Microsoft’un güncel komut dokümantasyonunda bu iki biçim ve seçeneğin davranışı ayrıştırılmıştır. ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-package-list?utm_source=openai))
Komutu doğru dizinde çalıştırın
Komutu çalıştıracağınız konum önemlidir. Solution dosyasının bulunduğu dizindeyseniz solution genelindeki paketleri inceleyebilirsiniz. Yalnızca belirli bir projeyi analiz etmek istiyorsanız doğrudan .csproj dosyasını komuta verebilirsiniz. Bir dizin içinde birden fazla proje veya solution varsa, belirsizlik yaşamamak için dosya yolunu açıkça belirtmek daha güvenlidir.
# .NET 10 SDK ve daha yeni SDK biçimi
dotnet package list --project src/OrderApi/OrderApi.csproj --include-transitive
# .NET 9 SDK veya daha eski SDK biçimi
dotnet list src/OrderApi/OrderApi.csproj package --include-transitive
Komutun çalıştırıldığı proje daha önce restore edilmemişse araç restore işlemi başlatabilir. Mevcut restore sonucunu değiştirmeden yalnızca liste almak istediğiniz özel durumlarda --no-restore seçeneği kullanılabilir; ancak eski veya eksik bir restore çıktısı üzerinden karar vermemek için teşhis sırasında bağımlılıkların güncel biçimde çözümlendiğinden emin olun. Komutun hangi projeyi veya solution’ı inceleyeceğini açıkça belirtmek, özellikle çok projeli repository’lerde yanlış sonuca bakma riskini azaltır.
Çıktıda hangi paketleri aramalısınız?
Çıktıdaki hata mesajında geçen paket adını birebir arayın. Büyük-küçük harf farkı genellikle belirleyici değildir; asıl önemli olan paket kimliğinin doğru olmasıdır. Örneğin hata Common.Logging paketini işaret ediyorsa, listede bu paketin doğrudan mı yoksa transitif mi göründüğünü kontrol edin.
- Top-level Package veya benzeri doğrudan paket bölümü, projenizin
.csprojdosyasında açıkça bulunan PackageReference kayıtlarını gösterir. - Transitive Package bölümü, doğrudan eklenen paketlerin ihtiyaç duyduğu ve projenize dolaylı olarak gelen paketleri gösterir.
- Resolved sütunu, restore sonucunda proje için seçilen sürümü gösterir.
- Bir paketin transitif listede görünmesi, uygulama kodunuzda bu paketin API’lerini doğrudan kullandığınız anlamına gelmez.
- Aynı paket adı farklı üst seviye paketlerden geliyorsa, listede tek bir seçilmiş sürümle temsil edilebilir.
Burada önemli bir ayrım vardır: Paket listesi çoğunlukla hangi sürümün seçildiğini gösterir; bu seçimin hangi bağımlılık yolundan geldiğini her zaman tek başına ayrıntılı biçimde açıklamaz. Belirli bir transitif paketin neden projeye dahil edildiğini anlamak için Visual Studio’da projenin Dependencies düğümünü genişletebilir veya destekleyen SDK’larda dotnet nuget why komutunu kullanabilirsiniz. Bu komut, seçtiğiniz paket için proje ya da solution içindeki bağımlılık grafiğini gösterir. ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-nuget-why?utm_source=openai))
Ortak alt kütüphane senaryosunu adım adım okuyun
Gerçekçi bir senaryo düşünelim. Projeniz iki doğrudan pakete sahip olsun:
ReportExporter, ortak alt kütüphane olanCommon.Utilityiçin2.xaralığını istiyor.LegacyConnector, aynıCommon.Utilitypaketinin1.xaralığına ihtiyaç duyuyor.- Projenin restore sonucu ise
Common.Utilityiçin tek bir sürüm seçiyor.
Bu ilişkiyi basitleştirilmiş bir ağaç olarak şöyle okuyabilirsiniz:
MyApplication
├── ReportExporter
│ └── Common.Utility [2.x aralığı]
└── LegacyConnector
└── Common.Utility [1.x aralığı]
Restore sonucu:
└── Common.Utility [seçilen sürüm]
NuGet’in çözümleme mantığında proje grafiği tek bir bağımlılık kümesi olarak değerlendirilir. Aynı paket birden fazla yoldan geliyorsa, sonuçta hangi sürümün seçildiğini bilmek önemlidir; fakat seçilen sürümün her üst seviye paketin beklediği API ve davranışlarla gerçekten uyumlu olduğu ayrıca değerlendirilmelidir. Bu nedenle listede yalnızca bir sürüm görünmesi, iki isteğin de problemsiz biçimde karşılandığını kanıtlamaz.
Örneğin seçilen Common.Utility sürümü ReportExporter için beklenen API’leri içeriyor olabilir; fakat LegacyConnector eski bir API davranışına bağlıysa çalışma zamanında farklı bir hata ortaya çıkabilir. Tersi durumda da derleme aşamasında eksik tür, eksik metot veya assembly yükleme hataları görebilirsiniz. Bu yüzden bağımlılık ağacını incelemek, sürüm seçiminin teknik açıdan güvenli olduğunu kanıtlayan son adım değil, teşhisin başlangıç noktasıdır.
“Hangi paket istiyor?” sorusunu netleştirin
Bir çakışmayı değerlendirirken aşağıdaki dört soruyu sırayla yanıtlayın:
- Hangi paket istiyor? Hata mesajındaki paketi bağımlılık listesinde bulun ve onu getiren doğrudan paketleri belirleyin.
- Hangi sürüm seçilmiş? İlgili satırdaki resolved değerini kontrol edin. Proje için fiilen kullanılan sürüm budur.
- Seçilen sürüm iki isteği karşılıyor mu? Üst seviye paketlerin beklediği API yüzeyini, minimum sürüm gereksinimlerini ve bilinen uyumluluk notlarını karşılaştırın.
- Uyumsuzluk doğrudan mı, transitif mi? Paket
.csprojiçinde doğrudan tanımlıysa değişiklik alanınız farklıdır; başka bir paketten geliyorsa önce o üst seviye paketi değerlendirmek daha doğru olabilir.
Bu soruların ilk ikisi çoğu zaman paket listesiyle cevaplanabilir. Üçüncü soru için paket dokümantasyonu, release notları veya ilgili API değişiklikleri incelenmelidir. Dördüncü soru ise doğrudan paket referanslarını ve bağımlılık yolunu birlikte görmeyi gerektirir.
Başlangıç seviyesinde Visual Studio veya terminal kullanan geliştiriciler için bu işlem ilk başta karmaşık görünebilir. Ancak terminal çıktısını satır satır okumak, proje dosyasını incelemek ve bağımlılık grafiğini takip etmek tekrar edilebilir bir beceridir. asenkron video eğitimler bu tür terminal ve proje dosyası inceleme pratiklerini kendi hızınızda tekrar etmenize yardımcı olabilir; yine de gerçek bir çakışmada karar, yalnızca komut çıktısına değil, değişikliğin derleme ve çalışma zamanı davranışına göre verilmelidir.
Uygulanabilir terminal inceleme akışı
Aşağıdaki akış, hata mesajından bağımlılık kaynağına ilerlemek için kullanılabilir:
cd C:ProjelerOrderSystem
dotnet package list --project .srcOrderApiOrderApi.csproj --include-transitive
dotnet nuget why .srcOrderApiOrderApi.csproj Common.Utility
# .csproj ve ilgili çıktı incelendikten sonra
dotnet restore .srcOrderApiOrderApi.csproj
Bu örnekte Common.Utility yerine hata mesajında gördüğünüz gerçek paket adını yazmalısınız. Eğer .NET 9 veya daha eski SDK kullanıyorsanız ilk komutun eski biçimini tercih edin:
dotnet list .srcOrderApiOrderApi.csproj package --include-transitive
İnceleme sırasında yalnızca paket adının listede bulunmasına odaklanmayın. Şu bilgileri not almak daha yararlıdır:
- Paketi doğrudan ekleyen PackageReference kayıtları.
- Paketi transitif olarak getiren üst seviye paketler.
- Her hedef framework için seçilen sürüm.
- Aynı pakete ulaşan farklı bağımlılık yolları.
- Çıktıda görülen downgrade, uyumsuzluk veya restore uyarıları.
Özellikle multi-targeting kullanılan projelerde aynı paket her hedef için aynı şekilde çözümlenmeyebilir. Bu nedenle genel solution çıktısına bakıp tüm hedeflerin aynı durumda olduğunu varsaymayın; gerektiğinde paket listesini belirli bir framework için filtreleyerek tekrar inceleyin.
Komut çıktısı neden tek başına yeterli değildir?
dotnet package list --include-transitive veya eski eşdeğeri, proje grafiğinde hangi paketlerin bulunduğunu ve restore sonucunda hangi sürümlerin seçildiğini anlamak için güçlü bir başlangıç aracıdır. Fakat bu çıktı şu soruları tek başına kesin olarak cevaplamaz:
- Seçilen assembly’nin çalışma zamanında beklenen API davranışını koruyup korumadığı.
- Bir paketin yalnızca belirli işletim sistemlerinde veya runtime identifier’larda çalışıp çalışmadığı.
- Çalışma zamanında yüklenen assembly’nin derleme sırasında referans verilen assembly ile tam olarak aynı davranışı sunup sunmadığı.
- Bir paketin configuration, native library veya platforma özgü dosya gerektirip gerektirmediği.
Bu nedenle teşhis sıralamasını şu kontrol listesiyle tamamlayın: hata metni → bağımlılık kaynağı → en küçük değişiklik → temiz derleme → davranış testi. İlk iki adım gerçek kaynağı bulur; sonraki üç adım ise yaptığınız değişikliğin yalnızca restore işlemini değil, uygulamanın gerçek davranışını da koruduğunu sınar.
Hedef Framework Uyumluluğunu Bağımlılık Çakışmasından Ayırın

Bir NuGet hatası her zaman paket sürümlerinin birbiriyle çakıştığı anlamına gelmez. Aynı belirti, projenin hedeflediği framework ile paketin sunduğu derleme hedefinin uyumlu olmamasından da kaynaklanabilir. Bu nedenle önce “hangi paket sürümü seçildi?” sorusunu, ardından “bu paket benim hedef framework’üm için uygun mu?” sorusunu yanıtlayın.
SDK tarzı bir projede hedef framework genellikle .csproj dosyasındaki TargetFramework veya TargetFrameworks özellikleriyle belirtilir. TargetFramework tek bir hedefi, TargetFrameworks ise noktalı virgülle ayrılmış birden fazla hedefi ifade eder. Örneğin net8.0 modern .NET hedeflerinden birini, netstandard2.0 daha geniş uyumluluk amacı taşıyan bir .NET Standard hedefini, net8.0-windows ise Windows platform bilgisi taşıyan bir hedefi ifade eder. ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/core/versions/selection?utm_source=openai))
Önce proje hedefini okuyun
İlk kontrol, projenin gerçekten hangi hedef veya hedeflere derlendiğini görmektir:
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
Multi-targeting kullanan bir kütüphane veya uygulamada yapı şu şekilde olabilir:
<PropertyGroup>
<TargetFrameworks>net8.0;netstandard2.0</TargetFrameworks>
</PropertyGroup>
Bu projede derleme iki ayrı hedef için yapılır. Bir paketin net8.0 için uygun olması, otomatik olarak netstandard2.0 hedefi için de aynı API’leri sunduğu anlamına gelmez. Her hedef framework için NuGet’in seçebileceği paket varlıkları ve derleme referansları ayrı değerlendirilebilir.
Paketin desteklediği TFM ile projenin TFM’sini karşılaştırın
NuGet paketleri tek bir framework için hazırlanabileceği gibi birden fazla target framework moniker, yani TFM, içerebilir. Paket içinde farklı hedeflere ait assembly’ler bulunduğunda NuGet, projenin hedefiyle uyumlu olan en uygun varlığı seçmeye çalışır. Örneğin .NET 8 hedefi, uyumlu bir netstandard2.0 assembly’sini kullanabilir; ancak bu, paketin her platforma özgü özelliğinin çalışacağı anlamına gelmez. Uyumlu bir assembly seçilmesiyle, uygulamanın tüm çalışma zamanı gereksinimlerinin karşılanması aynı şey değildir. ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/standard/library-guidance/nuget-package-compatibility-rules?utm_source=openai))
Kontrol sırasında paket yöneticisinde veya paketin içeriğinde şu tür hedefleri karşılaştırın:
- Projenin hedefi: örneğin
net8.0,netstandard2.0veyanet8.0-windows. - Paketin sunduğu hedefler: örneğin yalnızca bir .NET Framework hedefi, bir .NET Standard hedefi veya Windows’a özgü bir hedef.
- Kullanılan API’nin platform gereksinimi: genel .NET API’si mi, yoksa yalnızca Windows üzerinde bulunan bir API mi?
- Pakete bağlı native bileşen veya işletim sistemi özelliği bulunup bulunmadığı.
Sürüm çakışması ile framework uyumsuzluğunu ayıran tablo
| Kontrol noktası | Sorulacak soru | Olası sonuç | Sonraki adım |
|---|---|---|---|
| Paketin seçilen sürümü | Aynı paket için birden fazla bağımlılık yolu farklı sürüm aralıkları mı istiyor? | Paket sürümü çözümleme veya downgrade uyarısı olabilir. | Bağımlılık ağacında paketi isteyen üst seviye paketleri inceleyin. |
TargetFramework |
Proje tek bir framework mü hedefliyor? | Hata belirli bir hedefle sınırlı olmayabilir. | Paketin desteklediği TFM’leri proje hedefiyle karşılaştırın. |
TargetFrameworks |
Hata yalnızca belirli bir framework derlemesinde mi oluşuyor? | Sorun multi-targeting hedeflerinden birine özgü olabilir. | Derlemeyi ilgili framework ile ayrı çalıştırıp farkı izole edin. |
| API kullanılabilirliği | Kullanılan sınıf veya metot seçilen hedefte mevcut mu? | Paket restore edilebilir, fakat derleme hatası oluşabilir. | API’yi hedef framework’e uygun alternatifle değiştirin veya koşullu kod kullanın. |
| Platform bağımlılığı | Paket Windows veya başka bir işletim sistemi özelliğine mi bağlı? | Derleme geçebilir, çalışma zamanı başka platformda başarısız olabilir. | Platform hedefini, runtime ayarlarını ve davranış testlerini kontrol edin. |
Multi-targeting hatasını izole edin
Projenizde TargetFrameworks kullanılıyorsa, hatanın hangi hedefte çıktığını netleştirmeden paket değiştirmeyin. Örneğin net8.0 hedefi başarılı olurken netstandard2.0 hedefi başarısızsa, ilk şüphe aynı paketin iki sürümünün çakışması değil, ilgili paketin veya kullanılan API’nin netstandard2.0 için uygun olmamasıdır.
Tersine, tüm hedeflerde aynı paket için downgrade veya sürüm çözümleme uyarısı görüyorsanız, sorun büyük olasılıkla bağımlılık grafiğindedir. Bu durumda .csproj içindeki doğrudan referanslar, merkezi paket yönetimi kullanılıyorsa merkezi sürüm tanımları ve transitif paket yolları incelenmelidir.
İzolasyon için şu sırayı kullanabilirsiniz:
- Hatanın oluştuğu hedef framework’ü belirleyin.
- Paket listesini yalnızca bu hedef için inceleyin.
- Aynı paketin diğer hedeflerde hangi assembly veya sürümle çözümlendiğini karşılaştırın.
- Derleme hatası mı, API bulunamaması mı, yoksa platform davranışı mı olduğunu ayırın.
- En küçük değişikliği yalnızca sorunlu hedefte uygulayın.
Uyumluluk bulunduğunda bile davranış testi yapın
Bir paketin hedef framework ile uyumlu görünmesi, uygulamanın gerçek ortamda kesinlikle sorunsuz çalışacağını göstermez. Uyumluluk öncelikle paket varlığının ve API yüzeyinin seçilen hedefle ilişkilendirilebildiğini anlatır. Platforma özgü dosyalar, native bağımlılıklar, işletim sistemi izinleri veya farklı çalışma zamanı davranışları ayrıca test edilmelidir.
Bu nedenle framework uyumluluğu teşhisini paket sürümü teşhisiyle birleştirmeyin. Önce hedef framework’ü ve platformu doğrulayın; ardından bağımlılık ağacındaki sürüm isteklerini değerlendirin. Böylece rastgele bir paket yükseltmesi veya sürüm düşürmesi yapmak yerine, hatanın gerçekten hangi katmanda oluştuğunu belirleyebilirsiniz.
Yükseltme, Sürüm Düşürme veya Alternatif Çözümü En Az Değişiklik İlkesiyle Seçin
Hata metnini ve bağımlılık ağacını gördükten sonra amaç, projedeki bütün paketleri topluca değiştirmek değil, çakışmayı oluşturan ilişkiyi mümkün olan en dar kapsamda düzeltmektir. Öncelik çoğu durumda çakışmaya neden olan doğrudan paketi uyumlu bir sürüme yükseltmektir; ancak bu karar, hedef framework, kullanılan API, güvenlik uyarıları ve mevcut test kapsamı birlikte değerlendirilmeden verilmemelidir.
NuGet, PackageReference kullanan projelerde bağımlılıkları çözerken doğrudan bağımlılığa öncelik verebilir. Bu davranış, uygulamanın proje dosyasında doğrudan belirttiği paketin transitif bağımlılıklardaki sürümün önüne geçmesine neden olabilir. Aynı mekanizma bazı durumlarda daha düşük bir sürümün seçilmesine ve downgrade uyarısına yol açabilir. ([learn.microsoft.com](https://learn.microsoft.com/en-us/nuget/concepts/dependency-resolution?utm_source=openai))
Merkezi paket sürümü yönetimi kullanılıyorsa karar biraz daha dikkatli verilmelidir. Transitif pinning etkinleştirildiğinde, merkezi olarak belirlenmiş sürüm transitif bağımlılığın istediği sürümü geçersiz kılabilir. İstenen sürümden daha düşük bir sürümü sabitlemek restore aşamasında downgrade hatası oluşturabileceği gibi, çalışma zamanında uyumsuzluk ihtimalini de artırabilir. ([learn.microsoft.com](https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu1109?utm_source=openai))
Çözüm seçeneklerini hangi sırayla değerlendirmelisiniz?
Aşağıdaki akış, her NuGet çakışmasında uygulanabilecek pratik bir karar çerçevesidir. Buradaki “en küçük değişiklik”, yalnızca en az satırı değiştirmek anlamına gelmez; davranış, güvenlik ve bakım riski en düşük değişikliği ifade eder.
- Hata metnini sabitleyin. Hatanın veya uyarının kodunu, etkilenen paket adını, seçilen sürümü ve NuGet’in gösterdiği bağımlılık yollarını not edin. Örneğin downgrade uyarısında “hangi paket daha yüksek bir sürüm istiyor, proje hangi sürümü doğrudan seçiyor?” sorularını yanıtlamadan değişiklik yapmayın.
- Bağımlılık kaynağını bulun. Sorunun doğrudan
PackageReferencesatırından mı, merkezi sürüm tanımından mı, yoksa başka bir paketin transitif bağımlılığından mı geldiğini ayırın. Kaynak belirlenmeden yapılan sürüm değişikliği yalnızca hata mesajının biçimini değiştirebilir. - En küçük değişikliği seçin. Önce doğrudan paketi uyumlu bir sürüme yükseltmeyi, ardından gerekiyorsa ortak alt bağımlılığı açıkça yönetmeyi değerlendirin. Birden fazla paketi aynı anda değiştirmek yerine tek bir kararın etkisini ölçülebilir hâle getirin.
- Değişikliği izole uygulayın. Sadece ilgili
.csproj,Directory.Packages.propsveya ilgili yapılandırma dosyasında değişiklik yapın. Aynı commit içinde bağımsız refactor, framework geçişi veya kod temizliği yapmayın. - Temiz derleme ve test yapın. Restore sonrasında derleme başarılı olsa bile paketin sağladığı gerçek API’yi ve etkilenen işlevi test edin. Çözüm, yalnızca NuGet mesajını ortadan kaldırdığı için başarılı kabul edilmemelidir.
1. Doğrudan paketi uyumlu bir sürüme yükseltme
Bağımlılık ağacı, doğrudan eklenmiş bir paketin daha düşük sürümü seçtirdiğini gösteriyorsa ilk aday yükseltmedir. Örneğin bir kütüphane alt bağımlılığı için en az belirli bir API seviyesini bekliyor, fakat proje dosyası aynı paketin daha eski bir sürümünü doğrudan belirtiyorsa, doğrudan referansı uyumlu sürüme taşımak çakışmayı çözebilir.
Bu değişiklik yapılırken yalnızca sürüm numarasına bakmayın. Şu soruları birlikte değerlendirin:
- Yeni sürüm projenin hedef framework’ü için uygun varlıkları içeriyor mu?
- Kullanılan namespace, sınıf, metot veya seçeneklerde API kırılması ihtimali var mı?
- Paketin release notes veya breaking changes belgelerinde davranış değişikliği belirtiliyor mu?
- Yeni sürüm, başka bir transitif bağımlılığı farklı bir sürüme taşıyor mu?
- Projedeki mevcut birim ve entegrasyon testleri bu değişikliği yakalayabilir mi?
Bir paketin yeni sürümünün daha yüksek olması, otomatik olarak her proje için güvenli olduğu anlamına gelmez. NuGet paket sürümü ile assembly sürümü aynı kavram değildir; ayrıca farklı hedef framework’ler için paketin farklı assembly’leri seçilebilir. Bu nedenle derleme sonucunun yanı sıra çalışma zamanındaki API uyumluluğu da kontrol edilmelidir. ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/standard/library-guidance/nuget-package-compatibility-rules?utm_source=openai))
2. Ortak alt bağımlılığı açıkça yönetme
İki doğrudan paket aynı alt bağımlılığın farklı sürüm aralıklarını istiyorsa, proje sahibi ortak sürümü açıkça yönetmeyi seçebilir. Bu işlem bazen proje dosyasına ilgili PackageReference eklemek, bazen de merkezi paket yönetiminde PackageVersion değerini güncellemek anlamına gelir.
Fakat bu yaklaşım, “uyarıyı susturmak için her transitif paketi doğrudan ekleyin” şeklinde uygulanmamalıdır. Doğrudan referans eklemek NuGet’in doğrudan bağımlılık önceliği kuralını devreye sokabilir; böylece bir dalın istediği sürümü diğer dalların önüne geçirirsiniz. Bu sürüm, bütün tüketicilerin API beklentilerini karşılamıyorsa derleme sonrasında MissingMethodException, TypeLoadException veya benzeri çalışma zamanı sorunları ortaya çıkabilir. ([learn.microsoft.com](https://learn.microsoft.com/en-us/nuget/concepts/dependency-resolution?utm_source=openai))
Merkezi paket sürümü yönetiminde daha da dikkatli olun. Merkezi dosyadaki bir sürüm, birden fazla projeyi aynı anda etkileyebilir. Değişiklik yalnızca bir projedeki sorunu çözmek için yapılıyorsa, solution içindeki diğer projelerin hedef framework ve API beklentilerini de kontrol edin. Transitif pinning kullanılıyorsa, alt bağımlılığı istenen sürümden daha aşağıya sabitlemek yerine üst bağımlılığı güncellemek veya pinning kararını yeniden değerlendirmek daha güvenli olabilir. ([learn.microsoft.com](https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu1109?utm_source=openai))
3. Son bilinen uyumlu sürüme dönme
Yükseltme sonrasında API kırılması oluşuyor, hedef framework ile uyumsuzluk beliriyor veya proje kapsamındaki testler başarısız oluyorsa son bilinen uyumlu sürüme dönmek mantıklı bir geçici çözüm olabilir. Burada önemli olan “eski olan her zaman daha kararlı” varsayımına kapılmamaktır.
Bir sürümü düşürmeden önce şu riskleri kontrol edin:
- Daha eski sürümde giderilmemiş bir güvenlik uyarısı bulunuyor mu?
- Geri dönülen sürüm, projenin hedef framework’ünü destekliyor mu?
- Başka bir paket, artık karşılanmayan daha yüksek bir bağımlılık gerektiriyor mu?
- Kod, yeni sürümde eklenen fakat eski sürümde bulunmayan bir API kullanıyor mu?
- Geri dönüş, uygulamada daha önce görülmeyen serialization, HTTP, ORM veya deployment sorunları oluşturabilir mi?
NuGet’in downgrade uyarısı yalnızca estetik bir restore mesajı değildir. Resmî dokümantasyon, doğrudan bağımlılık kuralının başka bir bağımlılığın istediği sürümden daha düşük bir sürüm seçmesine ve bunun diğer bağımlılıkları bozabilmesine dikkat çeker. Ayrıca güvenlik denetimi uyarıları, kullanılan bağımlılıklardaki bilinen zafiyetleri görünür hâle getirebilir; bir downgrade bu tür uyarıları çözmek yerine daha eski ve riskli bir paketi yeniden projeye taşıyabilir. ([learn.microsoft.com](https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu1605?utm_source=openai))
4. Paket yerine alternatif teknik çözüm arama
Bazen sorun yalnızca sürüm çözümlemesi değildir. Yeni paket sürümü, kullanılan API’yi değiştirmiş olabilir; eski sürüm ise hedef framework veya güvenlik gereksinimleri nedeniyle kabul edilemez olabilir. Böyle bir durumda aynı paketin farklı bir sürümünü zorlamak yerine teknik çözümü değiştirmek gerekir.
Alternatif çözüm şu biçimlerde olabilir:
- Değişen API için küçük ve izole bir uyarlama katmanı yazmak.
- Eski API çağrılarını yeni API’ye taşıyan bir adapter veya wrapper kullanmak.
- İhtiyaç duyulmayan ek paketi kaldırarak bağımlılık ağacını sadeleştirmek.
- Paketi yalnızca ihtiyaç duyulan hedef framework için koşullu referans hâline getirmek.
- Birden fazla framework hedefleniyorsa her TFM için uygun paket varlıklarını ayrı değerlendirmek.
Bu seçenek daha fazla kod değişikliği gerektirebilir; ancak bağımlılıkları sürekli zorlayan bir sürüm sabitlemesinden daha sürdürülebilir olabilir. Kararı verirken değişiklik kapsamını, geri alma kolaylığını, olası API kırılmasını, güvenlik etkisini ve test yükünü aynı tabloda düşünün. En az satır değiştiren çözüm değil, ileride daha az sürpriz oluşturan çözüm tercih edilmelidir.
Temiz Restore Sonrası Derleme ve Davranış Testi Yapın
NuGet çakışması çözüldükten sonra yalnızca Visual Studio’daki kırmızı hata işaretlerinin kaybolması yeterli değildir. Paket değişikliği, restore edilen bağımlılık grafiğini ve derleme çıktısını etkiler; bu nedenle temiz bir restore, yeniden derleme, test ve gerçek davranış doğrulaması aynı sürecin parçaları olarak yürütülmelidir.
dotnet restore, proje veya solution bağımlılıklarını çözer ve restore sonucunu proje varlık dosyasına yazar. dotnet build ve dotnet test gerektiğinde restore işlemini örtük olarak çalıştırabilse de, çakışma teşhisinde restore adımını açıkça çalıştırmak hangi aşamada sorun çıktığını ayırmayı kolaylaştırır. ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-restore?utm_source=openai))
Temizleme işlemini doğru kapsamda yapın
Önce ilgili proje veya solution’ın bin ve obj klasörlerini temizleyin. obj klasöründeki project.assets.json dosyası restore edilmiş bağımlılık grafiğinin bir çıktısıdır. Bu dosya eski çözümleme sonucunu yansıtabileceği için, paket referansını değiştirdikten sonra yeniden oluşturulması teşhis sürecinde önemlidir. ([learn.microsoft.com](https://learn.microsoft.com/en-us/nuget/concepts/dependency-resolution?utm_source=openai))
Windows ve PowerShell kullanan başlangıç seviyesindeki geliştiriciler için örnek akış aşağıdaki gibidir. MySolution.sln ve tests/MyProject.Tests/MyProject.Tests.csproj adlarını kendi solution ve test projenizin yollarıyla değiştirin.
Remove-Item -Recurse -Force .bin, .obj -ErrorAction SilentlyContinue
dotnet restore .MySolution.sln
dotnet build .MySolution.sln --no-restore
dotnet test .MySolution.sln --no-restore
dotnet test .testsMyProject.TestsMyProject.Tests.csproj --no-build
Bu örnekte restore açıkça bir kez çalıştırıldığı için sonraki komutlarda --no-restore kullanılmıştır. Test projesi solution içinde değilse doğrudan test projesinin yolunu verin. Bir solution birden fazla hedef framework içeriyorsa, derleme ve test sonuçlarını her hedef için ayrı incelemek gerekebilir. dotnet test test projesini derleyip testleri çalıştırabildiğinden, son satırdaki --no-build yalnızca bir önceki derlemenin çıktısına güvenmek istediğiniz kontrollü senaryolarda kullanılmalıdır. ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-build?utm_source=openai))
Derleme başarılı olduktan sonra hangi testleri yapmalısınız?
İlk kontrol, daha önce hata veren paket API’sinin gerçekten çağrılmasıdır. Örneğin bir JSON serializer paketi değiştiyse yalnızca projenin derlenmesi değil, gerçek bir nesnenin serialize ve deserialize edilmesi test edilmelidir. HTTP istemcisiyle çalışan bir paket değiştiyse timeout, hata kodu, header ve response body işleme davranışlarını kontrol edin. ORM veya veritabanı erişimi etkilendiyse sorgu üretimi, parametre aktarımı, null değerler ve transaction davranışı gibi noktaları doğrulayın.
Testleri üç katmanda düşünmek yararlıdır:
- Derleme testi: Namespace, tür, metot imzası ve referans çözümlemesi doğru mu?
- Birim testi: Paketle doğrudan ilişkili sınıflar beklenen girdilerde aynı sonucu üretiyor mu?
- Davranış testi: Uygulamanın gerçek iş akışı, dış servis çağrısı, serialization veya ORM işlemi değişiklikten sonra doğru çalışıyor mu?
Değişiklik öncesi test sonuçlarını sakladıysanız, sonrasındaki sonuçlarla karşılaştırın. Sadece “testler geçti” demek yerine test sayısı, başarısız testler, uyarılar ve kritik iş akışlarının sonucu birlikte değerlendirilmelidir. Test kapsamı yetersizse, paketin değiştiği noktayı doğrudan hedefleyen küçük bir regresyon testi eklemek en güvenli yaklaşımdır.
NuGet, restore sırasında bağımlılıkların birbiriyle uyumunu kontrol eder; ancak her çalışma zamanı davranışını garanti etmez. Farklı hedef framework’lerde farklı paket assembly’lerinin seçilebilmesi, derleme sırasında görülmeyen bazı uyumsuzlukların uygulama çalışırken ortaya çıkmasına neden olabilir. Bu nedenle gerçek işlev testi, paket çakışması çözümünün son adımıdır. ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/standard/library-guidance/nuget-package-compatibility-rules?utm_source=openai))
Benzer sorun giderme süreçlerini ve .NET ekosistemindeki diğer teknik konuları takip etmek isteyenler için güncel yazılım ve programlama yazıları yararlı bir başvuru alanı olabilir.
NuGet çakışması teşhis kontrol listesi
- Hata veya uyarı metni, paket adı ve uyarı koduyla birlikte kaydedildi mi?
- İlgili
.csprojdosyasındaki doğrudanPackageReferencesatırları incelendi mi? - Doğrudan ve transitif bağımlılık yolları birbirinden ayrıldı mı?
- Merkezi paket sürümü yönetimi veya transitif pinning kullanılıyor mu?
- Hedef framework ile paket uyumluluğu ayrıca kontrol edildi mi?
- En küçük değişiklik ilkesiyle yükseltme, sürüm düşürme veya alternatif çözüm karşılaştırıldı mı?
- Seçilen değişiklik yalnızca ilgili dosya veya projede izole uygulandı mı?
- İlgili
binveobjklasörleri temizlendi mi? - Restore işlemi açıkça yeniden çalıştırıldı mı?
- Solution veya proje temiz biçimde derlendi mi?
- Birim testleri ve gerekiyorsa entegrasyon testleri çalıştırıldı mı?
- Çakışmadan etkilenen API, serialization, HTTP, ORM veya diğer gerçek işlev doğrulandı mı?
Sık Sorulan Sorular
NuGet çakışması ile framework uyumsuzluğu arasındaki fark nasıl anlaşılır?
NuGet çakışmasında genellikle aynı paket kimliği için farklı sürüm beklentileri veya doğrudan-transitif bağımlılık ilişkileri görülür. Framework uyumsuzluğunda ise hata, paketin projenin hedef framework’ü için uygun assembly veya bağımlılık varlığı sunmadığını belirtir. İlkinde bağımlılık ağacını ve sürüm seçimini, ikincisinde hedef framework ile paketin desteklediği TFM’leri incelemek gerekir.
Bir paketi doğrudan PackageReference olarak eklemek transitif bağımlılık sorununu çözer mi?
Bazen çözer; çünkü NuGet doğrudan bağımlılığa öncelik verebilir. Ancak bu işlem, seçilen sürümün diğer paketlerin API ve çalışma zamanı beklentileriyle uyumlu olduğunu kanıtlamaz. Doğrudan referans eklemeden önce bağımlılık ağacını, hedef framework’ü ve ilgili testleri kontrol etmek gerekir.
NuGet paketini düşürmek hangi durumlarda daha risklidir?
Daha eski sürümde güvenlik uyarısı varsa, başka bir paket daha yüksek bir sürüm gerektiriyorsa, proje yeni API’leri kullanıyorsa veya eski sürüm hedef framework ile uyumlu değilse downgrade daha risklidir. Bu değişiklik restore uyarısını ortadan kaldırsa bile çalışma zamanı hatası, işlev kaybı veya güvenlik açığı oluşturabilir.
bin ve obj klasörlerini temizlemek paket çakışmasını neden bazen çözer?
Bu klasörlerde önceki derleme ve restore işlemlerinden kalan ara çıktılar bulunur. Özellikle obj altında yer alan bağımlılık varlık dosyası, eski çözümleme sonucunu yansıtabilir. Temizleme, bu çıktıları yeniden oluşturarak yeni paket referanslarının ve bağımlılık grafiğinin baştan değerlendirilmesini sağlar. Kalıcı bir sürüm kısıtı veya gerçek uyumsuzluk varsa temizlik tek başına çözüm değildir.
Derleme başarılı olduğu hâlde paket değişikliğinin uygulamayı bozmadığı nasıl doğrulanır?
Önce birim testlerini, ardından paketin doğrudan kullanıldığı gerçek iş akışını çalıştırın. Serialization, HTTP istekleri, ORM sorguları, dosya işlemleri veya dış servis entegrasyonları etkilenmişse bu davranışları temsil eden testler ekleyin. Değişiklik öncesi ve sonrası sonuçları karşılaştırarak yalnızca derleme başarısını değil, uygulamanın beklenen davranışını da doğrulayın.
NuGet çakışmalarında güvenilir çözüm, hata mesajından başlayıp gerçek uygulama davranışına kadar ilerleyen kontrollü bir inceleme sürecidir.