中文版Visual Studio安裝各種Preview或RC的NuGet套件

越來越快的軟體發行速度

不知道各位讀者有沒有發現,現在各種技術更新的速度越來越快。例如,這個Release Candidates for ASP.NET MVC 5.1, Web API 2.1 and Web Page 3.1消息,明明ASP.NET MVC 5、ASP.NET Web API 2才剛推出沒多久,就馬上有新版本跟著推出。就取得新功能或功能改善而言,這是件好事。當開發者想要嘗試這些Preview或RC功能時,可能會馬上碰壁,而停下了學習的腳步實在可惜。

範例:MVC 5無法升級MVC 5.1 RC

新增一個ASP.NET MVC 5專案,進行MVC 5.1 RC的安裝:

Install-Package Microsoft.AspNet.Mvc -pre

Install-Package : 更新 'Microsoft.AspNet.Mvc 5.0.0' 至 'Microsoft.AspNet.Mvc 5.1.0-rc1' 失敗。找不到與 'Microsoft.AspNet.Mvc 5.1.0-rc1' 相容的 'Microsoft.AspNet.Mvc.zh-Hant' 版本。
位於 線路:1 字元:1
+ Install-Package Microsoft.AspNet.Mvc -pre
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Install-Package], InvalidOperationException
    + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.InstallPackageCommand

MVC 5.1 RC安裝錯誤

這裡馬上就碰到無法找到對應語系的套件,進而無法安裝的訊息。

範例:Web API 2無法升級Web API 2.1 RC

新增一個ASP.NET Web API 2專案,進行Web API 2.1 RC的安裝:

Install-Package Microsoft.AspNet.WebApi -Pre

Install-Package : 更新 'Microsoft.AspNet.WebApi.WebHost 5.0.0' 至 'Microsoft.AspNet.WebApi.WebHost 5.1.0-rc1' 失敗。找不到與 'Microsoft.AspNet.WebApi.WebHost 5.1.0-rc1' 相容的 'Microsoft.AspNet.WebApi.WebHost.zh-Hant' 版本。
位於 線路:1 字元:1
+ Install-Package Microsoft.AspNet.WebApi -Pre
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Install-Package], InvalidOperationException
    + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.InstallPackageCommand

Web API 2.1 RC安裝錯誤

一樣是無法找到對應語系的套件的問題。

這問題很久了,我一定要解決它(握拳)

會出現這種問題,會很直覺認為是不是中文版Visual Studio的身上,因為在英文版的Visual Sutudio並不會產生以上問題。所以引發以下解法一:

解法一:安裝英文語言包

Visual Studio安裝語言

這功能從Visual Studio 2012就有了,安裝之後,它不是只有換換UI介面的文字,而是連錯誤訊息…等都會給你英文內容,簡單說就是給你一個英文版(如果你安裝是英文語言)的Visual Studio的開發環境。從英文Visual Studio 2013裡去新增ASP.NET MVC 5或ASP.NET Web API 2的專案,都能順利升級至ASP.NET MVC 5.1 RC或ASP.NET Web API 2.1 RC。

解法二:開空白專案

以上安裝語言包的方法,很呆。因為為了一個小小小功能的測試,要安裝個數百MB的語言包來解決。

Empty Project

在Visual Studio 2013中One ASP.NET範本裡的「Empty專案」真的好空白。透過Empty專案,即可順利安裝ASP.NET MVC 5.1 RC套件或ASP.NET Web API 2.1 RC套件。

不過還是有點麻煩,我要自己建Controllers、Models、Views…目錄,我不就是測試MVC嗎?還要費那麼大功夫,RTM再學就好。

No!No!No!

解法三:MVC 5 to Web API 2.1 RC

剛剛新增一個MVC 5的專案,雖然在升級MVC 5.1 RC的過程讓我們血壓升高了那麼一點,但是如果各立嘗試性在此專案下(WebFroms也可)進行Web API 2.1 RC的安裝動作,你會發現一切是那麼的順利。

