Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Odwołania do pakietów, używając <PackageReference>
elementów MSBuild, określają zależności pakietów NuGet bezpośrednio w plikach projektu, w przeciwieństwie do oddzielnego packages.config
pliku. Korzystanie z funkcji PackageReference nie wpływa na inne aspekty narzędzia NuGet. Na przykład ustawienia w plikach NuGet.Config
, w tym źródła pakietów, są nadal stosowane zgodnie z wyjaśnieniem w dokumencie Typowe konfiguracje NuGet.
Za pomocą funkcji PackageReference można również użyć warunków programu MSBuild, aby wybrać odwołania do pakietów dla docelowych platform oraz innych grupowań. Umożliwia również precyzyjną kontrolę nad zależnościami i przepływem zawartości. (Zobacz: Aby uzyskać więcej informacji Pakiet NuGet i przywracanie jako cele programu MSBuild.)
Obsługa typów projektów
Domyślnie funkcja PackageReference jest używana w projektach .NET Core, projektach .NET Standard i projektach platformy UWP przeznaczonych dla systemu Windows 10 Build 15063 (aktualizacja dla twórców) i nowszych, z wyjątkiem projektów platformy UWP języka C++. Projekty programu .NET Framework obsługują metodę PackageReference, ale obecnie domyślnie jest to packages.config
wartość . Aby użyć PackageReference, zmigruj zależności do pliku projektu, a następnie usuń packages.config.
aplikacje ASP.NET dla pełnego .NET Framework obejmują tylko ograniczoną obsługę PackageReference. Typy projektów C++ i JavaScript nie są obsługiwane.
Dodawanie funkcji PackageReference
Dodaj zależność w pliku projektu przy użyciu następującej składni:
<ItemGroup>
<!-- ... -->
<PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" />
<!-- ... -->
</ItemGroup>
Kontrolowanie wersji zależności
Konwencja określania wersji pakietu jest taka sama jak przy użyciu packages.config
:
<ItemGroup>
<!-- ... -->
<PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" />
<!-- ... -->
</ItemGroup>
W powyższym przykładzie wersja 3.6.0 oznacza dowolną wersję>= 3.6.0 z preferencjami dla najniższej wersji, zgodnie z opisem w temacie Przechowywanie wersji pakietu.
Używanie funkcji PackageReference dla projektu bez zależności pakietów
Zaawansowane: jeśli w projekcie nie zainstalowano żadnych pakietów (brak funkcji PackageReferences w pliku projektu i brak pliku packages.config), ale chcesz przywrócić projekt jako styl PackageReference, możesz ustawić właściwość Project RestoreProjectStyle na wartość PackageReference w pliku projektu.
<PropertyGroup>
<!--- ... -->
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
<!--- ... -->
</PropertyGroup>
Może to być przydatne, jeśli odwołujesz się do projektów w stylu PackageReference (istniejące projekty w stylu csproj lub SDK). Umożliwi to, aby pakiety, do których odnoszą się te projekty, były również "przez translatywność" odwoływane przez Twój projekt.
PackageReference i źródła
W projektach PackageReference wersje zależności przechodnich są rozwiązywane w czasie przywracania. W związku z tym we wszystkich projektach PackageReference wszystkie źródła muszą być dostępne dla wszystkich przywracanych procesów.
Wersje zmiennoprzesuwne
Wersje dynamiczne są obsługiwane w:
<ItemGroup>
<!-- ... -->
<PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.*" />
<PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0-beta.*" />
<!-- ... -->
</ItemGroup>
Zarządzanie zależnościami zasobów
Może używasz zależności wyłącznie jako narzędzia do programowania i nie chcesz, aby była widoczna w projektach, które będą korzystać z twojego pakietu. W tym scenariuszu można użyć metadanych PrivateAssets
do kontrolowania tego zachowania.
<ItemGroup>
<!-- ... -->
<PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<!-- ... -->
</ItemGroup>
Następujące tagi metadanych kontrolują zasoby zależności:
Etykieta | opis | Wartość domyślna |
---|---|---|
Uwzględnij zasoby | Te zasoby zostaną zużyte | wszystkie |
Wyklucz zasoby | Te zasoby nie zostaną zużyte | Brak |
Zasoby prywatne | Te zasoby będą używane, ale nie będą przepływać do projektu nadrzędnego | contentfiles; Analizatory; budować |
Dozwolone wartości dla tych tagów są następujące; wiele wartości oddziela się średnikiem. Jednak tagi all
i none
muszą występować samodzielnie.
Wartość | opis |
---|---|
kompilowanie | Zawartość folderu lib i kontroluje, czy Twój projekt może zostać skompilowany względem zestawów w tym folderze. |
środowisko uruchomieniowe | Zawartość folderów lib i runtimes oraz kontrola, czy te zestawy zostaną skopiowane do katalogu wyjściowego kompilacji |
contentFiles | Zawartość folderu contentfiles |
build |
.props i .targets w folderze build |
buildMultitargeting |
(4.0).props i .targets w folderze buildMultitargeting , do określania celów dla wielu platform. |
buildTransitive | (5.0+) |
Analizatory | Analizatory .NET |
ojczysty | Zawartość folderu native |
Brak | Żaden z powyższych elementów nie jest używany. |
wszystkie | Wszystkie powyższe (z wyjątkiem none ) |
<ItemGroup>
<!-- ... -->
<!-- Everything except the content files will be consumed by the project -->
<!-- Everything except content files and analyzers will flow to the parent project-->
<PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0">
<IncludeAssets>all</IncludeAssets> <!-- Default is `all`, can be omitted-->
<ExcludeAssets>contentFiles</ExcludeAssets>
<PrivateAssets>contentFiles;analyzers</PrivateAssets>
</PackageReference>
<!-- ... -->
<!-- Everything except the compile will be consumed by the project -->
<!-- Everything except contentFiles will flow to the parent project-->
<PackageReference Include="Contoso.Utility.SomeOtherUsefulStuff" Version="3.6.0">
<ExcludeAssets>compile</ExcludeAssets>
<PrivateAssets>contentFiles</PrivateAssets>
</PackageReference>
<!-- ... -->
</ItemGroup>
Należy pamiętać, że ponieważ build
nie jest uwzględniony wraz z PrivateAssets
, cele i rekwizyty będą przepływać do projektu nadrzędnego. Rozważmy na przykład, że powyższe odwołanie jest używane w projekcie, który kompiluje pakiet NuGet o nazwie AppLogger. Aplikacja AppLogger może korzystać z elementów docelowych i rekwizytów z programu , ponieważ może korzystać z Contoso.Utility.UsefulStuff
aplikacji AppLogger.
Uwaga
Gdy developmentDependency
parametr jest ustawiony na true
w .nuspec
pliku, oznacza to pakiet jako zależność tylko do programowania, która uniemożliwia dołączanie pakietu jako zależność w innych pakietach. W przypadku elementu PackageReference (NuGet 4.8 lub nowszego)ta flaga oznacza również, że wykluczy zasoby czasu kompilacji z kompilacji. Aby uzyskać więcej informacji, zobacz Obsługa współzależności dla elementu PackageReference.
Dodawanie warunku dla PackageReference
Można użyć warunku, aby określić, czy pakiet jest dołączony; warunki te mogą korzystać z dowolnej zmiennej MSBuild lub zmiennej zdefiniowanej w pliku targets lub props. Jednak obecnie obsługiwana jest tylko zmienna TargetFramework
.
Załóżmy na przykład, że jest ona przeznaczona netstandard1.4
dla net452
elementu , ale ma zależność, która ma zastosowanie tylko dla net452
elementu . W takim przypadku nie chcesz, aby projekt korzystający z netstandard1.4
pakietu dodał tę niepotrzebną zależność. Aby temu zapobiec, należy określić warunek na PackageReference
w sposób następujący:
<ItemGroup>
<!-- ... -->
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" Condition="'$(TargetFramework)' == 'net452'" />
<!-- ... -->
</ItemGroup>
Pakiet utworzony przy użyciu tego projektu pokaże, że Newtonsoft.Json jest uwzględniony jako zależność tylko dla net452
docelowego.
Wynik zastosowania warunku na elemencie PackageReference przy użyciu Visual Studio 2017
Warunki można również zastosować na poziomie ItemGroup
i będą stosowane do wszystkich elementów podrzędnych PackageReference
.
<ItemGroup Condition = "'$(TargetFramework)' == 'net452'">
<!-- ... -->
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
<PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" />
<!-- ... -->
</ItemGroup>
GeneratePathProperty
Ta funkcja jest dostępna w wersji NuGet 5.0 lub nowszej oraz w programie Visual Studio 2019 16.0 lub nowszym.
Czasami pożądane jest odwołanie do plików w pakiecie z docelowego programu MSBuild.
W projektach opartych na packages.config
dane pakiety są instalowane w folderze względnie do pliku projektu. Jednak w elemencie PackageReference pakiety są wykorzystywane z folderu global-packages, którego lokalizacja może się różnić na różnych komputerach.
Aby wypełnić tę lukę, NuGet wprowadził właściwość wskazującą lokalizację, z której zostanie użyty pakiet.
Przykład:
<ItemGroup>
<PackageReference Include="Some.Package" Version="1.0.0" GeneratePathProperty="true" />
</ItemGroup>
<Target Name="TakeAction" AfterTargets="Build">
<Exec Command="$(PkgSome_Package)\something.exe" />
</Target>
Ponadto pakiet NuGet automatycznie wygeneruje właściwości pakietów zawierających folder tools.
<ItemGroup>
<PackageReference Include="Package.With.Tools" Version="1.0.0" />
</ItemGroup>
<Target Name="TakeAction" AfterTargets="Build">
<Exec Command="$(PkgPackage_With_Tools)\tools\tool.exe" />
</Target>
Właściwości programu MSBuild i tożsamości pakietów nie mają tych samych ograniczeń, więc tożsamość pakietu musi zostać zmieniona na nazwę przyjazną dla MSBuild, poprzedzoną słowem Pkg
.
Aby sprawdzić dokładną nazwę wygenerowanej właściwości, należy spojrzeć na wygenerowany plik nuget.g.props.
Aliasy packageReference
W niektórych rzadkich przypadkach różne pakiety będą zawierać klasy w tej samej przestrzeni nazw. Począwszy od NuGet 5.7 i Visual Studio 2019 Update 7, analogicznie do ProjectReference, PackageReference obsługuje Aliases
.
Domyślnie nie podano aliasów. Po określeniu aliasu wszystkie zespoły pochodzące z oznaczonego pakietu muszą być przywoływane z aliasem.
Możesz spojrzeć na przykładowe użycie w NuGet\Samples
W pliku projektu określ aliasy w następujący sposób:
<ItemGroup>
<PackageReference Include="NuGet.Versioning" Version="5.8.0" Aliases="ExampleAlias" />
</ItemGroup>
i w kodzie użyj go w następujący sposób:
extern alias ExampleAlias;
namespace PackageReferenceAliasesExample
{
...
{
var version = ExampleAlias.NuGet.Versioning.NuGetVersion.Parse("5.0.0");
Console.WriteLine($"Version : {version}");
}
...
}
Ostrzeżenia i błędy narzędzia NuGet
Ta funkcja jest dostępna w programie NuGet 4.3 lub nowszym oraz w programie Visual Studio 2017 15.3 lub nowszym.
W przypadku wielu scenariuszy pakowania i przywracania wszystkie ostrzeżenia i błędy NuGet są kodowane i zaczynają się od NU****
. Wszystkie ostrzeżenia i błędy narzędzia NuGet są wymienione w dokumentacji referencyjnej.
Program NuGet obserwuje następujące właściwości ostrzeżenia:
- TreatWarningsAsErrors, traktuj wszystkie ostrzeżenia jako błędy
-
WarningsAsErrors
, traktuj określone ostrzeżenia jako błędy -
NoWarn
, ukryj określone ostrzeżenia, w całym projekcie lub w całym pakiecie.
Przykłady:
<PropertyGroup>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
...
<PropertyGroup>
<WarningsAsErrors>$(WarningsAsErrors);NU1603;NU1605</WarningsAsErrors>
</PropertyGroup>
...
<PropertyGroup>
<NoWarn>$(NoWarn);NU5124</NoWarn>
</PropertyGroup>
...
<ItemGroup>
<PackageReference Include="Contoso.Package" Version="1.0.0" NoWarn="NU1605" />
</ItemGroup>
Pomijanie ostrzeżeń narzędzia NuGet
Chociaż zaleca się rozwiązanie wszystkich ostrzeżeń narzędzia NuGet podczas operacji pakowania i przywracania, w niektórych sytuacjach ich pominięcie może być uzasadnione. Aby stłumić ostrzeżenie w całym projekcie, rozważ wykonanie następujących czynności:
<PropertyGroup>
<PackageVersion>5.0.0</PackageVersion>
<NoWarn>$(NoWarn);NU5104</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Contoso.Package" Version="1.0.0-beta.1"/>
</ItemGroup>
Czasami ostrzeżenia dotyczą tylko określonego pakietu na grafie. Możemy bardziej selektywnie pominąć to ostrzeżenie, dodając NoWarn
na elemencie PackageReference.
<PropertyGroup>
<PackageVersion>5.0.0</PackageVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Contoso.Package" Version="1.0.0-beta.1" NoWarn="NU1603" />
</ItemGroup>
Pomijanie ostrzeżeń pakietu NuGet w programie Visual Studio
W programie Visual Studio można również pominąć ostrzeżenia za pośrednictwem środowiska IDE.
Blokowanie zależności
Ta funkcja jest dostępna w programie NuGet 4.9 lub nowszym oraz w programie Visual Studio 2017 15.9 lub nowszym.
Dane wejściowe do przywracania NuGet to zestaw elementów z pliku projektu (górnego poziomu lub bezpośrednich zależności), a dane wyjściowe obejmują pełne spektrum wszystkich zależności pakietu, w tym zależności przechodnie. Program NuGet próbuje zawsze utworzyć to samo pełne zamknięcie zależności pakietów, jeśli lista input PackageReference nie uległa zmianie. Istnieją jednak pewne scenariusze, w których nie można tego zrobić. Na przykład:
Kiedy używasz wersji pływających, takich jak
<PackageReference Include="My.Sample.Lib" Version="4.*"/>
. Chociaż w tym przypadku celem jest przejście na najnowszą wersję przy każdym przywracaniu pakietów, istnieją scenariusze, w których użytkownicy wymagają zablokowania grafu do określonej najnowszej wersji i przejścia do nowszej wersji, jeśli jest dostępna, po wyraźnym działaniu.Opublikowano nowszą wersję pakietu pasującą do wymagań wersji PackageReference. Na przykład
Dzień 1: jeśli określono,
<PackageReference Include="My.Sample.Lib" Version="4.0.0"/>
ale wersje dostępne w repozytoriach NuGet to 4.1.0, 4.2.0 i 4.3.0. W takim przypadku pakiet NuGet rozpoznałby wersję 4.1.0 (najbliższą minimalną wersję)Dzień 2. Opublikowano wersję 4.0.0. Narzędzie NuGet znajdzie teraz dokładne dopasowanie i rozpocznie rozpoznawanie do wersji 4.0.0
Dana wersja pakietu jest usuwana z repozytorium. Chociaż nuget.org nie zezwala na usuwanie pakietów, nie wszystkie repozytoria pakietów mają to ograniczenie. To spowoduje, że NuGet znajdzie najlepsze dopasowanie, gdy nie może rozpoznać usuniętej wersji.
Włączanie pliku blokady
Aby zachować pełne rozwiązanie zależności pakietów, możesz włączyć funkcję pliku blokady, ustawiając właściwość MSBuild RestorePackagesWithLockFile
dla projektu:
<PropertyGroup>
<!--- ... -->
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
<!--- ... -->
</PropertyGroup>
Jeśli ta właściwość jest ustawiona, przywracanie NuGet wygeneruje plik blokady — packages.lock.json
plik w katalogu głównym projektu, który zawiera listę wszystkich zależności pakietu.
Uwaga
Gdy projekt ma packages.lock.json
plik w katalogu głównym, plik blokady jest zawsze używany z przywracaniem, nawet jeśli właściwość RestorePackagesWithLockFile
nie jest ustawiona. Innym sposobem wyrażenia zgody na tę funkcję jest utworzenie pustego fikcyjnego pliku packages.lock.json
w katalogu głównym projektu.
restore
zachowanie z plikiem blokady
Jeśli plik blokady dla projektu jest obecny, NuGet używa tego pliku blokady do uruchomienia restore
. Narzędzie NuGet umożliwia szybkie sprawdzenie, czy w pliku projektu (lub plikach projektów zależnych) wystąpiły jakiekolwiek zmiany w zależnościach pakietu, a jeśli nie nastąpiły żadne zmiany, po prostu przywraca pakiety wymienione w pliku blokady. Nie ma ponownej oceny zależności pakietów.
Jeśli program NuGet wykryje zmianę zdefiniowanych zależności, jak wspomniano w plikach projektu, ponownie oceni wykres pakietu i zaktualizuje plik blokady, aby odzwierciedlić nowe zamknięcie pakietu dla projektu.
W przypadku ciągłej integracji/ciągłego wdrażania i innych scenariuszy, w których nie chcesz zmieniać zależności pakietów dynamicznie, możesz to zrobić, ustawiając lockedmode
na true
.
W przypadku dotnet.exe uruchom:
> dotnet.exe restore --locked-mode
W przypadku msbuild.exe uruchom polecenie:
> msbuild.exe -t:restore -p:RestoreLockedMode=true
Tę warunkową właściwość MSBuild można również ustawić w pliku projektu:
<PropertyGroup>
<!--- ... -->
<RestoreLockedMode>true</RestoreLockedMode>
<!--- ... -->
</PropertyGroup>
Jeśli tryb zablokowany to true
, przywracanie spowoduje odtworzenie dokładnie tych pakietów, które są wymienione w pliku blokady, albo zakończy się niepowodzeniem, jeśli po utworzeniu pliku blokady zaktualizowano zdefiniowane zależności pakietów dla projektu.
Dodaj plik blokady do swojego repozytorium źródłowego
Jeśli tworzysz aplikację, plik wykonywalny i projekt znajduje się na początku łańcucha zależności, to zaewidencjonuj plik blokady w repozytorium kodu źródłowego, aby NuGet mógł z niego korzystać podczas przywracania.
Jeśli jednak projekt jest projektem biblioteki, który nie jest dystrybuowany lub wspólnym projektem kodu, od którego zależą inne projekty, nie należy zaewidencjonować pliku blokady jako część kodu źródłowego. Nie ma żadnych szkód w zachowaniu pliku blokady, ale zablokowane zależności pakietów dla wspólnego projektu kodu mogą nie być używane, jak pokazano w pliku blokady, podczas przywracania/kompilowania projektu, który zależy od tego wspólnego projektu kodu.
Na przykład:
ProjectA
|------> PackageX 2.0.0
|------> ProjectB
|------>PackageX 1.0.0
Jeśli ProjectA
ma zależność od PackageX
wersji 2.0.0
i również odwołuje się do ProjectB
, który zależy od PackageX
wersji 1.0.0
, wtedy plik blokady dla ProjectB
wykaże zależność od PackageX
wersji 1.0.0
. Jednak, gdy ProjectA
zostanie skompilowany, jego plik blokady będzie zawierać zależność od PackageX
w wersji 2.0.0
, a nie 1.0.0
jak wymieniono w pliku blokady dla ProjectB
. W związku z tym plik blokady we wspólnym projekcie kodu ma niewielki wpływ na pakiety rozstrzygane dla projektów, które od niego zależą.
Blokowanie rozszerzalności pliku
Możesz kontrolować różne zachowania przywracania za pomocą pliku blokady, jak opisano poniżej:
opcja NuGet.exe | dotnet option (opcja dotnet) | Opcja równoważna programu MSBuild | opis |
---|---|---|---|
-UseLockFile |
--use-lock-file |
Przywróć pakiety z plikiem blokady | Wyraża zgodę na użycie pliku blokady. |
-LockedMode |
--locked-mode |
PrzywróćTrybZablokowany | Włącza tryb zablokowany na potrzeby przywracania. Jest to przydatne w scenariuszach ciągłej integracji/ciągłego wdrażania, w których mają być powtarzalne kompilacje. |
-ForceEvaluate |
--force-evaluate |
RestoreForceEvaluate | Ta opcja jest przydatna w przypadku pakietów z zmienną wersją zdefiniowaną w projekcie. Domyślnie przywracanie nuGet nie spowoduje automatycznej aktualizacji wersji pakietu po każdym przywróceniu, chyba że uruchomisz przywracanie za pomocą tej opcji. |
-LockFilePath |
--lock-file-path |
NuGetLockFilePath | Definiuje niestandardową lokalizację pliku blokady dla projektu. Domyślnie pakiet NuGet obsługuje packages.lock.json katalog główny. Jeśli masz wiele projektów w tym samym katalogu, pakiet NuGet obsługuje plik blokady specyficzny dla projektu packages.<project_name>.lock.json |
Rozwiązanie zależności NuGet
Narzędzie rozpoznawania zależności NuGet jest zgodne z 4 regułami zgodnie z opisem w dokumencie rozpoznawania zależności.
Aby zwiększyć wydajność i skalowalność operacji przywracania, algorytm przywracania został przepisany w wersji 6.12.
Od wersji 6.12 nowy algorytm przywracania jest domyślnie włączony dla wszystkich projektów PackageReference.
Chociaż nowy algorytm przywracania jest funkcjonalnie odpowiednikiem poprzedniego, podobnie jak w przypadku dowolnego oprogramowania, możliwe są błędy.
Aby przywrócić poprzednią implementację, ustaw właściwość MSBuild RestoreUseLegacyDependencyResolver
na true
.
Jeśli napotkasz błędy przywracania w wersji 6.12, .NET 9 lub 17.12, które nie były odtwarzane we wcześniejszych wersjach, zgłoś problem w usłudze GitHub. Wszelkie różnice między starymi i nowymi algorytmami mogą mieć różne skutki, takie jak podczas kompilacji lub w czasie wykonywania. Istnieje również prawdopodobieństwo, że zmiany nie prowadzą do błędów, ale są przywracane różne wersje pakietów. Jeśli uważasz, że może to mieć wpływ na jakiekolwiek zmiany, poniżej przedstawiono kroki, które można wykonać, aby sprawdzić, czy zmiany w algorytmie przywracania NuGet są główną przyczyną.
Przywracanie zapisuje wyniki w MSBuildProjectExtensionsPath
katalogu, które można porównać z nowymi i starymi algorytmami, aby znaleźć różnice.
Zazwyczaj jest to folder obj
twojej kompilacji.
Możesz użyć msbuild.exe
polecenia lub dotnet.exe
w następnych krokach.
- Usuń folder o nazwie
obj
dla swojego projektu. - Uruchom polecenie
msbuild -t:restore
- Zapisz zawartość
obj
obiektu w lokalizacji wskazującejnew
, że jest to zachowanie. - Uruchom
msbuild -t:restore -p:RestoreUseLegacyDependencyResolver="true"
- Zapisz zawartość
obj
w lokalizacji wskazującej, że jest to zachowanielegacy
. - Porównaj pliki w dwóch katalogach, szczególnie project.assets.json. Narzędzia, które mogą wyróżniać różnice, są szczególnie przydatne w tym przypadku (na przykład program Visual Studio Code, otwórz oba pliki i użyj prawym przyciskiem myszy przycisku "wybierz do porównania" i "porównaj z wybranym")
Jeśli zastosujesz się do powyższej metody, powinna być dokładnie 1 różnica między plikami project.assets.json
:
"projectStyle": "PackageReference",
+ "restoreUseLegacyDependencyResolver": true,
"fallbackFolders": [
Jeśli pojawią się jeszcze jakieś różnice, proszę zgłosić problem na GitHubie wraz ze wszystkimi szczegółami.
AssetTargetFallback
Właściwość AssetTargetFallback
umożliwia określenie dodatkowych zgodnych wersji frameworków dla projektów, do których odwołuje się Twój projekt, oraz pakietów NuGet używanych przez Twój projekt.
Jeśli określisz zależność pakietu za pomocą PackageReference
, ale ten pakiet nie zawiera zasobów zgodnych z docelowym frameworkiem Twojego projektu, właściwość AssetTargetFallback
zacznie odgrywać rolę. Zgodność przywoływanego pakietu jest ponownie zaznaczona przy użyciu każdej platformy docelowej określonej w elemencie AssetTargetFallback
.
Kiedy element project
lub package
jest odwoływany za pośrednictwem AssetTargetFallback
, zostanie wygenerowane ostrzeżenie o numerze NU1701.
Odwołaj się do poniższej tabeli, aby zobaczyć przykłady, jak AssetTargetFallback
wpływa na zgodność.
Struktura projektu | AssetTargetFallback | Struktury pakietów | Wynik |
---|---|---|---|
.NET Framework 4.7.2 | .NET Standard 2.0 | .NET Standard 2.0 | |
Aplikacja .NET Core 3.1 | .NET Standard 2.0, .NET Framework 4.7.2 | .NET Standard 2.0 | |
Aplikacja .NET Core 3.1 | .NET Framework 4.7.2 | Niekompatybilne, błąd z NU1202 |
|
Aplikacja .NET Core 3.1 | net472; net471 | .NET Framework 4.7.2 | .NET Framework 4.7.2 z NU1701 |
Można określić wiele struktur za pomocą ;
ogranicznika. Aby dodać strukturę rezerwową, możesz wykonać następujące czynności:
<AssetTargetFallback Condition=" '$(TargetFramework)'=='netcoreapp3.1' ">
$(AssetTargetFallback);net472;net471
</AssetTargetFallback>
Jeśli chcesz zastąpić istniejące wartości zamiast dodawać do nich, możesz pominąć $(AssetTargetFallback)
, aby nadpisać wartości AssetTargetFallback
.
Uwaga
Jeśli używasz projektu opartego na zestawie SDK platformy .NET, odpowiednie wartości są skonfigurowane i nie trzeba ich ustawiać ręcznie.
$(PackageTargetFallback)
była wcześniejszą funkcją, która próbowała rozwiązać to wyzwanie, ale jest fundamentalnie wadliwa i nie powinna być używana. Aby przeprowadzić migrację z $(PackageTargetFallback)
do $(AssetTargetFallback)
, po prostu zmień nazwę właściwości.
PrunePackageReference
Środowisko uruchomieniowe platformy .NET stale ewoluuje wraz z ulepszeniami wydajności i nowymi interfejsami API w każdej wersji.
W środowisku uruchomieniowym jest dostępnych wiele funkcji, ale także pakietów, takich jak System.Text.Json. Często może to prowadzić do System.Text.Json 8.0.0
w projekcie przeznaczonym na .NET 9
lub .NET 8
. Ta zależność jest niepotrzebna, a rozwiązywanie konfliktów podczas kompilacji nie będzie wykorzystywać zestawu z pakietu, ponieważ jest on już dostępny w środowisku uruchomieniowym .NET.
Począwszy od wersji 6.13 NuGet i .NET SDK 9.0.200, PrunePackageReference
umożliwia oczyszczanie tych pakietów podczas przywracania dla projektów opartych na .NET SDK.
Oczyszczanie pakietów jest dostępne jako funkcja wybierana z zestawem SDK .NET 9 i zostanie domyślnie włączona dla wszystkich frameworków .NET
i >= .NET Standard 2.0
począwszy od .NET 10 SDK.
Oczyszczanie pakietów jest dostępne tylko w przypadku domyślnego rozwiązania zależności, ponieważ został wydany w wersji 6.12.
Specyfikacja prunePackageReference
Lista pakietów do przycinania jest definiowana za pomocą elementu PrunePackageReference
.
Atrybuty | opis |
---|---|
Wersja | Określa maksymalną wersję do przycinania.
1.0.0 oznacza, że wszystkie pakiety do 1.0.0 zostaną oczyszczone. W przypadku 1.0.0 0.9.0 i 1.0.0 zostaną przycinane, ale 1.0.1 nie. |
Następujące właściwości mogą służyć do modyfikowania zachowania przycinania.
NazwaWłaściwości | opis |
---|---|
RestoreEnablePackagePruning | Włącza oczyszczanie pakietów dla pakietów określonych przy użyciu PrunePackageReference . Ta właściwość jest przypisana do platformy docelowej, a prawidłowe wartości to true i false . Wartości domyślne mogą się różnić w zależności od zestawu .NET SDK zgodnie z definicją powyżej. |
Zestaw SDK platformy .NET wstępnie określa listę pakietów, które mają zostać wyczyszczone.
Jak działa funkcja PrunePackageReference
Po określeniu pakietu, który ma zostać oczyszczony podczas przywracania, zostanie on usunięty z grafu zależności. Ten pakiet nie jest pobierany i nie jest wyświetlany w żadnym z danych wyjściowych narzędzia NuGet. Po oczyszczeniu pakietu jest wyświetlany szczegółowy komunikat wskazujący, że pakiet został usunięty dla danego docelowego środowiska.
Pruning jest obsługiwane tylko dla pakietów przechodnich, co oznacza pakiety, na które powołują się inne pakiety lub projekty. W poniższej tabeli przedstawiono różne zachowania oczyszczania pakietów.
Zarządzanie zależnościami | Zachowanie |
---|---|
Dopasowuje identyfikator pakietu przechodniego wchodzącego przez inny pakiet | Suszona śliwka |
Odpowiada identyfikatorowi pakietu przechodniego przechodzącego przez inny projekt | Suszona śliwka |
Pasuje do bezpośredniego identyfikatora PackageReference |
Podnieś ostrzeżenie NU1510 i nie przycinaj |
Dopasowuje się do identyfikatora ProjectReference |
Podnieś ostrzeżenie NU1511 i nie przycinaj |
Aplikacje PrunePackageReference
Zalety oczyszczania pakietów są dwojakie:
- Korzyści z wydajności dzięki zmniejszeniu liczby pakietów w grafie zależności
- Zmniejszenie liczby fałszywie dodatnich wyników przez skanery komponentów, na przykład
NuGetAudit
Przycinanie jest szczególnie przydatne, gdy audyt pakietów z NuGetAuditMode
jest ustawiony na all
. Jeśli używasz platformy .NET 9, zalecamy wypróbowanie oczyszczania, ustawiając RestoreEnablePackagePruning
na true
.