1. ホーム
  2. .net

NuGetPackageImportStampは何のためにあるのですか?

2023-10-15 03:20:08

質問

プロジェクトに特定の NuGet パッケージを追加すると、.csproj ファイルの最初のプロパティ グループに奇妙な項目が表示されることがあります。

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

スタンプは毎回異なり、連続したものではなさそうです。

への言及が見当たりません。 <NuGetPackageImportStamp> への言及が見当たりません。 これは何のためにあり、どのように機能するのでしょうか? それは必要ですか?

これを毎回追加しているように見えるパッケージの1つが StyleCop.MSBuild で、少なくとも現在の 4.7.49 バージョンではそうなっています。 このパッケージを新しいプロジェクトに追加するだけで、プロジェクト ファイルにこの謎のアイテムが表示されます。

どのように解決するのですか?

NuGetPackageImportStamp は、Visual Studio 2013 およびそれ以降のバージョンで、NuGet パッケージが MSBuild のインポートを追加または削除したことを検出できない場合の回避策です。

この回避策は、Visual Studio の古いバージョンでは必要ありません。Visual Studio 2013 でも プロパティは安全に削除することができます。 : ソリューションを閉じて再び開くと、インポートされた MSBuild ターゲットが Visual Studio によって再ロードされます。

NuGet ソースコード を見ると、パッケージがMSBuildインポートを追加または削除するときに、NuGetがこのプロパティを追加することがわかります。毎回、新しい GUID を使用します。Visual Studio* 2013 は、プロジェクトが変更されたことを検出し、その再読み込みを提供します。MSBuild インポートを追加または削除するだけでは、Visual Studio 2013 が実行時にプロジェクトが変更されたことを知るには十分ではなく、この回避策によって NuGet が解決することになるのです。

StyleCop.MSBuild NuGet パッケージにはカスタム MSBuild ターゲットが含まれているため、この NuGet パッケージを追加または削除すると、このプロパティが追加されるようになります。


アップデイト : Matt Wardのコメント は正しく、重要です。

<ブロッククオート

にはまだコードがあり NuGet パッケージスタンプを追加する NuGet を追加するコードが残っており、そのコードはもはや Visual Studio 2013 をチェックしません。

以下は、私の最重要推奨事項です。

  • Visual Studio または Powershell のいずれかを使用して新しいプロジェクトを作成します。
  • 古い csproj を更新して、それが動作しない場合、この古い csproj と Visual Studio または Powershell のいずれかで作成した新しい動作する csproj を比較します。新しい動作する csproj が <NuGetPackageImportStamp> ディレクティブを使用している場合は、それを古い壊れた csproj に追加して、問題が修正されるかどうかを確認します。 にかかわらず を使用している Visual Studio のバージョンに関係なく、問題が修正されるかどうかを確認します。
  • 古い csproj がまだ動作していない場合は、以下の方法を検討してください。 <TargetFrameworkProfile> ディレクティブを考えてみてください。これは新しい動作する csproj に存在しますか?これを削除することを検討してください。