.Net 4.0から4.5へのソリューションのターゲット変更-NuGetパッケージをターゲット変更する方法


205

現在VS2010の.NET 4.0をターゲットにしているソリューションをVS2012に移行しました。今度は.Net 4.5にターゲットを変更したいと思います

よくわからないのはNuGetパッケージです。たとえば、VS2010でEF4から更新したEF5は、次のように実際にはEF 4.4であることがわかります。

    <Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll</HintPath>
    </Reference>

プロジェクトのpackages.configにも次のように表示されます。

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="5.0.0" targetFramework="net40" />
</packages>

だから私の質問は:

.NET 4.0を対象とするように現在設定されているすべてのNuGetパッケージを.NET 4.5を対象にリターゲットするためのベストプラクティスは何ですか?


回答:


266

NuGet 2.1は、これを非常に簡単にする機能を提供しますupdate-package -reinstall -ignoreDependencies。パッケージマネージャーコンソールから実行するだけです。

NuGet 2.0は、アプリケーションのターゲット変更を適切に処理しません。パッケージのターゲットフレームワークを変更するには、パッケージをアンインストールして再インストールする必要があります(インストールしたパッケージをメモして、各パッケージを再インストールできるようにします)。

パッケージをアンインストールして再インストールする必要がある理由は次のとおりです。

  • パッケージをインストールするときに、プロジェクトのターゲットフレームワークを決定します
  • 次に、それをパッケージの内容と照合し、適切な\ lib \フォルダー(および\ content \フォルダー)を見つけます。
  • アセンブリ参照は、適切なサブフォルダー(たとえば、\ lib \ net40)とともに、パッケージの\ lib \フォルダーを指すヒントパスとともに追加されます。
  • コンテンツファイルは、パッケージ\ content \フォルダーから適切なサブフォルダー(\ content \ net40など)を使用してコピーされます。
  • パッケージのインストールに使用したtargetFrameworkをpackages.configファイルに記録します
  • プロジェクトのターゲットフレームワークを変更しても、ヒントパスは引き続きnet40を指します
  • パッケージをアンインストールするとき、packages.configに記録されたtargetFrameworkをチェックして、プロジェクトから削除するターゲットフレームワークのlibs / contentを確認します
  • パッケージを再インストールすると、更新されたターゲットフレームワークが検出され、適切なlibs / contentが参照/コピーされます

