2014-04-25 183 views
1

VS 2013無法恢復包 - 包內容未實現 - 儘管VS/nuget似乎認爲它已成功恢復包。nuget恢復失敗,但手動工作

如果我手動卸載並重新安裝該軟件包的相同版本,它的工作原理應該如此。

赤裸裸的複製代碼可以是downloaded as a zip。這個攝製有一個

  • 單一文件, 「packages.config」 一

  • 單個項目中的

    • 單一的解決方案,指定

    • 單個包裝,「清風.edmbuilder -version 1.0.4「,包含單個文件,edmbuilder.cs

    • 單個文件夾,「App_Start」,只含有

    • 的.csproj的說,它應該有「edmbuilder.cs」,這是可以的,因爲

    • 便有「edmbuilder.cs」的時候,包恢復。

    當我編譯時,VS報告「edmbuilder.cs」丟失......並且確實缺少它。

    但是,該軟件包已下載;我知道這是因爲構建產生一個包含「Breeze.EdmBuilder.1.0.4」的「包」文件夾,其中我看到「edmbuilder.cs」存在並且位置正確。

    當我發出命令install-package breeze.edmbuilder -version 1.0.4,報告的NuGet

    'Breeze.EdmBuilder 1.0.4' 已安裝。 NugetRestoreFail已經有了'Breeze.EdmBuilder 1.0.4'的引用。

    這個包AFAIK沒有錯。對於當我uninstall-package breeze.edmbuilder,然後重新安裝install-package breeze.edmbuilder -version 1.0.4,安裝工程和丟失edmbuilder.cs將出現在它所屬的「App_Start」文件夾中。

    失敗是可重複的到位

    • 關閉解決方案
    • 刪除edmbuilder.cs從 「App_Start」
    • 刪除 「包」 的文件夾
    • 選擇性地刪除了。鎖和bin和OBJ目錄
    • 重新打開該解決方案,並重新建立

    你會得到相同的失敗行爲......和手動卸載並重新安裝相同的能力。

    FWIW,從.csproj中刪除對的引用edmbuilder.cs沒有任何影響。

    無論我做什麼,我都必須手動卸載並重新安裝軟件包。

    WTF!

    p.s .:我正在使用VS 2013 Update 2 RC。我懷疑「RC」很重要,因爲這個問題引起了我的顧客的關注。你永遠不會知道。

    p.p.s:這不是關於構建失敗,我不在乎這個解決方案永遠不會運行。你在這裏看到的是一個真正的應用程序的精簡版本,可以工作。唯一的問題是「爲什麼沒有恢復的文件?」

  • 回答

    2

    包還原是不是與安裝包相同。你所看到的是設計。它只需下載文件夾中的任何缺少的包。不再。沒有更少。

    軟件包還原已添加,因此您不需要將軟件包文件夾提交到源代碼管理。

    預計你會安裝一個包,然後提交可能已添加喜歡你edmbuilder.cs,你的項目文件夾內基本上是什麼項目文件以及任何文件所做的更改。您將排除軟件包文件夾。

    現在,當你從源代碼控制中獲得源代碼時,除了包文件之外,所有東西都會存在。軟件包恢復將下載這些,現在您的工作副本已完成。

    NuGet's Restore Package insists on specific package versions

    +0

    等一下。我讀過你的鏈接,它似乎表示恢復將具有與安裝相同的副作用(如更新.config文件,**添加代碼**等)。它接着說:「當其他開發商或構建服務器檢查出來的代碼,他會讓你有**完全相同的副作用碼減去包文件**。包恢復只需從向下的NuGet拉這些文件存儲庫,現在我們擁有了在這個項目上工作所需的一切。「這很混亂。你說的恢復不會有安裝的副作用? – Ward

    +0

    其實我寫的是*安裝*包是什麼引入了副作用。這是*減去*承諾的實際包。軟件包恢復只需*將軟件包重新制作完畢。是的,我同意這是VS項目系統的副產品。然而,NuGet包不是簡單的程序集來引用。它們也可能包含安裝腳本,這些腳本可能無法在VS的上下文之外工作,例如構建服務器。如果您只是將Package Restore視爲將您從檢入包中解脫出來,那將更有意義。 – Kiliman

    +0

    這是一篇博文,稱這是一個常見的誤解: http://jeffhandley.com/archive/2013/12/09/nuget-package-restore-misconceptions.aspx 添加到項目中的內容文件必須是與該項目簽入。假裝他們不是來自NuGet。他們現在是您的項目中可編輯的源文件。 二進制文件包的原因恢復創建的原因 - 沒有人願意來檢查第三方二進制文件到源代碼控制。 –

    1

    這是愚蠢還是什麼?

    感謝@Kiliman解釋我可怕的經歷是「通過設計」。

    那麼,您如何才能真正獲得您認爲正在恢復的內容?你一次安裝一個軟件包嗎?這太瘋狂了。

    我正要觀察的是,當我發現實際上有一個幾乎相同的東西時,我會觀察到沒有相當於npm install的nuget會獲取所需的所有包。這只是不明顯,我不知道有多少人知道它存在。

    這兩個步驟:

    1. 首先恢復丟失的包...THEN

    2. 發出命令:Update-Package -Reinstall

    這將重新安裝在您的解決方案每一個項目的所有包。

    如果你只是想重新安裝特定項目,請嘗試:

    Update-Package -ProjectName 'YourProjectName' -Reinstall 
    

    在這兩個過程中,-Reinstall開關努力安裝在您的package.config闡明的包的確切版本。 ..而不是更新的「更新」包可能會或可能不適用於您的項目(但請參閱文檔的例外)。

    題爲「Reinstalling Packages and its Pitfalls」官方的NuGet文檔閱讀update-package -reinstall

    不要錯過警示言論。很顯然,這種技術只不過是您對其他軟件包管理者的期望。

    祝你好運,人民。

    +0

    我明白你的沮喪,但我不確定我看到了問題。如果你沒有安裝它們,你如何指定軟件包?這爲您提供了成功恢復所需的一切。我認爲其他軟件包系統更簡單,因爲底層平臺的構建系統更簡單。我知道有一個改進VS項目系統的舉措。希望他們考慮到這種情況。 – Kiliman

    +1

    謝謝@Killman。我感謝你的幫助和善意,同時也爲我自己的寵愛而感到遺憾。只是因爲nuget是我身邊一貫的刺,沒有理由把它放在你身上。我應該補充說,其他軟件包管理人員自己也感到沮喪。顯然這個問題很難。我將努力在未來更加親切和理解。 – Ward