Dieses Projekt verweist auf NuGet-Pakete, die auf diesem Computer fehlen

313

Ich habe eine ASP.NET MVC5-Anwendung, die gestern funktioniert hat, und jetzt wird folgende Fehlermeldung angezeigt, wenn ich versuche, Folgendes zu erstellen:

Dieses Projekt verweist auf NuGet-Pakete, die auf diesem Computer fehlen.

Ich habe die beiden Optionen aktiviert, mit denen Nuget fehlende Pakete automatisch herunterladen und installieren kann. Aktiviert / aktiviert. Ich habe auch versucht, alle Dateien im Paketordner zu löschen und sie dann von nuget erneut herunterladen zu lassen. Auch wenn ich nuget öffne und nach Updates suche, heißt es, dass keine installiert werden müssen. Ich kann mir nicht vorstellen, was ich sonst tun soll, um über dieses erstaunlich nervige Problem hinauszugehen.

Austin Harris
quelle
1
Ich habe auch die Nuget-Wiederherstellung aktiviert, indem ich mit der rechten Maustaste auf das Projekt geklickt und diese Option ausgewählt habe. Anschließend wurden ein Nuget-Ordner und drei Elemente in diesem Ordner hinzugefügt, und das Problem wird nicht behoben. Ich habe versucht, neu zu erstellen und erhalte immer noch den gleichen Fehler wie oben.
Austin Harris
Enthält Ihre Lösung einen .nuget-Ordner und haben Sie NuGet auf die neueste Version aktualisiert? Siehe hier: stackoverflow.com/questions/18833649/…
David Brabant
Ja, habe das versucht und mein Problem mit der Build-Fehlermeldung wurde nicht gelöst.
Austin Harris
Ein weiterer Grund für diesen Fehler ist ein The operation has timed out.Fehler. während des Builds. Sie müssen Ihr Build-Protokoll oder die Registerkarte Diagnose im Bildschirm Visual Studio Online Build Build Failed überprüfen .
Joshua Drake
Keine der Lösungen funktioniert für mich. Ich lade von einem Repo herunter und die Pakete werden in der richtigen Dateistruktur für das erste Projekt wiederhergestellt. Das zweite Projekt kann sie nicht finden. Das Überprüfen der .csproj zeigt, dass der richtige relative Pfad verwendet wird, sodass ich nicht in der Lage bin, dies zu lösen. github.com/DanJ210/ProgrammersTest
Daniel Jackson

Antworten:

463

In meinem Fall musste ich Folgendes aus der .csproj-Datei entfernen:

<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>

In diesem Snippet können Sie sehen, woher die Fehlermeldung kommt.

Ich habe von MSBuild-Integrated Package Restore auf Automatic Package Restore umgestellt ( http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore ).

Loren Paulsen
quelle
12
Dies funktionierte für mich, aber ich musste nur das Element <Ziel> </ Ziel> entfernen. VS [2013] schien es wiederherzustellen, wenn ich auch das <Import> -Element entfernte.
Robert Taylor
3
Das ist wirklich unglaublich. Warum macht Microsoft alles so schwierig?
Dimiguel
11
Wenn dies entfernt werden kann, warum ist es dann überhaupt da?
OK999
1
OK9999, zu einem bestimmten Zeitpunkt müssen Sie es aus einer früheren Version von Visual Studio aktiviert haben, indem Sie mit der rechten Maustaste auf die Lösung klicken und "NuGet-Paketwiederherstellung aktivieren" auswählen. Das brauchen wir nicht mehr
Loren Paulsen
3
Ich liebe Lösungen, bei denen nur Dinge gelöscht werden.
Todd Menier
86

Eine Lösung wäre, Folgendes aus der .csproj-Datei zu entfernen:

<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>

