Ten projekt odwołuje się do pakietów NuGet, których brakuje na tym komputerze

313

Mam aplikację ASP.NET MVC5, która działała wczoraj i teraz otrzymuję ten błąd, gdy próbuję zbudować:

Ten projekt odwołuje się do pakietów NuGet, których brakuje na tym komputerze.

Mam zaznaczone dwie opcje, które pozwalają nugetowi automatycznie pobierać i instalować brakujące pakiety zaznaczone / włączone. Próbowałem też usunąć wszystkie pliki z folderu pakietów, a następnie nuget ponownie je pobrał. Również gdy otwieram nuget i szukam aktualizacji, mówi, że nie ma żadnych, które trzeba zainstalować. Nie mogę wymyślić, co jeszcze zrobić, aby wyjść poza ten niezwykle irytujący problem.

Austin Harris
źródło
1
Włączyłem także przywracanie nugetu, klikając projekt prawym przyciskiem myszy i wybierając tę ​​opcję. Następnie dodał folder nuget i trzy elementy w tym folderze i nie robi nic, aby rozwiązać problem. Próbowałem przebudować i nadal pojawia się ten sam błąd powyżej.
Austin Harris,
Czy Twoje rozwiązanie zawiera folder .nuget i czy zaktualizowałeś NuGet do najnowszej wersji? Zobacz tutaj: stackoverflow.com/questions/18833649/...
David Brabant,
Tak, wypróbowałem to i nie rozwiązało to problemu z komunikatem o błędzie kompilacji.
Austin Harris,
Innym powodem tego błędu jest The operation has timed out.błąd. podczas kompilacji. Musisz sprawdzić dziennik kompilacji lub kartę Diagnostyka na ekranie informacji o kompilacji programu Visual Studio Online nie powiodło się.
Joshua Drake
Żadne z rozwiązań nie działa dla mnie. Pobieram z repozytorium i paczki są przywracane w poprawnej strukturze plików dla pierwszego projektu, drugi projekt nie może ich znaleźć. Sprawdzanie .csproj pokazuje, że używana jest poprawna ścieżka względna, więc nie mogę spróbować tego rozwiązać. github.com/DanJ210/ProgrammersTest
Daniel Jackson

Odpowiedzi:

463

W moim przypadku musiałem usunąć z pliku .csproj:

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

W rzeczywistości w tym fragmencie możesz zobaczyć, skąd pochodzi komunikat o błędzie.

Byłem konwersji z MSBuild-Zintegrowanego Pakietu przywracania do automatycznej Pakietu Restore ( http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore )

Loren Paulsen
źródło
12
To działało dla mnie, ale potrzebowałem tylko usunąć element <Target> </Target>. VS [2013] wydawało się go przywracać, jeśli usunę również element <Import>.
Robert Taylor,
3
To jest naprawdę niewiarygodne. Dlaczego Microsoft sprawia, że ​​wszystko jest takie trudne?
dimiguel
10
jeśli można to usunąć, to po pierwsze?
OK999,
1
OK9999, w pewnym momencie, musisz go włączyć z wcześniejszej wersji programu Visual Studio, klikając prawym przyciskiem myszy rozwiązanie i wybierając „Włącz przywracanie pakietu NuGet”, co zrobiło to w stary sposób. Już tego nie potrzebujemy
Loren Paulsen,
3
Uwielbiam rozwiązania, które polegają tylko na usuwaniu rzeczy.
Todd Menier
86

Jednym rozwiązaniem byłoby usunięcie z pliku .csproj następujących elementów:

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

W jaki sposób?

  1. Kliknij projekt prawym przyciskiem myszy. Rozładuj projekt.
  2. Kliknij projekt prawym przyciskiem myszy. Edytuj csproj.
  3. Usuń część z pliku. Zapisać.
  4. Kliknij projekt prawym przyciskiem myszy. Załaduj ponownie projekt.
