Központi csomagkezelés (CPM)
A függőségkezelés a NuGet alapvető funkciója. Egy projekt függőségeinek kezelése egyszerű lehet. A többprojektes megoldások függőségeinek kezelése nehéznek bizonyulhat, amikor elkezdenek méretezni és összetettebbé tenni őket. Olyan helyzetekben, amikor számos különböző projekt közös függőségeit kezeli, a NuGet központi csomagkezelési (CPM) funkcióival mindezt egyetlen helyről végezheti el.
A NuGet-csomagfüggőségeket korábban két helyen kezelték:
-
packages.config
– Régebbi projekttípusokban használt XML-fájl a projekt által hivatkozott csomagok listájának fenntartásához. -
<PackageReference />
– Az MSBuild-projektekben használt XML-elem határozza meg a NuGet-csomag függőségeit.
A NuGet 6.2 kezdve központilag kezelheti a projektek függőségeit egy Directory.Packages.props
fájl és egy MSBuild tulajdonság hozzáadásával.
A funkció az összes NuGet-integrált eszközkészletben elérhető, kezdve az alábbi verziókkal.
A régebbi eszközök figyelmen kívül hagyják a központi csomagkezelési konfigurációkat és funkciókat. A funkció teljes körű használatához győződjön meg arról, hogy az összes buildkörnyezet a legújabb kompatibilis eszközverziókat használja.
A központi csomagkezelés az összes <PackageReference>
-alapú MSBuild-projektre vonatkozik (beleértve régi CSPROJ-) mindaddig, amíg kompatibilis eszközt használ.
Központi csomagkezelés engedélyezése
A központi csomagkezelés első lépéseihez létre kell hoznia egy Directory.Packages.props
fájlt az adattár gyökerében, és az MSBuild tulajdonság ManagePackageVersionsCentrally
true
értékre kell állítania.
Manuálisan is létrehozhatja, vagy használhatja a dotnet parancssori felületét:
dotnet new packagesprops
Ezután a projektekhez szükséges csomagverziókat <PackageVersion />
a csomagazonosítót és a verziót meghatározó elemek használatával határozza meg.
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
</Project>
Minden projekthez definiáljon egy <PackageReference />
, de hagyja ki a Version
attribútumot, mivel a verzió egy megfelelő <PackageVersion />
elemből lesz elérhető.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" />
</ItemGroup>
</Project>
Most központi csomagkezelést használ, és központi helyen kezeli a verziókat!
Központi csomagkezelési szabályok
A Directory.Packages.props
fájl számos szabállyal rendelkezik az adattár könyvtárában elfoglalt helyét és környezetét illetően. Az egyszerűség kedvéért a rendszer csak egy Directory.Packages.props
fájlt értékel ki egy adott projekthez.
Ez azt jelenti, hogy ha több Directory.Packages.props
fájl található az adattárban, a projekt könyvtárához legközelebbi fájl lesz kiértékelve. Ez lehetővé teszi az adattár különböző szintjein történő további vezérlést.
Íme egy példa, tekintsük át az alábbi adattárszerkezetet:
Repository
|-- Directory.Packages.props
|-- Solution1
|-- Directory.Packages.props
|-- Project1
|-- Solution2
|-- Project2
- A Project1 kiértékeli a
Directory.Packages.props
fájlt aRepository\Solution1\
könyvtárban, és szükség esetén manuálisan kell importálnia a következőt.<Project> <Import Project="$([MSBuild]::GetPathOfFileAbove(Directory.Packages.props, $(MSBuildThisFileDirectory)..))" /> <ItemGroup> <PackageVersion Update="Newtonsoft.Json" Version="12.0.1" /> </ItemGroup> </Project>
- A Project2 kiértékeli a
Directory.Packages.props
fájlt aRepository\
könyvtárban.
Megjegyzés: Az MSBuild nem importálja automatikusan Önnek mindegyik Directory.Packages.props
-t, csak az elsőt, amely a legközelebb van a projekthez. Ha több Directory.Packages.props
-ja van, manuálisan kell importálnia a szülőt, de a gyökér Directory.Packages.props
-re nem lesz szükség.
Kezdje el
A tárhely teljes integrálásához fontolja meg az alábbi lépéseket:
- Hozzon létre egy új fájlt a
Directory.Packages.props
nevű adattár gyökerénél, amely deklarálja a központilag definiált csomagverziókat, és állítsa az MSBuild tulajdonságManagePackageVersionsCentrally
true
értékre. - Jelentse be a
<PackageVersion />
elemeket aDirectory.Packages.props
. - Deklaráljon
<PackageReference />
elemeketVersion
attribútumok nélkül a projektfájlokban.
A központi csomagkezelés megjelenésének megismeréséhez tekintse meg minta adattárunkat.
Tranzitív rögzítés
A tranzitív csomagverziók automatikusan felülbírálhatók explicit legfelső szintű <PackageReference />
nélkül is, ha egy tranzitív rögzítésnek nevezett funkciót választ. Ez a tranzitív függőséget egy legfelső szintű függőséggé előlépteti, ha szükséges, hallgatólagosan az Ön nevében.
Vegye figyelembe, hogy a csomag átmeneti rögzítése esetén a verziócsökkentések engedélyezettek. Ha egy csomagot a függőségei által kértnél alacsonyabb verzióra próbál rögzíteni, a visszaállítás NU1109 hibát okoz.
Ezt a funkciót úgy engedélyezheti, hogy az MSBuild tulajdonság CentralPackageTransitivePinningEnabled
értékét true
-re állítja egy projektben, vagy egy Directory.Packages.props
vagy Directory.Build.props
importfájlban.
<PropertyGroup>
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
</PropertyGroup>
Tranzitív rögzítés és csomagolás
Ha egy csomag tranzitív módon van rögzítve, a projekt a függőségek által kértnél magasabb értéket használ. Ha a projektből csomagot hoz létre, annak érdekében, hogy a csomag működjön, a NuGet a tranzitív függőségeket kifejezetten függőségként fogja megjelölni a nuspec fájlban.
Az alábbi példában PackageA 1.0.0
függ a PackageB 1.0.0
.
<Project>
<ItemGroup>
<PackageVersion Include="PackageA" Version="1.0.0" />
<PackageVersion Include="PackageB" Version="2.0.0" />
</ItemGroup>
</Project>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="PackageA" />
</ItemGroup>
</Project>
Ha a csomagparancs használatával hoz létre csomagot, mindkét csomag megjelenik a függőségi csoportban.
<group targetFramework="net6.0">
<dependency id="PackageA" version="1.0.0" exclude="Build,Analyzers" />
<dependency id="PackageB" version="2.0.0" exclude="Build,Analyzers" />
</group>
Emiatt a tranzitív rögzítést alaposan ki kell értékelni egy könyvtár létrehozásakor, mivel olyan függőségekhez vezethet, amire nem számítottál.
Csomagverziók felülírása
Az egyes csomag verzióját felülbírálhatja úgy, hogy használja a VersionOverride
tulajdonságot egy <PackageReference />
elemen. Ez felülírja a központilag definiált <PackageVersion />
-t.
<Project>
<ItemGroup>
<PackageVersion Include="PackageA" Version="1.0.0" />
<PackageVersion Include="PackageB" Version="2.0.0" />
</ItemGroup>
</Project>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="PackageA" VersionOverride="3.0.0" />
</ItemGroup>
</Project>
Úgy tilthatja le ezt a funkciót, hogy beállítja az MSBuild tulajdonságot CentralPackageVersionOverrideEnabled
értékét false
-re egy projektben vagy egy Directory.Packages.props
vagy Directory.Build.props
importálási fájlban.
<PropertyGroup>
<CentralPackageVersionOverrideEnabled>false</CentralPackageVersionOverrideEnabled>
</PropertyGroup>
Amikor ez a funkció le van tiltva, bármely <PackageReference />
elemhez való VersionOverride
megadása visszaállításkor hibát eredményez, amely jelzi, hogy a funkció le van tiltva.
Központi csomagkezelés letiltása
Ha egy adott projekt központi csomagkezelését szeretné letiltani, letilthatja az MSBuild tulajdonság ManagePackageVersionsCentrally
beállításával false
:
<PropertyGroup>
<ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally>
</PropertyGroup>
Globális csomaghivatkozások
Jegyzet
Ez a funkció csak a Visual Studio 2022 17.4-s vagy újabb verziójában, a .NET SDK 7.0.100.preview7 vagy újabb verziójában, valamint a NuGet 6.4 vagy újabb verziójában érhető el.
A rendszer globális csomaghivatkozást használ annak megadására, hogy egy csomagot egy adattár minden projektje használjon. Ide tartoznak azok a csomagok, amelyek verziószámozást végeznek, kibővítik a buildet, vagy az összes projekthez szükséges egyéb csomagokat. Globális csomaghivatkozások kerülnek a PackageReference elemcsoportba a következő metaadatokkal:
IncludeAssets="Runtime;Build;Native;contentFiles;Analyzers"
Ez biztosítja, hogy a csomagot csak fejlesztési függőségként használják, és megakadályozza a fordítási idő alatti szerelvényhivatkozásokat.PrivateAssets="All"
Ez megakadályozza, hogy a globális csomaghivatkozásokat az alsóbb rétegbeli függőségek átvenjék.
GlobalPackageReference
elemeket a Directory.Packages.props
-be kell helyeznie, hogy minden projekt használhassa az adattárban.
<Project>
<ItemGroup>
<GlobalPackageReference Include="Nerdbank.GitVersioning" Version="3.5.109" />
</ItemGroup>
</Project>
Figyelmeztetés több csomagforrás használatakor
Központi csomagkezelés használatakor NU1507
figyelmeztetés jelenik meg, ha több csomagforrás van definiálva a konfigurációban. A figyelmeztetés megoldásához képezze le a csomagforrásokat csomagforrás-leképezési vagy adjon meg egyetlen csomagforrást.
There are 3 package sources defined in your configuration. When using central package management, please map your package sources with package source mapping (https://aka.ms/nuget-package-source-mapping) or specify a single package source.
Jegyzet
A központi csomagkezelés aktív fejlesztés alatt áll. Nagyra értékeljük, hogy kipróbálta, és örömmel fogadunk bármilyen visszajelzést a NuGet/Homealatt.