(以上省略)...
已經成功安裝 'Microsoft.AspNet.WebApi 5.1.0-rc1'。
正在新增 'Microsoft.AspNet.WebApi.Client 5.1.0-rc1' 至 WebApplication5。
已成功將 'Microsoft.AspNet.WebApi.Client 5.1.0-rc1' 加入 WebApplication5。
正在新增 'Microsoft.AspNet.WebApi.Core 5.1.0-rc1' 至 WebApplication5。
已成功將 'Microsoft.AspNet.WebApi.Core 5.1.0-rc1' 加入 WebApplication5。
正在新增 'Microsoft.AspNet.WebApi.WebHost 5.1.0-rc1' 至 WebApplication5。
已成功將 'Microsoft.AspNet.WebApi.WebHost 5.1.0-rc1' 加入 WebApplication5。
正在新增 'Microsoft.AspNet.WebApi 5.1.0-rc1' 至 WebApplication5。
已成功將 'Microsoft.AspNet.WebApi 5.1.0-rc1' 加入 WebApplication5。

為何Empty專案可以順利安裝?為何MVC 5(WebForms)專案可以順利安裝Web API 2.1 RC?

進行至此,有沒有找出一些規則了?

解法四:移除NuGet相依性

到解法三,聰明的人應該就能知道,無法安裝不是中文版Visual Studio的問題,而是NuGet裡套件相依性的問題,預設的中文範本中,NuGet相關套件都加入相關語系的套件,而像MVC 5.1 RC或Web API 2.1 RC這類套件,官方都只發行主套件,而對應的語系套件都還未發行,所以NuGet在比對前後二個版本之後認為,前一個版本(MVC 5 / Web APi 2)是有語系相關聯的,所以此版本(MVC 5.1 RC / Web APi 2.1 RC)也應該有語系套件。

修改 packages.config 移除相依性

第一種移除相依性的方法是用騙的

我們在MVC 5專案下可以找到一個packages.config的NuGet套件組態檔:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Antlr" version="3.4.1.9004" targetFramework="net45" />
  <package id="bootstrap" version="3.0.0" targetFramework="net45" />
  <package id="EntityFramework" version="6.0.0" targetFramework="net45" />
  <package id="EntityFramework.zh-Hant" version="6.0.0" targetFramework="net45" />
  <package id="jQuery" version="1.10.2" targetFramework="net45" />
  <package id="jQuery.Validation" version="1.11.1" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.Core" version="1.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.Core.zh-Hant" version="1.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.EntityFramework" version="1.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.EntityFramework.zh-Hant" version="1.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.Owin" version="1.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.Owin.zh-Hant" version="1.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Mvc" version="5.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Mvc.zh-Hant" version="5.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Razor" version="3.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Razor.zh-Hant" version="3.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.1" targetFramework="net45" />
  <package id="Microsoft.AspNet.Web.Optimization.zh-Hant" version="1.1.1" targetFramework="net45" />>
  <package id="Microsoft.AspNet.WebPages" version="3.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebPages.zh-Hant" version="3.0.0" targetFramework="net45" />
  <package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Host.SystemWeb.zh-Hant" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Cookies" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Facebook" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Facebook.zh-Hant" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Google" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Google.zh-Hant" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.MicrosoftAccount" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.MicrosoftAccount.zh-Hant" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.OAuth" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Twitter" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Twitter.zh-Hant" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.zh-Hant" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.zh-Hant" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
  <package id="Modernizr" version="2.6.2" targetFramework="net45" />
  <package id="Newtonsoft.Json" version="5.0.6" targetFramework="net45" />
  <package id="Owin" version="1.0" targetFramework="net45" />
  <package id="Respond" version="1.2.0" targetFramework="net45" />
  <package id="WebGrease" version="1.5.2" targetFramework="net45" />
</packages>
  

從內容上我們可以看到有許多語言套件(.zh-Hant),只要把MVC 5.1 RC或Web API 2.1 RC要更新且有語言套件的內容從註解,就可以完成更新。

