Megosztás a következőn keresztül:


Függőségek

A függőségek .NET-kódtárakhoz való hozzáadásának elsődleges módja a NuGet-csomagokra való hivatkozás. A NuGet-csomaghivatkozások lehetővé teszik a már megírt funkciók gyors újrafelhasználását és használatát, de a .NET-fejlesztők gyakori súrlódási forrásai. A függőségek megfelelő kezelése azért fontos, hogy a többi .NET-kódtár módosításai ne törjenek meg a .NET-kódtárban, és fordítva!

Gyémántfüggőségek

A .NET-projektekben gyakran előfordul, hogy egy csomag több verziója is szerepel a függőségi fában. Egy alkalmazás például két NuGet-csomagtól függ, amelyek mindegyike ugyanannak a csomagnak egy másik verziójától függ. Már létezik gyémántfüggőség az alkalmazás függőségi gráfjában.

Diamond dependency

A NuGet a létrehozáskor elemzi az összes csomagot, amelytől egy projekt függ, beleértve a függőségek függőségeit is. Ha egy csomag több verzióját is észleli, a rendszer kiértékeli a szabályokat, hogy válasszon egyet. A csomagok egyesítése azért szükséges, mert egy szerelvény egymás melletti verzióinak futtatása ugyanabban az alkalmazásban problémás a .NET-ben.

A legtöbb gyémántfüggőség könnyen megoldható; bizonyos körülmények között azonban problémákat okozhatnak:

  • Az ütköző NuGet-csomaghivatkozások megakadályozzák , hogy egy verzió feloldódjon a csomag visszaállítása során.
  • A verziók közötti kompatibilitástörő változások futásidőben hibákat és kivételeket okoznak.
  • A csomagszerelvény neve erős, a szerelvény verziója megváltozott, és az alkalmazás .NET-keretrendszer fut. Szerelvénykötés-átirányításokra van szükség.

Nem lehet tudni, hogy milyen csomagokat fog használni a sajátjaival együtt. A kódtárat feltörő gyémántfüggőség valószínűségének csökkentésére jó módszer, ha minimalizálja a csomagok számát, amelyektől függ.

✔️ A DO tekintse át a .NET-kódtárat a szükségtelen függőségek miatt.

NuGet-függőség verziótartományai

A csomaghivatkozások az általa engedélyezett érvényes csomagok tartományát határozzák meg. A projektfájl csomaghivatkozási verziója általában a minimális verzió, és nincs maximális érték.

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

A NuGet által a függőségek feloldásakor használt szabályok összetettek, de a NuGet alapértelmezés szerint a legalacsonyabb alkalmazható verziót keresi. A NuGet a legalacsonyabb elérhető verziót részesíti előnyben a legmagasabb rendelkezésre állással szemben, mert a legalacsonyabb kompatibilitási problémákat tapasztalja.

A NuGet legalacsonyabb érvényes verziószabálya miatt nem szükséges felső vagy pontos tartományt elhelyezni a csomaghivatkozásokon a legújabb verzió beszerzésének elkerülése érdekében. A NuGet már megpróbálja megtalálni a legalacsonyabb, legkompatibilisebb verziót.

<!-- 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]" />

A felső verziókorlátok ütközés esetén a NuGet meghibásodását okozzák. Az egyik kódtár például pontosan az 1.0-t fogadja el, míg egy másik tárhoz 2.0-s vagy újabb kódtárra van szükség. Bár előfordulhat, hogy a 2.0-s verzióban kompatibilitástörő változások léptek fel, a szigorú vagy felső korlátú verziófüggőség hibát garantál.

Diamond dependency conflict

❌ NE rendelkezzen NuGet-csomaghivatkozásokkal minimális verzió nélkül.

❌ KERÜLJE a NuGet-csomaghivatkozásokat, amelyek pontos verziót igényelnek.

❌ KERÜLJE a NuGet-csomag hivatkozásait a felső korlátú verzióval.

További információ: Csomag verziószámozása.

NuGet megosztott forráscsomagok

A külső NuGet-csomagfüggőségek csökkentésének egyik módja a megosztott forráscsomagok hivatkozása. A megosztott forráscsomagok olyan forráskódfájlokat tartalmaznak, amelyek hivatkozáskor szerepelnek a projektben. Mivel csak olyan forráskódfájlokat tartalmaz, amelyek a projekt többi részével vannak lefordítva, nincs külső függőség és az ütközés esélye.

A megosztott forráscsomagok nagyszerűen használhatók kis funkciók beépítése céljából. Hivatkozhat például a HTTP-hívások indítására szolgáló segédmetenek egy megosztott forráscsomagjára.

Shared source package

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

Shared source project

A megosztott forráscsomagok bizonyos korlátozásokkal rendelkeznek. Ezekre csak hivatkozni PackageReferencelehet, így a régebbi packages.config projektek ki vannak zárva. Emellett a megosztott forráscsomagok csak azonos nyelvű projektek által használhatók. A korlátozások miatt a megosztott forráscsomagok a legjobban a nyílt forráskódú projektek funkcióinak megosztására használhatók.

✔️ FONTOLJA meg a megosztott forráscsomagok hivatkozását kis, belső funkciókhoz.

✔️ Fontolja meg, hogy a csomag megosztott forráscsomag legyen, ha kis, belső funkciókat biztosít.

✔️ DO referencia megosztott forráscsomagok a PrivateAssets="All".

Ez a beállítás azt jelzi a NuGetnek, hogy a csomag csak fejlesztési időben használható, és nem szabad nyilvános függőségként elérhetővé tenni.

❌ NE használjon megosztott forráscsomagtípusokat a nyilvános API-ban.

A megosztott forrástípusok a hivatkozási szerelvénybe vannak lefordítva, és nem cserélhetők át a szerelvényhatárokon. Egy projekt megosztott forrástípusa IRepository például egy másik projekt ugyanazon megosztott forrásától IRepository eltérő típus. A megosztott forráscsomagok típusainak láthatósággal internal kell rendelkezniük.

❌ NE tegye közzé a megosztott forráscsomagokat a NuGet.org.

A megosztott forráscsomagok forráskódot tartalmaznak, és csak azonos nyelvű projektek használhatják. Egy megosztott C#-forráscsomagot például nem használhat F#-alkalmazás.

Megosztott forráscsomagokat tehet közzé egy helyi hírcsatornában vagy a MyGetben , hogy a projekten belül felhasználhassa őket.