Wie?

  1. Klicken Sie mit der rechten Maustaste auf das Projekt. Projekt entladen.
  2. Klicken Sie mit der rechten Maustaste auf das Projekt. Csproj bearbeiten.
  3. Entfernen Sie das Teil aus der Datei. Sparen.
  4. Klicken Sie mit der rechten Maustaste auf das Projekt. Projekt neu laden.
Ivan Santiago
quelle
Wenn Sie ein Projekt von einem Ort an einen anderen verschieben, funktioniert dies hervorragend.
Dean Seo
4
@IvanSantiago Es wurde bereits oben mit der gleichen Lösung beantwortet! .. Abstimmung nach unten! ..
Jack
2
@ClintEastwood Meine Antwort erklärt WIE es zu tun. Das ist der Unterschied. Wenn ein Benutzer nach einem WIE ZU meiner Antwort sucht , hat er es im Gegensatz zu der obigen Antwort.
Ivan Santiago
2
@IvanSantiago Sie könnten: es als Kommentar hinzugefügt oder die ursprüngliche Antwort mit der Anleitung bearbeitet haben.
Colin
50

In meinem Fall geschah dies, nachdem ich meinen Lösungsordner von einem Speicherort an einen anderen verschoben, ein wenig neu organisiert und dabei die relative Ordnerstruktur geändert hatte.

Also musste ich alle Einträge ähnlich dem folgenden in meiner .csprojDatei von bearbeiten

  <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')" />

zu

  <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')" />

(Beachten Sie den Wechsel von ..\packages\zu packages\. In Ihrem Fall kann es sich um eine andere relative Struktur handeln, aber Sie haben die Idee.)

Nikita G.
quelle
3
Ähnliches Problem .... Ich hatte die .csproj-Datei in der Verzeichnisstruktur um eine Ebene nach oben verschoben und musste von ".. \ .. \ packages \ ..." zu ".. \ packages \ ..." wechseln.
Tmgirvin
2
Ich hatte ein ähnliches Problem, aber wirklich komisch. Ich habe es in einem Subsolution-Modul verwendet, daher war es in dieser Lösung in Ordnung, aber als ich auf diese Lösung aus einer anderen Lösung verwies, befanden sich die Pakete an einer anderen Stelle. Ich habe .. \ packages in $ (SolutionDir) -Paketen im gesamten .csproj geändert und das hat es behoben.
JoeNCA
2
Wenn Sie nicht manuell mit der .csproj-Datei herumspielen möchten, habe ich festgestellt, dass dieses Problem behoben wurde, indem Sie alle für das Projekt installierten Nuget-Pakete notiert, gelöscht und neu installiert haben. Ich habe versucht, ein Projekt aus einer Lösung zu entfernen, um es in ein eigenes Git-Repository zu stellen, als ich auf dieses Problem stieß.
WiteCastle
Bedeutet dies, dass sich Ihre .csproj auf der gleichen Ebene befindet wie Ihre .sln-Datei?
Simon_Weaver
@Simon_Weaver Die Position Ihres .csprojVerwandten zu Ihrem .slnspielt in diesem Zusammenhang keine Rolle. Was zählt, ist, ob etwas, auf das in Ihrem verwiesen wird, .csprojwoanders hingezogen ist. Wenn ja, müssen Sie das Problem beheben. Wenn Sie Ihre '.csproj' mit allem, worauf sie verweist, intakt verschoben haben, aber Ihre Position beibehalten haben, müssten .slnSie die .slnDatei am neuen Speicherort von .csproj-es reparieren , aber es wäre nicht erforderlich, .csprojDateien zu bearbeiten .
Nikita G.
22

Ich löse dieses Problem einfach, indem ich mit der rechten Maustaste auf meine Lösung und dann auf die Option NuGet-Paketwiederherstellung aktivieren klicke

(PS: Stellen Sie sicher, dass Sie die Nuget-Installation über Tools -> Erweiterungen und Updates -> Nuget Package Manager für Visual Studio 2013 haben. Wenn nicht, erweitern Sie diese Erweiterung zuerst.)