Ivan Santiago
źródło
Przenoszenie projektu z jednego miejsca do drugiego działa świetnie.
Dean Seo,
4
@IvanSantiago To było ODPOWIEDŹ powyżej z tym samym rozwiązaniem! .. Głosuj W DÓŁ! ..
Jack
2
@ClintEastwood Moja odpowiedź wyjaśnił JAK to zrobić. To jest różnica. Jeśli użytkownik szuka JAK ZROBIĆ, moja odpowiedź ma ją, w przeciwieństwie do powyższej odpowiedzi.
Ivan Santiago
2
@IvanSantiago Możesz: dodać go jako komentarz lub zredagować oryginalną odpowiedź w poradniku.
Colin
50

W moim przypadku stało się to po tym, jak przeniosłem folder rozwiązania z jednej lokalizacji do drugiej, trochę go ponownie uporządkowałem, a proces jego względnej struktury zmienił się.

Musiałem więc edytować wszystkie wpisy podobne do następującego w moim .csprojpliku z

  <Import Project="..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />

do

  <Import Project="packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />

(Zwróć uwagę na zmianę z ..\packages\na packages\. W twoim przypadku może to być inna struktura względna, ale masz pomysł.)

Nikita G.
źródło
3
Podobny problem .... Przeniosłem plik .csproj na wyższy poziom w strukturze katalogów i musiałem zmienić z „.. \ .. \ packages \ ...” na „.. \ packages \ ...”.
tmgirvin
2
Miałem podobny problem, ale naprawdę dziwny. Używałem go w module subskrypcji, więc było dobrze w tym rozwiązaniu, ale kiedy odniosłem się do tego rozwiązania z innego rozwiązania, pakiety były w innym miejscu. Zmieniłem .. \ pakiety na pakiety $ (SolutionDir) w całym .csproj i to naprawiło.
JoeNCA
2
Jeśli nie chcesz ręcznie zmieniać pliku .csproj, zauważyłem, że zanotowanie wszystkich pakietów nuget zainstalowanych dla projektu, usunięcie ich i ponowna instalacja rozwiązały dla mnie ten problem. Próbowałem usunąć projekt z rozwiązania, aby umieścić go we własnym repozytorium git, gdy natknąłem się na ten problem.
WiteCastle
czy to oznacza, że ​​Twój plik .csproj jest na tym samym poziomie co plik .sln?
Simon_Weaver
@Simon_Weaver pozycja twojego .csprojkrewnego względem ciebie .slnnie ma znaczenia w tym kontekście. Liczy się to, czy cokolwiek, do czego się odwołujesz, .csprojzostało przeniesione gdzie indziej. Jeśli tak, musisz to naprawić. Jeśli przeniosłeś swój „.csproj” z nienaruszonym wszystkim, do czego się odwołuje, ale zachowałeś .slngo tam, gdzie był, będziesz musiał naprawić .slnplik w nowej lokalizacji .csproj-es, ale nie będzie potrzeby edycji .csprojplików.
Nikita G.
22

I łatwo rozwiązać ten problem poprzez kliknięcie prawym przyciskiem myszy na moim roztwór, a następnie klikając na przycisk Włącz Nuget Pakiet Restore opcję

(PS: Upewnij się, że masz Nuget Install From Tools -> Extensions and Update -> Nuget Package Manager for Visual Studio 2013. Jeśli nie zainstalujesz tego rozszerzenia w pierwszej kolejności)

Mam nadzieję, że to pomoże.

MAMA
źródło
7
Jest to stary sposób przywracania pakietów nugetów i należy go unikać.
The Muffin Man,
2
@TheMuffinMan: Czy możesz wyjaśnić, jaki jest nowy sposób i dlaczego należy go unikać (biorąc pod uwagę, że dane wyjściowe błędu VS 2013 nakazują dokładnie to zrobić)?
CantrianBear,
2
@CantrianBear Przejdź do tej strony docs.nuget.org/consume/package-restore i znajdź sekcję o nazwie MSBuild-Integrated Package Restore. To stary sposób i podaje kilka powodów, dla których powinieneś używać nowego sposobu.
The Muffin Man,
Zobacz blog Davida Ebbo na blog.davidebbo.com/2014/01/ ... Teraz ... „NuGet zawsze przywraca pakiety przed budowaniem w VS.”
timB33
17

