Aracılığıyla paylaş


Bağımlılıklar

.NET kitaplığına bağımlılık eklemenin birincil yolu NuGet paketlerine başvurmaktır. NuGet paket başvuruları, önceden yazılmış işlevleri hızla yeniden kullanmanıza ve bu işlevlerden yararlanmanıza olanak sağlar, ancak .NET geliştiricileri için yaygın bir sorun kaynağıdır. Bağımlılıkların doğru yönetilmesi, diğer .NET kitaplıklarındaki değişikliklerin .NET kitaplığınızı bozmasını önlemek için önemlidir ve tam tersi de geçerlidir!

Baklava bağımlılıkları

Bir .NET projesinin bağımlılık ağacında bir paketin birden çok sürümü olması yaygındır. Örneğin, bir uygulama iki NuGet paketine bağlıdır ve her biri aynı paketin farklı bir sürümüne bağlıdır. Artık uygulamanın bağımlılık grafiğinde bir baklava bağımlılığı var.

Diamond dependency

Derleme zamanında NuGet, bağımlılıkların bağımlılıkları da dahil olmak üzere bir projenin bağımlı olduğu tüm paketleri analiz eder. Bir paketin birden çok sürümü algılandığında kurallar bir tane seçmek için değerlendirilir. Aynı uygulamada bir derlemenin yan yana sürümlerini çalıştırmak .NET'te sorunlu olduğundan paketlerin birleştirilmesi gerekir.

Çoğu baklava bağımlılığı kolayca çözülür; ancak, belirli durumlarda sorunlar oluşturabilirler:

  • Çakışan NuGet paket başvuruları , paket geri yükleme sırasında bir sürümün çözümlenmesini engeller.
  • Sürümler arasındaki değişikliklerin bozulması, çalışma zamanında hatalara ve özel durumlara neden olur.
  • Paket derlemesinin adı güçlü, derleme sürümü değişti ve uygulama .NET Framework üzerinde çalışıyor. Derleme bağlama yeniden yönlendirmeleri gereklidir.

Kendi paketlerinizle birlikte hangi paketlerin kullanılacağını bilmek mümkün değildir. Kitaplığınızı bozan elmas bağımlılığı olasılığını azaltmanın iyi bir yolu, bağımlı olduğunuz paket sayısını en aza indirmektir.

✔️ DO, gereksiz bağımlılıklar için .NET kitaplığınızı gözden geçirin.

NuGet bağımlılık sürümü aralıkları

Paket başvurusu, izin verdiği geçerli paket aralığını belirtir. Genellikle proje dosyasındaki paket başvuru sürümü en düşük sürümdür ve en yüksek sürüm yoktur.

<!-- Accepts any version 1.0 and above. -->
<PackageReference Include="ExamplePackage" Version="1.0" />

NuGet'in bağımlılıkları çözerken kullandığı kurallar karmaşıktır, ancak NuGet varsayılan olarak en düşük geçerli sürümü arar. NuGet, kullanılabilir en yüksek sürümü kullanmak yerine en düşük geçerli sürümü tercih eder çünkü en düşük sürüm en az uyumluluk sorunlarına sahip olur.

NuGet'in en düşük geçerli sürüm kuralı nedeniyle, en son sürümü almaktan kaçınmak için paket başvurularına üst sürüm veya tam aralık yerleştirmek gerekmez. NuGet zaten sizin için en düşük, en uyumlu sürümü bulmaya çalışır.

<!-- Accepts 1.0 up to 1.x, but not 2.0 and higher. -->
<PackageReference Include="ExamplePackage" Version="[1.0,2.0)" />

<!-- Accepts exactly 1.0. -->
<PackageReference Include="ExamplePackage" Version="[1.0]" />

Üst sürüm sınırları, çakışma olması durumunda NuGet'in başarısız olmasına neden olur. Örneğin, bir kitaplık tam olarak 1.0 değerini kabul ederken, başka bir kitaplık için 2.0 veya üzeri gerekir. Sürüm 2.0'da hataya neden olan değişiklikler yapılmış olsa da, katı veya üst sınır sürüm bağımlılığı bir hatayı garanti eder.

Diamond dependency conflict

❌ En düşük sürümü olmayan NuGet paket başvuruları DEĞİlDİ.

❌ Tam sürüm gerektiren NuGet paket başvurularından KAÇıNıN.

❌ Sürüm üst sınırı olan NuGet paket başvurularından KAÇıNıN.

Daha fazla bilgi için bkz . Paket sürümü oluşturma.

NuGet paylaşılan kaynak paketleri

Dış NuGet paketi bağımlılıklarını azaltmanın bir yolu, paylaşılan kaynak paketlerine başvurmaktır. Paylaşılan kaynak paketi, başvurulduğunda projeye dahil edilen kaynak kodu dosyalarını içerir. Yalnızca projenizin geri kalanıyla derlenmiş kaynak kodu dosyalarını dahil ettiğiniz için, dış bağımlılık ve çakışma olasılığı yoktur.

Paylaşılan kaynak paketleri, küçük işlevler dahil olmak üzere harikadır. Örneğin, HTTP çağrıları yapmak için yardımcı yöntemlerin paylaşılan bir kaynak paketine başvurabilirsiniz.

Shared source package

<PackageReference Include="Microsoft.Extensions.Buffers.Testing.Sources" PrivateAssets="All" Version="1.0" />

Shared source project

Paylaşılan kaynak paketlerinin bazı sınırlamaları vardır. Bunlara yalnızca tarafından PackageReferencebaşvurulabilir, bu nedenle eski packages.config projeler dışlanır. Ayrıca, paylaşılan kaynak paketleri yalnızca aynı dile sahip projeler tarafından kullanılabilir. Bu sınırlamalar nedeniyle, paylaşılan kaynak paketleri en iyi şekilde açık kaynak proje içindeki işlevleri paylaşmak için kullanılır.

✔️ Küçük, iç işlev parçaları için paylaşılan kaynak paketlerine başvurmayı GÖZ ÖNÜNDE BULUNDURUN.

✔️ Küçük, iç işlev parçaları sağlıyorsa paketinizi paylaşılan bir kaynak paketi haline getirebilirsiniz.

✔️ DO, ile paylaşılan kaynak paketlerine başvurur PrivateAssets="All".

Bu ayar NuGet'e paketin yalnızca geliştirme zamanında kullanılacağını ve genel bağımlılık olarak sunulmaması gerektiğini bildirir.

❌ Ortak API'nizde paylaşılan kaynak paket türleri YOKTUR.

Paylaşılan kaynak türleri başvuran derlemede derlenir ve derleme sınırları arasında değiştirilemez. Örneğin, bir projedeki paylaşılan kaynak IRepository türü, başka bir projedeki aynı paylaşılan kaynaktan IRepository ayrı bir türdür. Paylaşılan kaynak paketlerindeki türlerin görünürlüğü internal olmalıdır.

❌ paylaşılan kaynak paketlerini NuGet.org yayımlamaYIN.

Paylaşılan kaynak paketleri kaynak kodu içerir ve yalnızca aynı dil türüne sahip projeler tarafından kullanılabilir. Örneğin, bir C# paylaşılan kaynak paketi bir F# uygulaması tarafından kullanılamaz.

Paylaşılan kaynak paketlerini projenizde dahili olarak kullanmak için yerel bir akışta veya MyGet'de yayımlayın.