ASP.NET MVC 4プロジェクトでVS 2012を使用し、.NET Frameworkを4.0から4.5に再ターゲットした後update-package -reinstall、パッケージマネージャーコンソールで実行しました。すべてのパッケージがアンインストールおよび更新され始め、突然Windows 8が再起動し、戻ったときに「PCに問題が発生して再起動しました。Microsoftに情報を送信しますか?」:(怖い...ちなみに、これは私が今インストールしたNuGetバージョン2.2.40116.9051です。ここで問題を開き
Leniel Maccaferri

12
-reinstallオプションが一度も機能していません。誤った順序で削除され、「YはXに依存しているため、Xを削除できません」というエラーが表示されるか、パッケージが読み込まれないことがあります。前回試したところ、EntityFrameworkが削除され、再度追加されることはありませんでした。
CodingWithSpike 2013

4
update-package -reinstallは私にとって解決策ではありませんでした。また、使用してテストしたバージョンのままにするのではなく、多くのパッケージを更新しました。たとえば、Ninjectはv3に移動されましたが、これは重大なバージョン変更です。
Steve Owen

13
update-page -reinstallも実行しないでください。このことは、ローカルマシンで実行されたときの混乱で、NuGetパッケージマネージャーがこれ以上先に進むのを止めなければなりませんでした。それは私のjQuery 1.10バージョンを削除し、何らかの理由で1.4.4に置き換えました。手動で行うだけで、面倒を省くことができます。
JustinMichaels 2013年

2
混乱に同意し、それはこの投稿から2年後のことです。それは特定の核種のより低いバージョンを見つけ、多くの参照を台無しにしました。そして、それは(2014年の初めからのハイエンドワークステーションで)ほぼ2時間の更新の後でした。ソリューション内の20のプロジェクト。
Arve Systad 2014

42

update-package -reinstall <packagename>コマンドで問題が発生した場合は-ignoreDependencies、次のようにフラグを付けて実行することを検討してください。

update-package -reinstall <packagename> -ignoreDependencies

このフラグは、パッケージの依存関係をそのままにします。そうしないと、最初に再インストールしたいパッケージがバージョンを維持している場合でも、パッケージの依存関係が更新される可能性があります。

詳細はこちら


ありがとう、それは本当に多くのトラブルを救います。30以上のプロジェクトでEnterpriseLibraryが作成する傾向のある10個程度の依存関係を再インストールしようとするNugetを見ると、1日の長さの仕事に向かっていました。これにより数分に短縮されます。
David Keaveny、

他の人が述べたように、すべてを壊す可能性が非常に高いです。
Gleno

9
パッケージマネージャコンソールで実行するときあなたは少しそれを変更することにより、ソリューション全体のためにこれを自動化することができます:get-package | % { update-package $_.Id -reinstall -ProjectName $_.ProjectName -ignoreDependencies }
Kalebペダーソン

2
@KalebPederson私の経験では、コマンドはソリューション全体で機能しますか?

1
@BjörnAliGöransson-私が十分に明確でない場合は申し訳ありません。答えは、ソリューション全体で単一のパッケージを更新する方法を提供します。私のスクリプトは、ソリューション内のすべてのNuGetパッケージを通過し、ソリューション全体でターゲットを変更します。答えは単一のプロジェクトに最適ですが、ターゲットを変更する必要のあるパッケージがたくさんある場合は、提供したスクリプトの方が適している場合があります。
Kaleb Pederson

22

受け入れられた回答を失敗した後、私はリスクの少ないコマンドを提案したいと思います:

Update-Package <PackageName> -ProjectName <ProjectName> -Reinstall -IgnoreDependencies

詳細:http : //blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html


1
リンクされたドキュメントによると、-reinstall同じバージョンのみをインストールするため、を使用するメリットはありません-safe。何か不足していますか?
カレブペダーソン

4

パッケージソリューション全体を再インストールしようとしたときに、依存関係エラーが発生し(-ignoreDependenciesフラグを使用しているにもかかわらず)、すべてのプロジェクトのすべてのpackages.configファイルが削除されていました。VS2013では、すべてのアップグレードされた依存関係/参照がプロジェクトに再アタッチされるまで、packages.configがディスクにフラッシュバックされて再度追加されないようです。

私の場合はどのような仕事をして追加することにより、各プロジェクトの1つずつをアップグレードした-ProjectName プロジェクト名をするupdate-packageコマンド。この場合、各プロジェクトがアップグレードされると、packages.configが更新されます

非常に大規模なソリューションでは実用的ではない可能性がありますが、可能な限り多くのプロジェクトの自動アップグレードを利用し、ソリューションのすべてのpackages.configを失敗時に削除せずに問題のあるプロジェクトを分離することは合理的な妥協のようです。


3
同じ問題に遭遇しました。UpdatePackage -Reinstallいくつかのプロジェクト(具体的には、偽のアセンブリが生成されたプロジェクト)のpackage.configおよびプロジェクト参照を削除しました。我々はめちゃくちゃプロジェクトにすべての変更を元に戻して実行することでこれを回避:Update-Package -reinstall -ProjectName "PROJECTNAME" -IgnoreDependencies
MSC

1

Visual Studio for Mac 2019では、パッケージフォルダーを右クリックすると、メニューに[再ターゲット]オプションが表示されます。これにより、再ターゲットが必要なプロジェクト内のすべてのパッケージの再ターゲットの問題が解決されました。Visual Studio for Mac(少なくとも私のもの)の[ツール]メニューにNuGetパッケージマネージャーがなかったため、パッケージマネージャーコンソールを起動できませんでした。

パッケージの右クリックメニューのメニューオプションを再ターゲット

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.