Próbuję zbudować rozwiązanie z packages
brakującą zawartością (z wyjątkiem repositories.config
wewnątrz) z MSBuild 12.0. Spodziewam się, że automatycznie przywróci wszystkie brakujące pakiety przed rozpoczęciem budowania, ale tak nie jest - MsBuild zgłasza mnóstwo błędów:
„Czy brakuje ci dyrektywy using lub odwołania do zestawu?”
Menedżer NuGet to 2,7 (widzę to w programie Visual Studio 2013 o polu). Próbowałem nawet przekazać EnableNuGetPackageRestore=true
parametr - bez powodzenia. czego mi brakuje?
Odpowiedzi:
ZAKTUALIZOWANO o najnowszą oficjalną dokumentację NuGet od wersji 3.3.0
Podejścia do przywracania pakietów
źródło
Jeśli używasz programu Visual Studio 2017 lub nowszego, który jest dostarczany z programem
PackageReference
MSBuild 15 lub nowszym, a pliki .csproj są w nowym formacie , najprostszą metodą jest użycie nowego elementuRestore
docelowego MSBuild .Nikt tak naprawdę nie odpowiedział na pierwotne pytanie, które brzmi: „Jak uzyskać automatyczne przywracanie pakietów NuGet podczas kompilowania z wiersza polecenia za pomocą programu MSBuild?” Odpowiedź brzmi: jeśli nie używasz opcji „Włącz przywracanie pakietu NuGet” (która jest obecnie przestarzała zgodnie z tym odniesieniem ), nie możesz (ale zobacz poniżej). Jeśli próbujesz np. Zautomatyzować kompilacje na serwerze CI, jest to do bani.
Istnieje jednak nieco okrężny sposób na uzyskanie pożądanego zachowania:
nuget restore
który automatycznie pobierze wszystkie brakujące pakiety.msbuild
aby zbudować swoje rozwiązanie.Poza tym: podczas gdy nowy i zalecany sposób automatycznego przywracania pakietów wiąże się z mniejszym bałaganem w kontroli wersji, uniemożliwia również przywracanie pakietów z wiersza poleceń, chyba że przeskoczysz przez dodatkową pętlę pobierania i uruchamiania
nuget.exe
. Postęp?źródło
nuget.exe
w / trunk / ext). Jeden krok do przodu - dwa kroki do tyłu :(Automatyczne przywracanie pakietu Nuget to funkcja programu Visual Studio (od 2013 r.), A nie MSBuild. Będziesz musiał uruchomić,
nuget.exe restore
jeśli chcesz przywrócić pakiety z wiersza poleceń.Możesz również użyć funkcji Włącz przywracanie pakietu Nuget, ale nie jest to już zalecane przez osoby nuget, ponieważ wprowadza uciążliwe zmiany w plikach projektu i może powodować problemy, jeśli utworzysz te projekty w innym rozwiązaniu.
źródło
Zajęło mi trochę czasu, zanim zrozumiałem cały obraz i chciałbym się tutaj podzielić.
Program Visual Studio ma dwa podejścia do korzystania z przywracania pakietów: automatyczne przywracanie pakietów i przywracanie pakietów zintegrowane z programem MSBuild. „Przywracanie pakietów zintegrowanych z programem MSBuild” przywraca pakiety W TRAKCIE procesu tworzenia, które mogą powodować problemy w niektórych scenariuszach. „Automatyczne przywracanie pakietu” to zalecane podejście zespołu NuGet.
Aby „Automatyczne przywracanie pakietów” działało, należy wykonać kilka czynności:
W programie Visual Studio Narzędzia -> Rozszerzenia i aktualizacje Uaktualnij pakiet NuGet, jeśli istnieje nowsza wersja (wersja 2.7 lub nowsza)
Jeśli używasz programu TFS, w folderze .nuget rozwiązania usuń pliki NuGet.exe i NuGet.targes. Następnie edytuj NuGet.Config, aby nie sprawdzać pakietów NuGet:
Jeśli wcześniej zaznaczyłeś folder pakietów rozwiązania do TFS, usuń folder i zaznacz opcję usunięcia usunięcia folderu pakietu.
Jeśli nie używasz TFS, usuń folder .nuget.
W każdym pliku projektu (.csproj lub .vbproj) w rozwiązaniu usuń wiersz odwołujący się do pliku NuGet.targets. Odniesienie wygląda następująco:
Usuń ten wiersz z każdego pliku projektu w rozwiązaniu.
W menu programu Visual Studio za pośrednictwem
Narzędzia -> Opcje -> Menedżer pakietów -> Ogólne lub Narzędzia -> Menedżer pakietów NuGet -> Ustawienia Menedżera pakietów
włącz następujące dwie opcje 1) „Zezwalaj NuGet na pobieranie brakujących pakietów” 2) „Automatycznie sprawdzaj brakujące pakiety podczas kompilacji w programie Visual Studio”
Przetestuj konfigurację przywracania pakietów, wykonując następujące kroki
źródło
MSBuild 15 ma opcję / t: Restore , która to robi. jest dostarczany z programem Visual Studio 2017.
Jeśli chcesz tego użyć, musisz również użyć nowego PackageReference , co oznacza zastąpienie
packages.config
pliku takimi elementami (zrób to w * .csproj):Istnieje automatyczna migracja do tego formatu, jeśli klikniesz prawym przyciskiem myszy `` Referencje '' (może się nie pojawić, jeśli właśnie otworzyłeś Visual Studio, przebudowałeś lub otworzyłeś okno `` Zarządzaj pakietami NuGet dla rozwiązania '' i zacznie się pojawiać).
źródło
Ian Kemp ma odpowiedź (przy okazji ma kilka punktów), jest to po prostu dodanie mięsa do jednego ze swoich kroków.
Powodem, dla którego tu trafiłem, było to, że maszyny deweloperów budowały się dobrze, ale serwer kompilacji po prostu nie ściągał wymaganych pakietów (pusty folder pakietów) i dlatego kompilacja kończyła się niepowodzeniem. Jednak zalogowanie się do serwera kompilacji i ręczne zbudowanie rozwiązania zadziałało.
Aby wykonać drugi z 3-punktowych kroków Ians (uruchamianie przywracania nuget ), można utworzyć element docelowy MSBuild z uruchomionym poleceniem exec, aby uruchomić polecenie przywracania NuGet, jak poniżej (w tym przypadku plik NuGet.exe znajduje się w folderze .nuget, a nie na ścieżce), który można następnie uruchomić w kroku kompilacji TeamCity (dostępne inne CI ...) bezpośrednio przed budowaniem rozwiązania
Dla przypomnienia, wypróbowałem już typ runnera „nuget installer”, ale ten krok zawieszał się w projektach internetowych (działał dla projektów DLL i Windows)
źródło
Zwróć uwagę, że jeśli używasz TeamCity jako serwera kompilacji, uzyskasz krok „Instalator NuGet”, którego możesz użyć do przywrócenia wszystkich pakietów przed krokiem kompilacji.
źródło
Istnieje plik packages.config z projektem, zawiera on szczegóły pakietu.
Istnieje również folder .nuget zawierający pliki NuGet.exe i NuGet.targets . jeśli brakuje któregokolwiek z plików, nie przywróci brakującego pakietu i spowoduje, że „brakuje dyrektywy using lub odwołania do zestawu?” błąd
źródło
.nuget
folderu i nigdy nie było. Wszystkiepackages.config
pliki w folderach projektu są na swoich miejscach.Czasami zdarza się to, gdy folder pakietu, który próbujesz przywrócić, znajduje się w folderze „packages” (np. „Packages / EntityFramework.6.0.0 /” ), ale nie ma w nim plików „DLL” (większość funkcji kontroli wersji systemy automatycznie ignorują pliki „.dll”). Dzieje się tak, ponieważ zanim NuGet spróbuje przywrócić każdy pakiet, sprawdza, czy foldery już istnieją, więc jeśli istnieją, NuGet zakłada, że „dll” znajduje się w nim. Jeśli więc jest to problem, po prostu usuń folder, który NuGet przywróci go poprawnie.
źródło
Wystąpił problem z pakietami NuGet, które nie były dołączane do nocnej kompilacji skryptowej, która tworzy plik sln przy użyciu devenv.exe.
Postępowałem zgodnie z radą Microsoftu , a kluczowym krokiem było zaktualizowanie konfiguracji NuGet
%AppData%/NuGet
tak, aby zawierała:źródło
W programie Visual Studio 2017 - podczas kompilowania przy użyciu środowiska IDE - pobierze wszystkie brakujące pakiety NuGet i zapisze w folderze „packages”.
Ale na maszynie kompilacji kompilacja została wykonana przy użyciu msbuild.exe. W takim przypadku pobrałem plik nuget.exe i zachowałem ścieżkę.
Podczas każdego procesu kompilacji przed uruchomieniem msbuild.exe. Uruchomi się -> nuget.exe przywróci plik NAZWA_F_SLN (jeśli jest tylko jeden plik .SLN, możesz zignorować ten parametr)
źródło
Możesz także użyć
aby przywrócić pakiety NuGet w konsoli zarządzania pakietami w programie Visual Studio.
źródło