2012-08-17 44 views
175

我已經將目前針對VS2010中.NET 4.0的解決方案遷移到VS2012,現在我想將其重新定位到.Net 4.5。我不確定的是NuGet包。例如EF5,這是我從EF4在VS2010更新原來​​實際上是EF 4.4,你可以在這裏看到:從.Net 4.0重新定位解決方案到4.5 - 如何重新定位NuGet包?

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

所以我的問題是:

什麼是最好的做法重新目標所有的Nu​​Get包,目前設置爲目標.NET 4.0的目標.NET 4.5?

回答

227

NuGet 2.1提供了一個功能,使其更簡單:只需從軟件包管理器控制檯執行update-package -reinstall -ignoreDependencies即可。

NuGet 2.0不能很好地處理您的應用程序的重新定位。爲了更改軟件包的目標框架,您必須卸載並重新安裝軟件包(請注意您已安裝的軟件包,以便您可以重新安裝每個軟件包)。

原因軟件包必須卸載並重新安裝是:

  • 當安裝一個包,我們確定項目的目標框架
  • 然後我們匹配了包內容,找到合適的\ lib \文件夾(和\ content \文件夾)
  • 程序集引用添加了提示路徑,指向包的\ lib \文件夾,具有正確的子文件夾(例如\ lib \ net40)
  • 內容文件從packages \ content \ fo (例如\ content \ net40)
  • 我們記錄了用於在packages.config文件中安裝軟件包的目標框架
  • 在更改項目的目標框架後,提示路徑仍然指向net40
  • 當您卸載包,我們檢查記錄在packages.config,看看有什麼目標框架的libs的targetFramework /內容,從項目中刪除
  • 當你安裝了這一軟件,我們檢測到您的更新目標框架和參考/複製正確的庫/內容
+0

使用VS 2012與ASP.NET MVC 4項目後重新 - 將.NET Framework從4.0版本定向到4.5,我在Package Manager Console中執行了'update-package -reinstall'。所有軟件包開始被卸載和更新,並且突然重啓Windows 8,當它回來時它告訴「你的電腦出現問題並重新啓動,你想發送信息給微軟嗎?」 :(嚇跑...順便說一句,這是我現在安裝的NuGet版本:'2.2.40116.9051'在這裏打開一個問題:http://nuget.codeplex.com/workitem/3049 – 2013-02-18 15:16:01

+11

-reinstall選項有從來沒有爲我工作過,它要麼以錯誤的順序排除錯誤,「不能刪除X,因爲Y依賴於它」,或者有時候只是不讀取軟件包,最後一次嘗試它時,它刪除了EntityFramework,然後再也沒有 - 添加它 – CodingWithSpike 2013-04-16 15:21:27

+0

順便說一句,如果你想針對* CLR2和CLR4編譯一個項目,你可以製作一個.csproj文件的副本,但你的packages.config需要保留包。 config ... – Jaykul 2013-08-02 22:31:28

34

對於那些誰了問題update-package -reinstall <packagename>命令,考慮-ignoreDependencies標誌運行它,就像這樣:

update-package -reinstall <packagename> -ignoreDependencies 

此標誌將離開你的包單獨依賴關係,否則他們可能會,即使你本來想包重新安裝還是得到了更新保持它的版本相同。

更多信息here

+0

謝謝,這確實可以節省很多麻煩。看着Nuget試圖重新安裝EnterpriseLibrary傾向於在30多個項目中創建的10個左右的依賴項,這項工作正在走向一天的工作。這將其降至幾分鐘。 – 2013-12-10 06:51:46

+0

正如其他人所說,很可能會破壞一切。 – Gleno 2015-01-15 09:25:44

+5

您可以通過在包管理器控制檯下運行時稍微更改整個解決方案來自動執行此操作:'get-package | %{update-package $ _。Id -reinstall -ProjectName $ _。ProjectName -ignoreDependencies}' – 2016-05-06 19:18:32

2

雖然試圖重新安裝寬包解決方案,我遇到了一個相關性錯誤(儘管使用-ignoreDependencies標誌),並且所有的packages.config文件爲每個項目已被刪除。在VS2013中,似乎packages.config不會刷新回磁盤並重新添加,直到將所有升級後的依賴項/引用重新附加到該項目。

在我的情況什麼工作是給每個項目升級一個-AT-A-時間通過添加-ProjectName項目名稱update-package命令。在這種情況下,packages.config在每個項目升級時都會更新。

對於非常大的解決方案可能不太實用,但仍然利用盡可能多的項目進行自動升級並隔離有問題的解決方案似乎是合理的妥協方案,而且您的解決方案中沒有包含每個失敗。

+3

我遇到了同樣的問題。 'UpdatePackage -Reinstall'刪除了一些項目的package.config和項目引用(特別是那些僞造了在其中生成的程序集的項目引用)。我們解決了這個問題,通過撤消所有修改項目並運行:'Update-Package -reinstall -ProjectName「PROJECTNAME」-IgnoreDependencies' – MSC 2016-09-20 20:51:22

15

不成功嘗試接受的答案後,我想提出一個風險較小的命令:

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

欲瞭解更多信息: http://blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html

+0

根據鏈接文檔'-reinstall'將只安裝相同的版本,沒有看到使用'-safe'的好處。我錯過了什麼嗎? – 2016-07-12 21:14:21

+0

你是對的,我已經更新了答案。 – 2016-07-14 07:03:41