查詢ASP.NET MVC 5.1.0-rc1的內容,除了Microsoft.AspNet.Mvc會更新之外,還會更新:

  • Microsoft.AspNet.WebPages
  • Microsoft.AspNet.Razor

只要檢查以上三個相關套件是否有語言套件(.zh-Hant)並註解即可。例如:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Antlr" version="3.4.1.9004" targetFramework="net45" />
  <package id="bootstrap" version="3.0.0" targetFramework="net45" />
  <package id="EntityFramework" version="6.0.0" targetFramework="net45" />
  <package id="EntityFramework.zh-Hant" version="6.0.0" targetFramework="net45" />
  <package id="jQuery" version="1.10.2" targetFramework="net45" />
  <package id="jQuery.Validation" version="1.11.1" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.Core" version="1.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.Core.zh-Hant" version="1.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.EntityFramework" version="1.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.EntityFramework.zh-Hant" version="1.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.Owin" version="1.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Identity.Owin.zh-Hant" version="1.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Mvc" version="5.0.0" targetFramework="net45" />
  <!--<package id="Microsoft.AspNet.Mvc.zh-Hant" version="5.0.0" targetFramework="net45" />-->
  <package id="Microsoft.AspNet.Razor" version="3.0.0" targetFramework="net45" />
  <!--<package id="Microsoft.AspNet.Razor.zh-Hant" version="3.0.0" targetFramework="net45" />-->
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.1" targetFramework="net45" />
  <package id="Microsoft.AspNet.Web.Optimization.zh-Hant" version="1.1.1" targetFramework="net45" />>
  <package id="Microsoft.AspNet.WebPages" version="3.0.0" targetFramework="net45" />
  <!--<package id="Microsoft.AspNet.WebPages.zh-Hant" version="3.0.0" targetFramework="net45" />-->
  <package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Host.SystemWeb.zh-Hant" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Cookies" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Facebook" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Facebook.zh-Hant" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Google" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Google.zh-Hant" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.MicrosoftAccount" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.MicrosoftAccount.zh-Hant" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.OAuth" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Twitter" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.Twitter.zh-Hant" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.Security.zh-Hant" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Owin.zh-Hant" version="2.0.0" targetFramework="net45" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
  <package id="Modernizr" version="2.6.2" targetFramework="net45" />
  <package id="Newtonsoft.Json" version="5.0.6" targetFramework="net45" />
  <package id="Owin" version="1.0" targetFramework="net45" />
  <package id="Respond" version="1.2.0" targetFramework="net45" />
  <package id="WebGrease" version="1.5.2" targetFramework="net45" />
</packages>
  

重新進行ASP.NET MVC 5.1 RC的安裝Install-Package Microsoft.AspNet.Mvc -pre,立即成功。

ASP.NET Web API 2.1 RC的安裝同理可證。

管理 NuGet 套件

也可以透過 NuGet 的 GUI 工具來進行以上動作。透過 GUI 工具的好處是不怕把 packages.config 改壞了。

首先,一樣到NuGet上去確認一下相關情況。這裡我們換用剛剛新增的ASP.NET Web API 2專案來說明。

確認Microsoft ASP.NET Web API 5.1.0-rc1的相依狀況,或是透過授權接受的頁面瞭解一下相關套件。

NuGet相依套件

回到「已安裝的套件」並找到相關套件且有「繁體中文 資源」的,把「繁體中文 資源」相關套件給移除,以升級Web API 2.1 RC為例:

  • Microsoft.AspNet.WebApi.Client
  • Microsoft.AspNet.WebApi.Core
  • Microsoft.AspNet.WebApi.WebHost

這三個套件的「繁體中文 資源」套件給移除後就能正常進行Web API 2.1 RC的安裝了。

進行這種Preview或RC的學習要先有一定的心理建設,出問題或出錯是很正常的事。例如,MVC 5.1新提供的Html.EnumDropDownListFor()的功能,它就不會出現在我的 IntelliSense 裡。但依官方文章來測試是正常。不要.(點)不出來又以為怎麼了。

Preview / RC for fun.

參考資料

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。