Ich hoffe es hilft.

MA
quelle
7
Dies ist die alte Methode zum Wiederherstellen von Nuget-Paketen und sollte vermieden werden.
Der Muffin-Mann
2
@TheMuffinMan: Können Sie bitte klarstellen, was der neue Weg ist und warum dieser Weg vermieden werden sollte (wenn man bedenkt, dass die VS 2013-Fehlerausgabe Sie dazu auffordert, genau das zu tun)?
CantrianBear
2
@CantrianBear Navigieren Sie zu dieser Seite docs.nuget.org/consume/package-restore und suchen Sie den Abschnitt mit dem Namen MSBuild-Integrated Package Restore. Das ist der alte Weg und es werden einige Gründe aufgeführt, warum Sie den neuen Weg verwenden sollten.
Der Muffin-Mann
Siehe David Ebbos Blog auf diesem Blog.davidebbo.com/2014/01/… Now ... "NuGet stellt jetzt immer Pakete wieder her, bevor VS erstellt wird."
timB33
17

In meinem Fall hatte es mit der Microsoft.Build.Bcl-Version zu tun. Meine Nuget-Paketversion war 1.0.21, aber meine Projektdateien zeigten immer noch auf Version 1.0.14

Also habe ich meine .csproj-Dateien geändert von:

  <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>

zu:

 <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" />

Und der Build funktionierte wieder.

henkie14
quelle
11

Wenn Sie TFS verwenden

Entfernen Sie die Dateien NuGet.exeund NuGet.targetsaus dem .nugetOrdner der Lösung . Stellen Sie sicher, dass die Dateien selbst auch aus dem Lösungsarbeitsbereich entfernt werden. Bewahren Sie die NuGet.ConfigDatei auf, um das Hinzufügen von Paketen zur Quellcodeverwaltung weiter zu umgehen.

Bearbeiten Sie jede Projektdatei (z. B. .csproj, .vbproj) in der Lösung und entfernen Sie alle Verweise auf die NuGet.targetsDatei. Öffnen Sie die Projektdatei (en) im Editor Ihrer Wahl und entfernen Sie die folgenden Einstellungen:

<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>

Wenn Sie kein TFS verwenden

Entfernen Sie den .nugetOrdner aus Ihrer Lösung. Stellen Sie sicher, dass der Ordner selbst auch aus dem Lösungsarbeitsbereich entfernt wird.

Bearbeiten Sie jede Projektdatei (z. B. .csproj, .vbproj) in der Lösung und entfernen Sie alle Verweise auf die NuGet.targetsDatei. Öffnen Sie die Projektdatei (en) im Editor Ihrer Wahl und entfernen Sie die folgenden Einstellungen:

<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>

Referenz: Migrieren von MSBuild-integrierten Lösungen zur Verwendung der automatischen Paketwiederherstellung

RAM
quelle
8

Ist es möglich, dass die Pakete im falschen Ordner wiederhergestellt wurden? Überprüfen Sie, ob die Pfade in den csproj-Dateien korrekt sind.

Wenn sie unterschiedlich sind, kann dies daran liegen, dass die Pakete jetzt an einem anderen Speicherort wiederhergestellt werden. Dies kann daran liegen, dass eine NuGet.Config-Datei bei der Angabe eines Knotens wie folgt überprüft wird:

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

Die Pakete werden wiederhergestellt, indem die Projekte noch auf den alten Standort schauen.

