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.
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.
❌ 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.
<PackageReference Include="Microsoft.Extensions.Buffers.Testing.Sources" PrivateAssets="All" Version="1.0" />
A megosztott forráscsomagok bizonyos korlátozásokkal rendelkeznek. Ezekre csak hivatkozni PackageReference
lehet, í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ólIRepository
eltérő típus. A megosztott forráscsomagok típusainak láthatósággalinternal
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.