越來越快的軟體發行速度
不知道各位讀者有沒有發現,現在各種技術更新的速度越來越快。例如,這個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
這裡馬上就碰到無法找到對應語系的套件,進而無法安裝的訊息。
範例:Web API 2無法升級Web API 2.1 RC
新增一個ASP.NET Web API 2專案,進行Web API 2.1 RC的安裝:
Install-Package Microsoft.AspNet.WebApi -Pre
一樣是無法找到對應語系的套件的問題。
這問題很久了,我一定要解決它(握拳)
會出現這種問題,會很直覺認為是不是中文版Visual Studio的身上,因為在英文版的Visual Sutudio並不會產生以上問題。所以引發以下解法一:
解法一:安裝英文語言包
這功能從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的語言包來解決。
在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的安裝動作,你會發現一切是那麼的順利。
為何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的相依狀況,或是透過授權接受的頁面瞭解一下相關套件。
回到「已安裝的套件」並找到相關套件且有「繁體中文 資源」的,把「繁體中文 資源」相關套件給移除,以升級Web API 2.1 RC為例:
- Microsoft.AspNet.WebApi.Client
- Microsoft.AspNet.WebApi.Core
- Microsoft.AspNet.WebApi.WebHost
這三個套件的「繁體中文 資源」套件給移除後就能正常進行Web API 2.1 RC的安裝了。
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。