infojolt
quelle
1
Ich glaube, es könnte ein Pfadproblem sein, da ich den Speicherort der Dateien verschoben habe, aber ich sehe nicht, wo sich irgendwo ein fest codierter Pfad befindet. Ich habe in der proj-Datei nachgesehen und alle Paketdateien scheinen relativ wie folgt zu sein: <Reference Include = "Antlr3.Runtime, Version = 3.5.0.2, Culture = neutral, PublicKeyToken = eb42632606e9261f, processArchitecture = MSIL"> <SpecificVersion> False </ SpecificVersion> <HintPath> .. \ packages \ Antlr.3.5.0.2 \ lib \ Antlr3.Runtime.dll </ HintPath> </ Reference>
Austin Harris
Das Hinzufügen zu web.config hat nicht geholfen: <add key = "repositoryPath" value = ".. \ .. \ Packages" />
Austin Harris
Sie möchten das nicht zur web.config hinzufügen. Ich habe auf die Datei NuGet.config verwiesen, und Sie möchten den relativen Pfad überprüfen. Wo sind Ihre Pakete relativ zu den csproj-Dateien? Sind sie in .. \ Paketen? Es hört sich so an, als würden die Pakete korrekt wiederhergestellt, aber Ihre Projekte suchen am falschen Ort.
Infojolt
6

Ich hatte das gleiche Problem. In meinem Fall wurde das Problem durch die Installation des Microsoft.Bcl.Build- Pakets behoben.