W moim przypadku miało to związek z wersją Microsoft.Build.Bcl. Moja wersja pakietu nuget to 1.0.21, ale moje pliki projektów wciąż wskazywały na wersję 1.0.14

Więc zmieniłem moje pliki .csproj z:

  <Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />
   <Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
    <Error Condition="!Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
    <Error Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
  </Target>

do:

 <Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
  <Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
    <Error Condition="!Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
    <Error Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />

Kompilacja znów działała.

henkie14
źródło
11

Jeśli używasz TFS

Usuń pliki NuGet.exei NuGet.targetsz .nugetfolderu rozwiązania . Upewnij się, że same pliki również zostały usunięte z obszaru roboczego rozwiązania. Zachowaj NuGet.Configplik, aby kontynuować pomijanie dodawania pakietów do kontroli źródła.

Edytuj każdy plik projektu (np. .Csproj, .vbproj) w rozwiązaniu i usuń wszelkie odniesienia do NuGet.targetspliku. Otwórz pliki projektu w wybranym edytorze i usuń następujące ustawienia:

<RestorePackages>true</RestorePackages>  
...
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />  
...
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">  
    <PropertyGroup>
        <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

Jeśli nie korzystasz z TFS

Usuń .nugetfolder ze swojego rozwiązania. Upewnij się, że sam folder jest również usunięty z obszaru roboczego rozwiązania.

Edytuj każdy plik projektu (np. .Csproj, .vbproj) w rozwiązaniu i usuń wszelkie odniesienia do NuGet.targetspliku. Otwórz pliki projektu w wybranym edytorze i usuń następujące ustawienia:

<RestorePackages>true</RestorePackages>  
...
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />  
...
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">  
    <PropertyGroup>
        <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

Odniesienie: Migracja rozwiązań zintegrowanych z MSBuild w celu użycia automatycznego przywracania pakietów

Baran
źródło
8

Czy to możliwe, że pakiety zostały przywrócone do niewłaściwego folderu? Sprawdź, czy ścieżki w plikach csproj są prawidłowe.

Jeśli są różne, może to być spowodowane przywróceniem pakietów do innej lokalizacji. Może to być spowodowane sprawdzaniem pliku NuGet.Config podczas określania takiego węzła:

<add key="repositoryPath" value="..\..\Packages" />

Pakiety są przywracane, ponieważ projekty wciąż patrzą na starą lokalizację.

infojolt
źródło
1
Wydaje mi się, że może to być problem ze ścieżką, ponieważ przesunąłem lokalizację plików, ale nie widzę nigdzie ścieżki zakodowanej na stałe. Zajrzałem do pliku proj i wszystkie pliki pakietów wydają się względne w następujący sposób: <Reference Include = "Antlr3.Runtime, Version = 3.5.0.2, Culture = neutralny, PublicKeyToken = eb42632606e9261f, ProcessorArchitecture = MSIL"> <SpecificVersion> False </SpecificVersion> <HintPath> .. \ packages \ Antlr.3.5.0.2 \ lib \ Antlr3.Runtime.dll </HintPath> </Reference>
Austin Harris
dodanie tego do web.config nie pomogło: <add key = "repositoryPath" wartość = ".. \ .. \ Packages" />
Austin Harris
Nie chcesz tego dodawać do pliku web.config. Miałem na myśli plik NuGet.config i chcesz sprawdzić ścieżkę względną. Gdzie są twoje pakiety w stosunku do plików csproj? Czy są w pakietach? Wygląda na to, że pakiety są przywracane poprawnie, ale twoje projekty wyglądają w niewłaściwym miejscu.
infojolt
6

