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


Több .NET-verzió támogatása

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:

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.