Mheyman
quelle
Dies hat auch bei mir funktioniert - aber ich habe keine Ahnung, ob das Richtige darin bestand, dieses Paket zu installieren (was den gleichen Effekt hat wie die Antwort auf die Versionsänderung von henkie14 unten oder einfach alle diese Ziele zu löschen - tun sie tatsächlich etwas Nützliches?
Gaz
In der 1.0.21Version ohne Dateien im Paket wurde dies durch die Installation der 1.0.14Version behoben.
FLCL
4

Die folgenden Zeilen in der .csproj-Datei wurden entfernt

<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
quelle
3

Eine Lösung wäre, Folgendes aus der .csproj-Datei zu entfernen:

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

Dieses Projekt verweist auf NuGet-Pakete, die auf diesem Computer fehlen. Aktivieren Sie die NuGet-Paketwiederherstellung, um sie herunterzuladen. Weitere Informationen finden Sie unter http://go.microsoft.com/fwlink/?LinkID=322105 . Die fehlende Datei ist {0}.

Umar Khaliq
quelle
1

Dies sind die Schritte, mit denen ich das Problem behoben habe:

So fügen Sie Ihrer Lösung Nuget-Pakete hinzu:

  1. Klicken Sie mit der rechten Maustaste auf das Projekt (nicht auf die Lösung), auf das Sie Nuget-Pakete verweisen möchten.
  2. Wählen Sie: Nuget-Pakete verwalten
  3. Im Popup-Fenster links haben Sie drei Möglichkeiten. Wenn Sie Online> Microsoft & .NET wählen , können Sie den Microsoft ASP.NET Web API 2.2-Paketgrupper installieren (oder ein beliebiges Paket, das Sie benötigen - meins war dies).
  4. Klicken Sie nun mit der rechten Maustaste auf Ihre Lösung (nicht auf das Projekt) und wählen Sie Nuget-Paketwiederherstellung aktivieren . Dadurch werden die Pakete beim Kompilieren automatisch heruntergeladen.
user4569838
quelle
Ich musste lediglich die Wiederherstellung des Nugget-Pakets für die Lösung aktivieren. Anscheinend war alles andere schon richtig eingerichtet.
schmiddy98
1

Für mich hat es funktioniert, als ich gerade einen .nuget-Ordner von einer funktionierenden Lösung in die vorhandene kopiert und auf dessen Inhalt verwiesen habe!

meJustAndrew
quelle
1

Versuchen Sie zunächst, mit der rechten Maustaste auf die Lösung zu klicken und "Nuget-Pakete wiederherstellen" auszuwählen.

In meinem Fall hat das nicht funktioniert, daher habe ich einige Empfehlungen zum Löschen von "Importieren" und "Ziel" in der Projektdatei befolgt. Dies funktionierte für 2 meiner 3 Projekte, es wurde jedoch beim letzten ein anderer Fehler angezeigt.

Was funktionierte war, die Package Manager-Konsole zu öffnen und auszuführen:

Update-Package -reinstall -ProjectName MyProjectName

Es dauert einige Zeit, aber da alle Pakete neu installiert werden, wird Ihr Projekt problemlos kompiliert

Juan C Calderon
quelle
1

Ich habe das gleiche Problem. Ich bin darauf gestoßen, als ich ein vorhandenes Projekt kopiert und in den Ordner meines Lösungsverzeichnisses übertragen und als vorhandenes Projekt zu meiner leeren Lösung hinzugefügt habe. Also muss ich meine csproj-Datei bearbeiten und nach dieser bestimmten Codezeile suchen. Meistens befindet sich diese in den letzten Zeilen:

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

Nach dieser Zeile muss ich Folgendes auskommentieren:

  <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')" />

Ihre Lösung fordert Sie auf, eine Änderung an Ihrem Projekt vorzunehmen. Wählen Sie einfach Alle neu laden:

Geben Sie hier die Bildbeschreibung ein Dann funktioniert alles gut, nachdem ich meine Lösung neu erstellt habe.

Willy David Jr.
quelle
0

Ich hatte das gleiche Problem, als ich die Klassenbibliothek in meiner MVC-Webanwendung referenzierte.

Das Problem war die Nichtübereinstimmung der Versionsnummer des Nuget-Pakets zwischen zwei Projekten.

Beispiel: Meine Klassenbibliothek hatte log4net von 1.2.3, aber meine Webanwendung hatte 1.2.6

Fix: Stellen Sie einfach sicher, dass beide Projekte dieselbe Versionsnummer haben, auf die verwiesen wird.

Srini
quelle
0

Das Bearbeiten von .sln und .csproj ist nicht immer so einfach oder wünschenswert. Sobald Sie die Fehlerliste erhalten haben, können Sie sehen, in welchen Projekten Pakete fehlen (außerdem zeigt der Knoten Referenzen normalerweise an, dass Assemblys fehlen, es sei denn, Pakete sind Quellcode, Ressourcen, Bilder oder nur textbasierte.)

Das Entfernen und anschließende Hinzufügen der Pakete ist keine gute Idee, es sei denn, Sie verwenden die neueste Version des Pakets. Ansonsten seien Sie auf Überraschungen vorbereitet, die nicht immer angenehm sind.

Wenn das Paket beispielsweise EntityFramework ist, erhalten Sie in der NuGet-Galerie die neueste Version, die zum Zeitpunkt des Schreibens dieses Kommentars 6.1.3 ist .

Der sicherste Weg, um mit der Situation umzugehen, besteht darin, die fehlenden Pakete einzeln wiederherzustellen. Ja, eine etwas schmerzhafte Übung, aber die Jagd nach subtilen Fehlern aufgrund unterschiedlicher Paketversionen ist möglicherweise viel unangenehmer.

Nachdem dies gesagt wurde und EntityFramework erneut das fehlende Paket ist, können Sie den folgenden Befehl in der Package-Manager-Konsole ausführen:

PM> Install-Package EntityFramework -Version 6.0.1 

Dadurch wird die richtige Version installiert, dh 6.0.1 , die in packages.config angegeben ist:

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="EntityFramework" version="6.0.1" targetFramework="net451" />
    </packages>
Alexander Christov
quelle
0

Ich hatte dies, als sich die Dateien csproj und sln im selben Ordner befanden (dumm, ich weiß). Sobald ich zur sln-Datei in den Ordner über dem csproj-Ordner verschoben habe, ist dies der Fall

David Christopher Reynolds
quelle
-1

Ich habe einen Ordner mit dem Namen '.nuget' im Lösungsstammordner erstellt und dann die Datei 'NuGet.Config' in diesem Ordner mit folgendem Inhalt hinzugefügt

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

Erstellen Sie dann die Datei '.nuGet.targets' wie folgt: $ (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
quelle