Miałem ten sam problem. W moim przypadku zainstalowanie pakietu Microsoft.Bcl.Build rozwiązało problem.

mheyman
źródło
To również działało dla mnie - ale nie mam pojęcia, czy właściwą rzeczą było zainstalowanie tego pakietu (co ma taki sam efekt, jak zmiana wersji henkie14 poniżej lub po prostu usunięcie wszystkich tych celów - czy faktycznie robią coś pożytecznego?
Gaz
W 1.0.21wersji brak plików w pakiecie, instalacja 1.0.14wersji naprawiła to.
FLCL
4

Usunięto poniższe wiersze w pliku .csproj

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" 
Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
 <ErrorText>This project references NuGet package(s) that are missing on this computer. 
 Enable NuGet Package Restore to download them.  For more information, see 
 http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" 
Text="$([System.String]::Format('$(ErrorText)', 
'$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
Amila Thennakoon
źródło
3

Jednym rozwiązaniem byłoby usunięcie z pliku .csproj następujących elementów:

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />

Ten projekt odwołuje się do pakietów NuGet, których brakuje na tym komputerze. Włącz Przywracanie pakietu NuGet, aby je pobrać. Aby uzyskać więcej informacji, zobacz http://go.microsoft.com/fwlink/?LinkID=322105 . Brakującym plikiem jest {0}.

Umar Khaliq
źródło
1

Oto kroki, które zastosowałem, aby rozwiązać problem:

Aby dodać pakiety nuget do swojego rozwiązania:

  1. Kliknij prawym przyciskiem myszy projekt (nie rozwiązanie), do którego chcesz odwoływać się do pakietów nuget.
  2. Wybierz: Zarządzaj pakietami nuget
  3. W wyskakującym okienku po lewej stronie masz trzy możliwości. Jeśli wybierzesz Online> Microsoft i .NET , będziesz mógł zainstalować pakiet grupujący Microsoft ASP.NET Web API 2.2 (lub inny potrzebny pakiet - mój był).
  4. Teraz kliknij prawym przyciskiem myszy rozwiązanie (nie projekt) i wybierz opcję Włącz przywracanie pakietu nuget . Spowoduje to automatyczne pobranie pakietów podczas kompilacji.
użytkownik4569838
źródło
Wszystko, co musiałem zrobić, to włączyć przywracanie pakietu samorodków dla rozwiązania. Najwyraźniej wszystko inne zostało już poprawnie skonfigurowane.
schmiddy98
1

Dla mnie zadziałało, ponieważ właśnie skopiowałem folder .nuget z działającego rozwiązania do istniejącego i przywołałem jego zawartość!

meJustAndrew
źródło
1

Pierwszą rzeczą do spróbowania jest kliknięcie rozwiązania prawym przyciskiem myszy i wybranie „Przywróć pakiety Nuget”.

W moim przypadku to nie działało, więc postępowałem zgodnie z zaleceniami dotyczącymi usuwania plików „Importuj” i „Cel” z pliku projektu, działało to dla 2 z 3 moich projektów, ale w przypadku ostatniego wystąpił inny błąd.

Udało się otworzyć konsolę Menedżera pakietów i uruchomić:

Update-Package -reinstall -ProjectName MyProjectName

Zajmuje to trochę czasu, ale ponieważ ponowna instalacja wszystkich pakietów twój projekt skompiluje się bez problemów

Juan C. Calderon
źródło
1

Mam ten sam problem. Zetknąłem się z nim, gdy skopiowałem istniejący projekt i przeniosłem go do folderu z katalogu rozwiązania i dodałem jako istniejący projekt do mojego pustego rozwiązania. Więc muszę edytować mój plik csproj i szukać tego konkretnego wiersza kodu, przez większość czasu można go znaleźć w ostatnich wierszach:

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

Po tym wierszu muszę to skomentować:

  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.props'))" />
    <Error Condition="!Exists('..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets'))" />
  </Target>
  <Import Project="..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets" Condition="Exists('..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets')" />

Twoje rozwiązanie wyświetli monit o zmianę w projekcie, po prostu wybierz Przeładuj wszystko:

wprowadź opis zdjęcia tutaj Potem wszystko działa dobrze po przebudowaniu mojego rozwiązania.

Willy David Jr
źródło
0

Miałem ten sam problem, gdy odwołuję się do biblioteki Class w mojej aplikacji internetowej MVC,

problemem było niedopasowanie numeru wersji pakietu nuget między dwoma projektami.

np .: moja biblioteka klas miała log4net 1.2.3, ale moja aplikacja webowa miała 1.2.6

poprawka: upewnij się, że oba projekty mają ten sam numer wersji, do którego się odwołuje.

Srini
źródło
0

Edycja .sln i .csproj nie zawsze jest łatwa lub pożądana. Gdy pojawi się lista błędów, możesz zobaczyć, które projekty zawierają brakujące pakiety (węzeł Referencje zwykle wskazuje, że brakuje brakujących zestawów, chyba że pakiety to kod źródłowy, zasoby, obrazy lub tylko tekstowe).

Usuwanie, a następnie dodawanie pakietów nie jest dobrym pomysłem, chyba że używasz najnowszej wersji pakietu. W przeciwnym razie przygotuj się na niespodzianki, nie zawsze przyjemne.

Jeśli, powiedzmy, pakiet to EntityFramework, to z galerii NuGet otrzymujesz najnowszą wersję, która w momencie pisania tego komentarza to 6.1.3 .

Być może najbezpieczniejszym sposobem radzenia sobie z sytuacją jest przywracanie brakujących pakietów jeden po drugim. Tak, trochę bolesne ćwiczenie, ale ściganie subtelnych błędów z powodu innej wersji pakietu może być znacznie bardziej nieprzyjemne.

Powiedziawszy to i niech EntityFramework będzie brakującym pakietem, możesz wydać następujące polecenie w konsoli Menedżera pakietów:

PM> Install-Package EntityFramework -Version 6.0.1 

Spowoduje to zainstalowanie poprawnej wersji, czyli 6.0.1 , czyli tej, która jest określona w pakietach.config:

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="EntityFramework" version="6.0.1" targetFramework="net451" />
    </packages>
Alexander Christov
źródło
0

Miałem to, gdy pliki csproj i sln były w tym samym folderze (głupie, wiem). Kiedyś przeniosłem się do pliku SLN do folderu powyżej folderu csproj mój tak

David Christopher Reynolds
źródło
-1

Utworzyłem folder o nazwie „.nuget” w folderze głównym rozwiązania, a następnie dodałem plik „NuGet.Config” w tym folderze o następującej treści

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<solution>
 <add key="disableSourceControlIntegration" value="true" />
</solution>
</configuration>

Następnie utworzono plik „.nuGet.targets” jak poniżej $ (MSBuildProjectDirectory) .. \

    <!-- Enable the restore command to run before builds -->
    <RestorePackages Condition="  '$(RestorePackages)' == '' ">false</RestorePackages>

    <!-- Property that enables building a package from a project -->
    <BuildPackage Condition=" '$(BuildPackage)' == '' ">false</BuildPackage>

    <!-- Determines if package restore consent is required to restore packages -->
    <RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>

    <!-- Download NuGet.exe if it does not already exist -->
    <DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
</PropertyGroup>

<ItemGroup Condition=" '$(PackageSources)' == '' ">
    <!-- Package sources used to restore packages. By default will used the registered sources under %APPDATA%\NuGet\NuGet.Config -->
    <!--
        <PackageSource Include="https://nuget.org/api/v2/" />
        <PackageSource Include="https://my-nuget-source/nuget/" />
    -->
</ItemGroup>

<PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
    <!-- Windows specific commands -->
    <NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
    <PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig>
    <PackagesDir>$([System.IO.Path]::Combine($(SolutionDir), "packages"))</PackagesDir>
</PropertyGroup>

<PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
    <!-- We need to launch nuget.exe with the mono command if we're not on windows -->
    <NuGetToolsPath>$(SolutionDir).nuget</NuGetToolsPath>
    <PackagesConfig>packages.config</PackagesConfig>
    <PackagesDir>$(SolutionDir)packages</PackagesDir>
</PropertyGroup>

<PropertyGroup>
    <!-- NuGet command -->
    <NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\nuget.exe</NuGetExePath>
    <PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources>

    <NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand>
    <NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 $(NuGetExePath)</NuGetCommand>

    <PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir>

    <RequireConsentSwitch Condition=" $(RequireRestoreConsent) == 'true' ">-RequireConsent</RequireConsentSwitch>
    <!-- Commands -->
    <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(RequireConsentSwitch) -o "$(PackagesDir)"</RestoreCommand>
    <BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -p Configuration=$(Configuration) -o "$(PackageOutputDir)" -symbols</BuildCommand>

    <!-- Make the build depend on restore packages -->
    <BuildDependsOn Condition="$(RestorePackages) == 'true'">
        RestorePackages;
        $(BuildDependsOn);
    </BuildDependsOn>

    <!-- Make the build depend on restore packages -->
    <BuildDependsOn Condition="$(BuildPackage) == 'true'">
        $(BuildDependsOn);
        BuildPackage;
    </BuildDependsOn>
</PropertyGroup>

<Target Name="CheckPrerequisites">
    <!-- Raise an error if we're unable to locate nuget.exe  -->
    <Error Condition="'$(DownloadNuGetExe)' != 'true' AND !Exists('$(NuGetExePath)')" Text="Unable to locate '$(NuGetExePath)'" />
    <SetEnvironmentVariable EnvKey="VisualStudioVersion" EnvValue="$(VisualStudioVersion)" Condition=" '$(VisualStudioVersion)' != '' AND '$(OS)' == 'Windows_NT' " />
    <DownloadNuGet OutputFilename="$(NuGetExePath)" Condition=" '$(DownloadNuGetExe)' == 'true' AND !Exists('$(NuGetExePath)')"  />
</Target>

<Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites">
    <Exec Command="$(RestoreCommand)"
          Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />

    <Exec Command="$(RestoreCommand)"
          LogStandardErrorAsError="true"
          Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
</Target>

<Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites">
    <Exec Command="$(BuildCommand)" 
          Condition=" '$(OS)' != 'Windows_NT' " />

    <Exec Command="$(BuildCommand)"
          LogStandardErrorAsError="true"
          Condition=" '$(OS)' == 'Windows_NT' " />
</Target>

<UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
        <OutputFilename ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
        <Reference Include="System.Core" />
        <Using Namespace="System" />
        <Using Namespace="System.IO" />
        <Using Namespace="System.Net" />
        <Using Namespace="Microsoft.Build.Framework" />
        <Using Namespace="Microsoft.Build.Utilities" />
        <Code Type="Fragment" Language="cs">
            <![CDATA[
            try {
                OutputFilename = Path.GetFullPath(OutputFilename);

                Log.LogMessage("Downloading latest version of NuGet.exe...");
                WebClient webClient = new WebClient();
                webClient.DownloadFile("https://nuget.org/nuget.exe", OutputFilename);

                return true;
            }
            catch (Exception ex) {
                Log.LogErrorFromException(ex);
                return false;
            }
        ]]>
        </Code>
    </Task>
</UsingTask>

 <UsingTask TaskName="SetEnvironmentVariable" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
        <EnvKey ParameterType="System.String" Required="true" />
        <EnvValue ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
        <Using Namespace="System" />
        <Code Type="Fragment" Language="cs">
            <![CDATA[
            try {
                Environment.SetEnvironmentVariable(EnvKey, EnvValue, System.EnvironmentVariableTarget.Process);
            }
            catch  {
            }
        ]]>
        </Code>
    </Task>
</UsingTask>

Sofia Khwaja
źródło