這篇文章背後有個悲慘故事,微軟在11/30釋出了VS2015 Update 1,隔天我就迫不及動手要升級,最後卻足足花了四天,晚上開夜車研究,清晨四點多想到點子爬起來繼續射茶包(沒搞定睡不著,射手的宿命 orz),直到剛剛才正式把VS2015U1裝好~
小小的升級安裝搞成天堂路,內情自然不單純,別擔心,我的痛苦遭遇源自系統環境特殊,大家應不會遇到。但網路上看到很多人抱怨Visual Studio 2015安裝很慢,一裝數小時,停在某個安裝項目久久沒進展,搞不清楚是當掉還是安裝中?不知道該耐心等候還是果決中斷不浪費生命?有鑑於我可能是全台灣安裝VS2015 Update 1次數最多的記錄保持人,過程搞懂一些Visual Studio安裝原理跟偵錯技巧,抱著捨我其誰的精神,分享偵察VS2015安裝卡住問題的小技巧。
Visual Studio的安裝方式有兩種,網路安裝或安裝光碟(VS2015U1的安裝媒體高達5.89GB,已超過普通DVD的容量,通常都是下載後掛成虛擬光碟機)。網路安裝檔很小,只有737KB,會依你勾選的安裝項目下載安裝檔回來。第一次使用網路安裝失敗後,無法釐清是網路問題還是安裝錯誤,決定由MSDN下載光碟檔,排除網路下載因素。之後還是歷經安裝特定項目卡住不動,等數小時也無進展的狀況。學會看Log後才知道,某些時候該項目的安裝程式早已出錯中止,是Visual Studio安裝程式未接到通知才讓使用者傻等,這種情況等到海枯石爛也不會有結果的… orz
要區別Visual Studio是在安裝中還是已經當掉卡死,Log檔是最好的觀察指標。開啟檔案總管,輸入"%TEMP%"進入暫存資料夾,安裝VS時應該要看到一堆dd_vs_*_yyyyMMddHHmmss_****.log檔案。
用修改日期排序,健康的安裝過程應該要一直冒出新檔案,再不然是最新的一筆Log檔持續變大。如果你發現檔案超過十分鐘沒變化,就像沒聽到心跳,八成大事不妙。此時可以挑最新的幾個檔案查詢安裝項目的處理狀態,像我就遇到在Microsoft .NET Framework 4.5 Multi-Targeting Pack卡住超過一小時:
打開當時最新的Log檔 dd_vs_enterprise_20151203220108_027_netfxdtp_48.log,就知道發生了什麼事:
MSI (s) (24:C8) [22:10:21:955]: Machine policy value 'DisableUserInstalls' is 0
MSI (s) (24:C8) [22:10:21:962]: Warning: Local cached package 'C:\Windows\Installer\1641d83.msi' is missing.
MSI (s) (24:C8) [22:10:21:962]: User policy value 'SearchOrder' is 'nmu'
MSI (s) (24:C8) [22:10:21:962]: User policy value 'DisableMedia' is 0
MSI (s) (24:C8) [22:10:21:962]: Machine policy value 'AllowLockdownMedia' is 1
MSI (s) (24:C8) [22:10:21:962]: SOURCEMGMT: Looking for sourcelist for product {56E962F0-4FB0-3C67-88DB-9EAA6EEFC493}
MSI (s) (24:C8) [22:10:21:962]: SOURCEMGMT: Adding {56E962F0-4FB0-3C67-88DB-9EAA6EEFC493}; to potential sourcelist list (pcode;disk;relpath).
MSI (s) (24:C8) [22:10:21:962]: SOURCEMGMT: Now checking product {56E962F0-4FB0-3C67-88DB-9EAA6EEFC493}
MSI (s) (24:C8) [22:10:21:962]: SOURCEMGMT: Attempting to use LastUsedSource from source list.
MSI (s) (24:C8) [22:10:21:962]: SOURCEMGMT: Processing net source list.
MSI (s) (24:C8) [22:10:21:962]: SOURCEMGMT: Trying source C:\ProgramData\Package Cache\{56E962F0-4FB0-3C67-88DB-9EAA6EEFC493}v4.5.50710\Redistributable\4.5.50710\.
MSI (s) (24:C8) [22:10:21:962]: Note: 1: 1402 2: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer 3: 2
MSI (s) (24:C8) [22:10:21:962]: Note: 1: 2203 2: C:\ProgramData\Package Cache\{56E962F0-4FB0-3C67-88DB-9EAA6EEFC493}v4.5.50710\Redistributable\4.5.50710\netfx45_dtp.msi 3: -2147287037
MSI (s) (24:C8) [22:10:21:962]: SOURCEMGMT: Source is invalid due to missing/inaccessible package.
MSI (s) (24:C8) [22:10:21:962]: Note: 1: 1706 2: -2147483647 3: netfx45_dtp.msi
MSI (s) (24:C8) [22:10:21:962]: SOURCEMGMT: Processing media source list.
MSI (s) (24:C8) [22:10:21:963]: SOURCEMGMT: Trying media source G:\.
MSI (s) (24:C8) [22:10:21:963]: Note: 1: 2203 2: G:\netfx45_dtp.msi 3: -2147287038
MSI (s) (24:C8) [22:10:21:963]: SOURCEMGMT: Source is invalid due to missing/inaccessible package.
MSI (s) (24:C8) [22:10:21:963]: SOURCEMGMT: Trying media source D:\.
MSI (s) (24:C8) [22:10:21:963]: Note: 1: 2203 2: D:\netfx45_dtp.msi 3: -2147287038
MSI (s) (24:C8) [22:10:21:963]: SOURCEMGMT: Source is invalid due to missing/inaccessible package.
MSI (s) (24:C8) [22:10:21:964]: Note: 1: 1706 2: -2147483647 3: netfx45_dtp.msi
MSI (s) (24:C8) [22:10:21:964]: SOURCEMGMT: Processing URL source list.
MSI (s) (24:C8) [22:10:21:964]: Note: 1: 1402 2: UNKNOWN\URL 3: 2
MSI (s) (24:C8) [22:10:21:964]: Note: 1: 1706 2: -2147483647 3: netfx45_dtp.msi
MSI (s) (24:C8) [22:10:21:964]: Note: 1: 1706 2: 3: netfx45_dtp.msi
問題出在安裝程式找不到netfx45_dtp.msi的安裝檔,但VS2015主安裝程式沒有察覺此一狀況,讓我也跟著痴心守侯數小時(我寶貴的青春吶),直到耐心耗盡,怒砍安裝程式為止。(砍安裝程式會造成安裝不完整,事後得確實修復,否則無法使用某些功能)
【結論】
遇到Visual Studio安裝進度卡在某個項目很久,可善用安裝Log檔確認狀態及找出原因。至於如何排除問題有賴見招拆招,恕無萬用大絕可分享。(其實有啦,重灌Windows… XD)
【後記】
回到我的悲慘故事,花了很久時間,終於找到問題癥結在於先前為了騰出C槽空間,我搬動了Installer及Package Cache目錄。請不要誤會,移動這兩個目錄基本上是安全的,並非致命因素。但很不幸地,上週剛好才將筆電原機升級Windows 10,Windows 10很貼心地保留原本的Windows目錄放在Windows.old,另外開了一個Windows目錄,允許使用者後悔退回原本的作業系統版本。大家有猜到問題了嗎?升級過程Installer及Package Cache檔案沒有順利搬到Windows 10,陰錯陽差,炸得我遍體鱗傷!補齊兩個資料夾後,我的Visual Studio 2015 Update終於裝好了… (淚)