Wofür ist NuGetPackageImportStamp?

71

Wenn Sie einem Projekt bestimmte NuGet-Pakete hinzufügen, wird manchmal ein seltsames Element in der ersten Eigenschaftsgruppe der .csproj-Datei angezeigt.

<PropertyGroup>
  ...
  <NuGetPackageImportStamp>3d051ef3</NuGetPackageImportStamp>
</PropertyGroup>

Der Stempel ist jedes Mal anders und scheint nicht sequentiell zu sein.

Ich kann <NuGetPackageImportStamp>in der NuGet-Dokumentation keinen Verweis darauf finden . Wofür ist es und wie funktioniert es? Ist es nötig?

Ein Paket, das dies jedes Mal hinzuzufügen scheint, ist StyleCop.MSBuild , zumindest mit der aktuellen Version 4.7.49. Fügen Sie dieses Paket einfach einem neuen Projekt hinzu, und dieses mysteriöse Element wird in Ihrer Projektdatei angezeigt.

Matt Johnson-Pint
quelle

Antworten:

79

NuGetPackageImportStamp ist eine Problemumgehung für Visual Studio 2013 und spätere Versionen, die nicht erkennen können, dass ein NuGet-Paket einen MSBuild-Import hinzugefügt oder entfernt hat.

Diese Problemumgehung ist für ältere Versionen von Visual Studio nicht erforderlich. Selbst in Visual Studio 2013 kann die Eigenschaft sicher entfernt werden : Wenn Sie die Lösung schließen und erneut öffnen, werden die importierten MSBuild-Ziele von Visual Studio erneut geladen.

NuGet-Quellcode zeigt, dass NuGet diese Eigenschaft hinzufügt, wenn ein Paket einen MSBuild-Import hinzufügt oder entfernt. Es wird jedes Mal eine neue GUID verwendet. Visual Studio 2013 erkennt, dass sich das Projekt geändert hat, und bietet das Neuladen an. Das Hinzufügen oder Entfernen eines MSBuild-Imports reicht für Visual Studio 2013 nicht aus, um zu wissen, dass sich das Projekt zur Laufzeit geändert hat. Dies löst NuGet mit dieser Problemumgehung.

Das StyleCop.MSBuild NuGet-Paket enthält ein benutzerdefiniertes MSBuild-Ziel. Wenn Sie dieses NuGet-Paket hinzufügen oder entfernen, wird diese Eigenschaft hinzugefügt.


UPDATE : Matt Wards Kommentar ist korrekt und wichtig.

In NuGet befindet sich noch Code , der den NuGet-Paketstempel hinzufügt, und der Code sucht nicht mehr nach Visual Studio 2013.

Hier sind meine Empfehlungen:

  • Erstellen Sie Ihre neuen Projekte entweder mit Visual Studio oder Powershell.
  • Wenn Sie ein altes csproj aktualisieren und es nicht funktioniert, vergleichen Sie dieses alte csproj mit einem neuen funktionierenden csproj, das Sie entweder mit Visual Studio oder Powershell erstellt haben. Wenn das neue funktionierende csproj eine <NuGetPackageImportStamp>Direktive verwendet, fügen Sie es Ihrem alten defekten csproj hinzu und prüfen Sie, ob dies die Probleme behebt. unabhängig davon, welche Visual Studio-Version Sie verwenden.
  • Wenn Ihr altes csproj immer noch nicht funktioniert, beachten Sie die <TargetFrameworkProfile>Richtlinie. Existiert es in Ihrem neuen Arbeitsprogramm? Ziehen Sie in Betracht, dies zu entfernen.
Matt Ward
quelle
1
Derzeit füge ich 2 Zweige zusammen und dieser Wert ist in der csprojDatei jedes Projekts immer unterschiedlich . Ist es wichtig, welche GUID ich wähle?
Hvaughan3
2
@ hvaughan3 - Nein, es spielt keine Rolle, welche Anleitung Sie wählen.
Matt Ward
Das Element existiert noch. Ich arbeite auf einem Computer, auf dem nur VS2017 installiert wurde, und dort habe ich (VS) es geschafft, es einer csproj-Datei hinzuzufügen.
LosManos
1
Es gibt immer noch Code in NuGet, der den NuGet-Paketstempel hinzufügt, und der Code sucht nicht mehr nach Visual Studio 2013.
Matt Ward