Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Számos kódtár a .NET-keretrendszer egy adott verzióját célozza meg. Előfordulhat például, hogy a könyvtár egy, az UWP-hez tartozó verziója, egy másik verzió pedig a .NET-keretrendszer 4.6 funkcióit használja ki. Ennek érdekében a NuGet támogatja, hogy ugyanazon kódtár több verzióját egyetlen csomagban helyezze el.
Ez a cikk egy NuGet-csomag elrendezését ismerteti, függetlenül a csomag vagy szerelvények felépítésétől (azaz az elrendezés ugyanaz, akár több nem SDK-stílusú .csproj fájlt és egyéni .nuspec fájlt, akár egyetlen többhelyes SDK-stílusú .csproj fájlt használ). Egy SDK-stílusú projekt esetében a NuGet-csomag céljai tudják, hogyan kell elhelyezni a csomagot, és automatizálja a szerelvények megfelelő libmappákba helyezését és függőségi csoportok létrehozását minden cél-keretrendszerhez (TFM- hez). Részletes útmutatást a projektfájl több .NET-keretrendszerverziójának támogatása című témakörben talál.
A csomag létrehozása című cikkben ismertetett konvencióalapú munkakönyvtár-metódus használatakor manuálisan kell elhelyeznie a csomagot. SDK-stílusú projektek esetében az automatizált módszer használata javasolt, de dönthet úgy is, hogy manuálisan helyezi el a csomagot a cikkben leírtak szerint.
A keretrendszer verziómappáinak struktúrája
Ha olyan csomagot hoz létre, amely egy tárnak csak egy verzióját tartalmazza, vagy több keretrendszert céloz meg, az almappákat mindig különböző, kis- és nagybetűkre érzékeny keretrendszernevek használatával lib hozhatja létre az alábbi konvencióval:
lib\{framework name}[{version}]
A támogatott nevek teljes listájáért tekintse meg a Target Frameworks referenciáját.
Soha ne rendelkezzen a könyvtár olyan verziójával, amely nem tartozik egy keretrendszerhez, és közvetlenül a gyökérmappába lib kerül. (Ezt a képességet csak a packages.config támogatta.) Ezzel kompatibilissé tenné a kódtárat bármely cél-keretrendszerrel, és bárhol engedélyezné a telepítést, ami valószínűleg váratlan futtatókörnyezeti hibákat eredményezne. A gyökérmappában (például lib\abc.dll) vagy almappákban (például lib\abc\abc.dll) lévő összeállítások hozzáadása elavult, és a PackageReference formátum használatakor figyelmen kívül marad.
A következő mappastruktúra például egy szerelvény négy keretrendszer-specifikus verzióját támogatja:
\lib
\net46
\MyAssembly.dll
\net461
\MyAssembly.dll
\uap
\MyAssembly.dll
\netcore
\MyAssembly.dll
Ha a csomag létrehozásakor egyszerűen bele szeretné foglalni ezeket a fájlokat, használjon egy rekurzív ** helyettesítő karaktert a <files> szakaszában .nuspec:
<files>
<file src="lib\**" target="lib/{framework name}[{version}]" />
</files>
Architektúraspecifikus mappák
Ha architektúraspecifikus szerelvényeket, azaz különálló szerelvényeket használ, amelyek az ARM-et, az x86-ot és az x64-et célják, azokat egy elnevezett runtimes{platform}-{architecture}\lib\{framework} almappákban vagy {platform}-{architecture}\native almappákban kell elhelyezni. A következő mappastruktúra például a Windows 10-et és a uap10.0 keretrendszert célzó natív és felügyelt DLL-eket is magában foglalná:
\runtimes
\win10-arm
\native
\lib\uap10.0
\win10-x86
\native
\lib\uap10.0
\win10-x64
\native
\lib\uap10.0
Ezek a szerelvények csak futásidőben lesznek elérhetők; ha azonban a megfelelő fordítási idejű szerelvényt is biztosítani szeretné, akkor helyezze el az AnyCPU szerelvényt az /ref/{tfm} mappába.
Kérjük, vegye figyelembe, hogy a NuGet mindig egyetlen mappából választja ki ezeket a fordítási vagy futtatókörnyezeti objektumokat, így ha vannak kompatibilis eszközök /ref-ból, akkor /lib figyelmen kívül hagyja a fordítási idejű gyűjtemények hozzáadását. Hasonlóképpen, ha vannak kompatibilis eszközök /runtimes, akkor a futásidőben /lib is figyelmen kívül lesz hagyva.
Lásd UWP-csomagok létrehozása a fájloknak a .nuspec jegyzékben való hivatkozására vonatkozó példáért.
Lásd még: Windows Áruházbeli alkalmazásösszetevő csomagolása a NuGettel
A szerelvényverziók és a projekt cél keretrendszerének egyeztetése
Amikor a NuGet több szerelvényverzióval rendelkező csomagot telepít, a rendszer megpróbálja egyezni a szerelvény keretrendszernevével a projekt célkeretével.
Ha nem található egyezés, a NuGet a legmagasabb verzió szerelvényét másolja, amely kisebb vagy egyenlő a projekt cél keretrendszerével, ha elérhető. Ha nem található kompatibilis szerelvény, a NuGet egy megfelelő hibaüzenetet ad vissza.
Vegyük például a következő mappastruktúrát egy csomagban:
\lib
\net45
\MyAssembly.dll
\net461
\MyAssembly.dll
Ha a csomagot egy .NET-keretrendszer 4.6-os verzióját célzó projektbe telepíti, a NuGet telepíti a szerelvényt a net45 mappába, mert ez a legmagasabb elérhető verzió, amely kisebb vagy egyenlő a 4.6-nál.
Ha a projekt a .NET-keretrendszer 4.6.1-et célozza meg, a NuGet azonban telepíti a szerelvényt a net461 mappába.
Ha a projekt a .NET-keretrendszer 4.0-s és korábbi verzióit célozza meg, a NuGet egy megfelelő hibaüzenetet küld, amely nem találja a kompatibilis szerelvényt.
Szerelvények csoportosítása keretrendszerverzió szerint
A NuGet csak a csomag egyik könyvtármappájából másolja az összeállításokat. Tegyük fel például, hogy egy csomag a következő mappastruktúrával rendelkezik:
\lib
\net40
\MyAssembly.dll (v1.0)
\MyAssembly.Core.dll (v1.0)
\net45
\MyAssembly.dll (v2.0)
Ha a csomag olyan projektben van telepítve, amely a .NET-keretrendszer 4.5-ös verzióját célozza, MyAssembly.dll a (2.0-s verzió) az egyetlen telepített szerelvény.
MyAssembly.Core.dll A (1.0-s verzió) nincs telepítve, mert nem szerepel a net45 mappában. A NuGet így viselkedik, mert MyAssembly.Core.dll előfordulhat, hogy egyesült a 2.0-s MyAssembly.dllverzióval.
Ha a .NET-keretrendszer 4.5-ös verzióját szeretné MyAssembly.Core.dll telepíteni, helyezzen egy másolatot a net45 mappába.
Szerelvények csoportosítása keretrendszerprofil szerint
A NuGet egy adott keretrendszerprofil megcélzását is támogatja egy kötőjel és a profilnév hozzáfűzésével a mappa végéhez.
lib{framework name}-{profile}
A támogatott profilok a következők:
-
client: Ügyfélprofil -
full: Teljes profil -
wp:Windows Phone -
cf: Compact Framework
Függőségek deklarálása (Speciális)
Projektfájl csomagolásakor a NuGet megpróbálja automatikusan generálni a függőségeket a projektből. A . nuspec fájl függőségek deklarálásához való használatával kapcsolatos információk általában csak speciális forgatókönyvekhez szükségesek.
(2.0-s verzió+) Az elemen belüli elemek használatával <group> deklarálhatja a csomagfüggőségeket a célprojekt célkeretének megfelelő <dependencies> fájlban. További információ: függőségek elem.
Minden csoport rendelkezik egy elnevezett targetFramework attribútummal, és nulla vagy több <dependency> elemet tartalmaz. Ezek a függőségek együtt vannak telepítve, ha a cél keretrendszer kompatibilis a projekt keretrendszerprofiljával. A pontos keretrendszer-azonosítókért tekintse meg a cél-keretrendszereket .
Azt javasoljuk, hogy a lib/ és a ref/ mappában lévő fájlokhoz a Target Framework Moniker (TFM) szerint egy csoportot használjunk.
Az alábbi példa az <group> elem különböző változatait mutatja be:
<dependencies>
<group targetFramework="net472">
<dependency id="jQuery" version="1.10.2" />
<dependency id="WebActivatorEx" version="2.2.0" />
</group>
<group targetFramework="net20">
</group>
</dependencies>
A használni kívánt NuGet-cél meghatározása
A hordozható osztálytárat megcélzó kódtárak csomagolásakor bonyolult lehet meghatározni, hogy melyik NuGet-célhelyet érdemes használnia a mappanevekben és .nuspec a fájlban, különösen akkor, ha csak a PCL egy részhalmazát célozza meg. A következő külső erőforrások segítenek ebben:
- Keretrendszerprofilok a .NET-ben (stephencleary.com)
- Hordozható osztálykódtár-profilok (plnkr.co): A PCL-profilokat és az azzal egyenértékű NuGet-célokat felsoroló táblázat
- Portable Class Library profiles tool (github.com): parancssori eszköz a rendszeren elérhető PCL-profilok meghatározásához
Tartalomfájlok és PowerShell-szkriptek
Figyelmeztetés
A mutable tartalomfájlok és a szkriptek végrehajtása csak a packages.config formátummal érhető el; az összes többi formátum elavult, és nem használhatók új csomagokhoz.
A packages.configtartalomfájlok és a PowerShell-szkriptek cél-keretrendszer szerint csoportosíthatók ugyanazzal a mappakonvenciával a contenttools mappákon belül. Például:
\content
\net46
\MyContent.txt
\net461
\MyContent461.txt
\uap
\MyUWPContent.html
\netcore
\tools
init.ps1
\net46
install.ps1
uninstall.ps1
\uap
install.ps1
uninstall.ps1
Ha egy keretrendszermappát üresen hagy, a NuGet nem ad hozzá szerelvényhivatkozásokat vagy tartalomfájlokat, és nem futtatja az adott keretrendszerHez tartozó PowerShell-szkripteket.
Megjegyzés:
Mivel init.ps1 a végrehajtás a megoldás szintjén történik, és nem a projekttől függ, közvetlenül a tools mappába kell helyezni. A rendszer figyelmen kívül hagyja, ha egy keretrendszermappába helyezi.