Ich habe eine ASP.NET MVC5-Anwendung, die gestern funktioniert hat, und jetzt wird diese 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. Ich habe auch versucht, alle Dateien im Paketordner zu löschen und sie dann von Nuget erneut herunterzuladen. 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 tun soll, um über dieses erstaunlich ärgerliche Problem hinauszugehen.
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>
Tatsächlich können Sie in diesem Snippet sehen, woher die Fehlermeldung kommt.
Ich konvertierte von MSBuild-Integrated Package Restore zu Automatic Package Restore ( http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore )
Eine Lösung besteht darin, 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?
In meinem Fall geschah dies, nachdem ich meinen Lösungsordner von einem Ort an einen anderen verschoben, ein wenig umstrukturiert und dabei die relative Ordnerstruktur geändert hatte.
Also musste ich alle Einträge bearbeiten, die dem folgenden in meiner _.csproj
_ -Datei ähnelten
_ <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 die Änderung von ..\packages\
zu packages\
. Es könnte eine andere relative Struktur in Ihrem Fall sein, aber Sie haben die Idee.)
Ich löse dieses Problem einfach, indem ich mit der rechten Maustaste auf meine Lösung klicke und dann auf die Option NuGet-Paketwiederherstellung aktivieren klicke
(P.S: Stellen Sie sicher, dass Sie über die Nuget-Installation von Tools -> Erweiterungen und Updates -> Nuget Package Manager für Visual Studio 2013 verfügen. Wenn diese Erweiterung nicht zuerst installiert wird)
Ich hoffe es hilft.
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.
Wenn Sie TFS verwenden
Entfernen Sie die Dateien NuGet.exe
und NuGet.targets
aus dem Ordner .nuget
der Lösung. Stellen Sie sicher, dass die Dateien selbst auch aus dem Lösungsarbeitsbereich entfernt werden. Behalten Sie die Datei NuGet.Config
bei, um das Hinzufügen von Paketen zur Quellcodeverwaltung zu umgehen.
Bearbeiten Sie jede Projektdatei (z. B. .csproj, .vbproj) in der Projektmappe und entfernen Sie alle Verweise auf die Datei NuGet.targets
. Ö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 Ordner .nuget
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 Projektmappe und entfernen Sie alle Verweise auf die Datei NuGet.targets
. Ö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>
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 durch die Überprüfung einer NuGet.Config-Datei bei der Angabe eines Knotens wie folgt verursacht werden:
<add key="repositoryPath" value="..\..\Packages" />
Die Pakete werden restauriert, indem die Projekte noch auf den alten Standort schauen.
Ich hatte das gleiche Problem. In meinem Fall hat die Installation des Microsoft.Bcl.Build -Pakets das Problem behoben.
Dies sind die Schritte, mit denen ich das Problem behoben habe:
So fügen Sie Ihrer Lösung Nuget-Pakete hinzu:
Bei mir hat es funktioniert, als ich gerade einen .nuget-Ordner von einer funktionierenden Lösung in die vorhandene kopiert und auf den Inhalt verwiesen habe!
Entfernt unter den Zeilen in der .csproj-Datei
<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>
Das Bearbeiten von .sln und .csproj ist nicht immer so einfach oder wünschenswert. Sobald Sie die Fehlerliste erhalten, können Sie sehen, bei welchen Projekten Pakete fehlen (außerdem gibt der Knoten Verweise normalerweise an, dass Assemblys fehlen, es sei denn, es handelt sich bei Paketen um Quellcode, Ressourcen, Bilder oder nur um textbasierte Pakete).
Das Entfernen und Hinzufügen der Pakete ist nur dann sinnvoll, wenn Sie die neueste Version des Pakets verwenden. Seien Sie ansonsten auf Überraschungen gefasst, 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. ist.
Der sicherste Weg, mit der Situation umzugehen, ist es also, die fehlenden Pakete nacheinander wiederherzustellen. Ja, ein bisschen schmerzhafte Übung, aber die Jagd nach subtilen Fehlern aufgrund unterschiedlicher Paketversionen ist vielleicht viel unangenehmer.
Nachdem dies gesagt wurde und EntityFramework das fehlende Paket sein soll, können Sie den folgenden Befehl in der Package-Manager-Konsole ausgeben:
PM> Install-Package EntityFramework -Version 6.0.1
Dadurch wird die richtige Version installiert, d. H. 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>
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.
zb: meine klassenbibliothek hatte log4net von 1.2.3 aber meine webapp hatte 1.2.6
fix: Stellen Sie sicher, dass beide Projekte dieselbe Versionsnummer haben, auf die verwiesen wird.
Eine Lösung besteht darin, 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 NuGet Package Restore, um sie herunterzuladen. Weitere Informationen finden Sie unter http://go.Microsoft.com/fwlink/?LinkID=322105 . Die fehlende Datei ist {0}.