網(wǎng)離線安裝保姆級指南:從下載到部署全流程)
做內(nèi)網(wǎng)開發(fā)環(huán)境的同學(xué)或者是在保密網(wǎng)、工業(yè)現(xiàn)場、學(xué)校機(jī)房搞C開發(fā)的兄弟一定都體會過這種痛苦機(jī)器物理隔離U盤要過審?fù)饩W(wǎng)下載一次VS要幾個小時(shí)結(jié)果到了內(nèi)網(wǎng)一安裝安裝器對著一個空目錄干瞪眼。Visual Studio 2019的離線安裝說白了就是提前在有網(wǎng)機(jī)器上把整個安裝源layout拉下來再整個搬到內(nèi)網(wǎng)但這里面藏著大量細(xì)節(jié)證書、組件清單、靜默參數(shù)、運(yùn)行庫順序任何一個環(huán)節(jié)錯了都會讓你白折騰一整天。這篇文章我直接給出一套保姆級方案從有網(wǎng)電腦下載離線包開始到內(nèi)網(wǎng)機(jī)器靜默安裝再到C環(huán)境驗(yàn)證全流程帶參數(shù)、帶截圖說明、帶坑點(diǎn)記錄。適合從來沒搞過離線部署的新手也適合已經(jīng)裝過但想整理出一套標(biāo)準(zhǔn)流程的運(yùn)維/開發(fā)同學(xué)。我盡量把每一個“為什么”都講明白而不只是甩給你一條命令。1. 離線安裝的核心思路與準(zhǔn)備工作1.1 先搞明白VS2019的安裝機(jī)制你才不會一頭霧水Visual Studio的安裝器和普通人理解的不太一樣。你下載的那個vs_community.exe并不是完整的安裝包它只是一個幾十MB的“引導(dǎo)器”bootstrapper體積小到會讓你懷疑人生。真正干活的時(shí)候這個引導(dǎo)器會根據(jù)你勾選的組件實(shí)時(shí)去微軟的CDN拉取幾百M(fèi)B甚至幾個GB的實(shí)際文件。這也是為什么內(nèi)網(wǎng)環(huán)境直接雙擊vs_community.exe會卡死在“正在準(zhǔn)備”或者“下載中”的界面——因?yàn)閮?nèi)網(wǎng)機(jī)器根本連不上微軟的下載服務(wù)器。離線安裝的核心思路就一句話在外面有網(wǎng)的機(jī)器上用這個引導(dǎo)器把需要的組件全部下載到本地硬盤生成一個完整的離線安裝源然后把整個文件夾拷進(jìn)內(nèi)網(wǎng)用同樣的引導(dǎo)器指著這個本地目錄進(jìn)行安裝。微軟官方管這個機(jī)制叫“l(fā)ayout布局”聽起來玄乎其實(shí)就是把緩存目錄當(dāng)安裝源。搞明白這一點(diǎn)后面所有參數(shù)都好理解了。你在命令行里敲的那些--layout、--add、--includeRecommended本質(zhì)上都是在告訴引導(dǎo)器“幫我下載這些東西到一個文件夾”。1.2 你可能需要的物料清單在動手之前先把該準(zhǔn)備的軟件文件列個清單免得中途到處找引導(dǎo)器安裝包vs_community.exe社區(qū)版、vs_professional.exe專業(yè)版或vs_enterprise.exe企業(yè)版。根據(jù)公司或?qū)W校實(shí)際授權(quán)來選社區(qū)版對個人學(xué)習(xí)和小團(tuán)隊(duì)足夠用但商業(yè)項(xiàng)目要按微軟授權(quán)要求選擇版本。工作負(fù)載組件通過上面說到的--layout命令在有網(wǎng)機(jī)器上下載這是大頭通常有幾個GB。系統(tǒng)運(yùn)行庫Microsoft Visual C Redistributable 2015-2022 的 x86 和 x64 版本這個很多軟件都依賴單獨(dú)拿一份出來總沒錯。.NET Framework 4.8 離線安裝包VS2019本身依賴.NET環(huán)境內(nèi)網(wǎng)機(jī)器如果系統(tǒng)較舊需要先打上。U盤或移動硬盤建議至少準(zhǔn)備64GB如果你要裝全套C桌面開發(fā)加上游戲開發(fā)組件20GB到40GB很常見。用exFAT或NTFS格式。1.3 版本選型Community、Professional還是Enterprise內(nèi)網(wǎng)環(huán)境選版本要特別注意。Community版社區(qū)版對個人開發(fā)者免費(fèi)但有些單位的環(huán)境會要求專業(yè)版或企業(yè)版因?yàn)樯鐓^(qū)版在大型企業(yè)內(nèi)使用有授權(quán)限制。這里不展開授權(quán)法務(wù)問題只說技術(shù)層面的區(qū)別三個版本的引導(dǎo)器不同但離線安裝方法和參數(shù)基本一樣只要把exe文件名換掉就行。另外提醒一句裝之前先確認(rèn)C開發(fā)到底需要什么。VS2019的組件特別分散如果不勾選“使用C的桌面開發(fā)”工作負(fù)載光裝個基礎(chǔ)IDE你連cl.exe編譯器都找不到寫了一堆C代碼也沒法編譯。后面我會給一份面向C開發(fā)的組件清單照著抄就行。2. 在有網(wǎng)電腦上生成離線安裝包這一步?jīng)Q定了你后面少走多少彎路2.1 核心命令--layout 的完整打開方式有網(wǎng)電腦上首先把引導(dǎo)器比如vs_community.exe放到一個空目錄然后用管理員身份打開命令提示符CMD或PowerShell都行敲下面這行命令vs_community.exe --layout D:\vs2019_offline --add Microsoft.VisualStudio.Workload.NativeDesktop --includeRecommended --lang zh-CN逐個參數(shù)拆解--layout D:\vs2019_offline指定離線安裝源的存放路徑。建議放到空間充足的盤后面你還會反復(fù)用到這個目錄。--add Microsoft.VisualStudio.Workload.NativeDesktop指定要下載的工作負(fù)載。“NativeDesktop”就是“使用C的桌面開發(fā)”對應(yīng)VS安裝器里的那一大塊勾選區(qū)域。--includeRecommended下載該工作負(fù)載下的推薦組件。如果追求體積小可以不加這個參數(shù)但為了后續(xù)少折騰我建議加。--lang zh-CN下載簡體中文語言包。想要英文界面就把這個換成en-US或者干脆不寫界面語言會在安裝時(shí)自動匹配系統(tǒng)語言。需要注意的是--layout這條命令只負(fù)責(zé)把文件下載到本地不會開始安裝Visual Studio。下載時(shí)間取決于你的網(wǎng)絡(luò)和選擇的組件C桌面開發(fā)全量套餐一般30分鐘到2小時(shí)不等中間斷網(wǎng)可以重新跑它會斷點(diǎn)續(xù)傳。2.2 C開發(fā)場景的組件清單推薦如果你的需求不只是桌面應(yīng)用下面的組件ID可以加到上一條命令里多條--add反復(fù)追加即可開發(fā)場景組件ID說明通用Windows桌面應(yīng)用Microsoft.VisualStudio.Workload.NativeDesktop最核心的C桌面開發(fā)必裝Windows應(yīng)用商店/UWP開發(fā)Microsoft.VisualStudio.Workload.Universal如果涉及WinUI或UWP才需要Linux遠(yuǎn)程C開發(fā)Microsoft.VisualStudio.Workload.NativeCrossPlat用VS寫Linux程序時(shí)用得上游戲開發(fā)CMicrosoft.VisualStudio.Workload.NativeGame基于DirectX的游戲開發(fā)組件Python原生擴(kuò)展Microsoft.VisualStudio.Component.Python如果要在VS里混合寫Python/C普通情況下我只推薦NativeDesktop加--includeRecommended就夠了。因?yàn)槟愫竺鎸π枨蟛幻鞔_時(shí)這套默認(rèn)組合已經(jīng)覆蓋了MSVC編譯器、Windows SDK、CMake工具、測試工具等一整套。組件的ID如果你記不全也沒關(guān)系??梢栽谟芯W(wǎng)機(jī)器上先運(yùn)行vs_community.exe打開圖形界面把所有需要的勾選好然后看右下角“安裝位置”下面的“下載到緩存”選項(xiàng)它會引導(dǎo)你生成一個同樣的離線布局不過命令行方式對以后批量部署更友好。2.3 下載完成后的文件檢查與壓縮搬運(yùn)技巧下載完成后在D:\vs2019_offline目錄下你應(yīng)該能看到vs_community.exe Contents/ 目錄里面是JSON清單文件 Packages/ 目錄緩存的所有組件安裝包Packages目錄里會有上萬個.msi、.cab、.vsix文件這是非常重要的標(biāo)志——如果這個目錄是空的或者只有幾個小文件說明之前下載失敗過或者是命令參數(shù)不對這時(shí)不要強(qiáng)行往內(nèi)網(wǎng)搬重跑一次--layout等它補(bǔ)齊再說。搬運(yùn)之前我強(qiáng)烈建議做兩件事對Packages目錄里最大的幾個.cab文件做一次哈希校驗(yàn)。Windows下用certutil命令比如certutil -hashfile D:\vs2019_offline\Packages\某個大文件.cab SHA256把算出的哈希值和微軟官方清單Contents目錄里能找到預(yù)期值比對或者不同批次下載時(shí)記錄對比能有效防止U盤拷貝過程中文件損壞。把整個目錄壓縮成一個分卷包或者直接保持目錄結(jié)構(gòu)原樣拷到U盤。如果你打算用網(wǎng)線/內(nèi)網(wǎng)共享傳輸分卷壓縮到4GB以下比較穩(wěn)妥如果直接插U盤保留原目錄結(jié)構(gòu)最好因?yàn)閂S安裝器對目錄層級很敏感解壓之后路徑變了會導(dǎo)致安裝找不到緩存文件。我個人的習(xí)慣是保留原始目錄結(jié)構(gòu)不重新打包。因?yàn)榉志斫鈮喝f一漏了一個包你又得從頭拷貝一遍。U盤足夠大的情況下原樣復(fù)制最省心。3. 內(nèi)網(wǎng)目標(biāo)機(jī)器的部署與靜默安裝全記錄3.1 最容易翻車的一步證書導(dǎo)入與系統(tǒng)依賴準(zhǔn)備到了內(nèi)網(wǎng)機(jī)器別急著雙擊安裝包。VS的離線安裝包里有大量驅(qū)動、組件和擴(kuò)展是被微軟代碼簽名證書簽名的系統(tǒng)必須信任這些證書安裝過程才不會反復(fù)彈窗或者直接報(bào)錯。在安裝目錄里的Contents子目錄下通常會有這樣的證書文件D:\vs2019_offline\Contents\Certificates\...你需要把這些.cer文件導(dǎo)入到“受信任的根證書頒發(fā)機(jī)構(gòu)”和“受信任的發(fā)布者”。命令方式如下假設(shè)證書A是根證書B是發(fā)行者證書certutil.exe -addstore Root 證書A.cer certutil.exe -addstore TrustedPublisher 證書B.cer如果你不確定哪些是根證書哪些是發(fā)布者證書最簡單的土辦法是右鍵證書文件查看“詳細(xì)信息”里的“使用者”和“頒發(fā)者”如果兩者相同那一般就是根證書如果“頒發(fā)者”是Microsoft Corporation那就是葉子證書導(dǎo)到TrustedPublisher就對了。證書導(dǎo)入是內(nèi)網(wǎng)安裝“翻車率”極高的地方。我在實(shí)際部署時(shí)遇到過一臺機(jī)器因?yàn)槿弊C書導(dǎo)致安裝進(jìn)行到70%時(shí)突然回滾日志一片紅重試了多少次都不行最后排查半天才發(fā)現(xiàn)是該導(dǎo)入的.cer沒導(dǎo)入。導(dǎo)入證書后檢查一下系統(tǒng)里有沒有裝好 .NET Framework 4.8。VS2019的很多組件要在.NET上運(yùn)行內(nèi)網(wǎng)Win10/Server系統(tǒng)一般自帶但如果你的內(nèi)網(wǎng)機(jī)器是舊版Windows Server 2012之類可能得先去裝一個離線版.NET Framework 4.8安裝包。3.2 靜默安裝命令真正干活的現(xiàn)場所有準(zhǔn)備工作到位后開始安裝。進(jìn)入D:\vs2019_offline目錄以管理員身份打開CMD執(zhí)行vs_community.exe --installPath C:\Program Files (x86)\Microsoft Visual Studio\2019\Community --layout D:\vs2019_offline --includeRecommended --quiet --wait參數(shù)說明--installPathVS安裝的目標(biāo)目錄。盡量別改回默認(rèn)改來改去容易出權(quán)限問題。--layout D:\vs2019_offline這是關(guān)鍵中的關(guān)鍵告訴安裝器“我不要去網(wǎng)上找就從本地這個目錄加載”。不帶這個參數(shù)安裝器依然會嘗試聯(lián)網(wǎng)內(nèi)網(wǎng)機(jī)器就會卡死。--quiet靜默模式不彈界面安裝日志會寫入%temp%目錄。如果你想看進(jìn)度去掉這個參數(shù)使用圖形界面手動點(diǎn)下一步我實(shí)測兩者安裝結(jié)果一致但靜默模式適合批量裝機(jī)。--wait讓CMD等待安裝結(jié)束并返回退出碼而不是立刻彈出命令行。這個參數(shù)在做腳本化部署時(shí)很重要否則腳本執(zhí)行完你以為裝好了其實(shí)后臺還在跑。執(zhí)行后就可以去泡杯茶了。安裝C桌面開發(fā)全量組件大概20到40分鐘取決于機(jī)器性能。期間你可以打開任務(wù)管理器看到vs_installer.exe和一堆子進(jìn)程在跑CPU占用忽高忽低屬正常。3.3 安裝驗(yàn)證用vswhere和第一個C程序說話安裝結(jié)束后先看一下退出碼。在CMD里執(zhí)行echo %ERRORLEVEL%返回0基本就是成功。如果返回非0去%temp%\dd_setup_errors.txt或者C:\ProgramData\Microsoft\VisualStudio\Packages\_Instances下面翻日志。然后驗(yàn)證VS是否被系統(tǒng)正確識別。打開新的CMD執(zhí)行C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe -all -products \* -format jsonvswhere是官方提供的VS實(shí)例查找工具如果它輸出的JSON里能認(rèn)出你剛裝的實(shí)例說明裝好了。最后寫個C程序試編譯。在某個工作目錄新建hello.cpp#include iostream int main() { std::cout Hello from intranet C! std::endl; return 0; }然后打開“開發(fā)者命令提示符”開始菜單里搜“Developer Command Prompt for VS 2019”或者自己設(shè)置環(huán)境變量后執(zhí)行cl /EHsc hello.cpp hello.exe能打印出Hello from intranet C!就說明離線C編譯環(huán)境徹底通了。4. 離線C運(yùn)行庫與后續(xù)組件管理4.1 VC Redistributable 2015-2022 合并包的離線安裝順序其實(shí)到了這一步C編譯器已經(jīng)能用了但很多從網(wǎng)上下載的Windows程序比如一些第三方庫打包的exe、部分工業(yè)軟件運(yùn)行時(shí)還依賴系統(tǒng)級的Microsoft Visual C Redistributable。這個運(yùn)行庫不是VS安裝器自動幫你裝好的需要單獨(dú)處理。微軟官方已經(jīng)合并且統(tǒng)一命名為2015-2022分為x86和x64兩種。注意64位系統(tǒng)上兩個都要裝。因?yàn)楹芏喑绦蚴?2位編譯的只裝x64的話會無法啟動。靜默安裝的命令隨手記一下vc_redist.x86.exe /install /quiet /norestart vc_redist.x64.exe /install /quiet /norestart/norestart參數(shù)是不在安裝后強(qiáng)制重啟避免裝完直接彈重啟界面打斷你的部署流程。4.2 通過已有布局目錄做組件增補(bǔ)內(nèi)網(wǎng)機(jī)器已裝好VS之后發(fā)現(xiàn)還需要加裝其他組件怎么辦不用重新把整個包再拉一遍也用不著把機(jī)器重新部署。把之前用的D:\vs2019_offline那個布局目錄當(dāng)增量緩存的“原料庫”再次執(zhí)行vs_community.exe --layout D:\vs2019_offline --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --includeRecommended這個命令在有網(wǎng)機(jī)器上會把新增組件下載到同一個D:\vs2019_offline目錄里原有文件不會重復(fù)下載。然后你把這個增量部分更新到內(nèi)網(wǎng)再執(zhí)行安裝命令vs_community.exe --installPath C:\Program Files (x86)\Microsoft Visual Studio\2019\Community --layout D:\vs2019_offline --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --quiet增量安裝比全量安裝要快得多。但有一條必須記住內(nèi)網(wǎng)機(jī)器的布局目錄必須與有網(wǎng)機(jī)器上下載后的布局目錄完全同步至少新增組件對應(yīng)的Packages文件要拷過去否則安裝器找不到文件會嘗試聯(lián)網(wǎng)失敗。4.3 內(nèi)網(wǎng)開發(fā)環(huán)境選型VS2019之外還有沒有別的選擇雖然這篇文章的主角是VS2019但我還是多句嘴如果你只是要C編譯環(huán)境而且內(nèi)網(wǎng)機(jī)器性能一般VSCode配MinGW-w64或者DevC也是一種很輕量的離線方案MinGW-w64壓縮包不過幾百M(fèi)BU盤一拷就能用。但要是項(xiàng)目依賴MSVC特性、Windows SDK、MFC、ATL這些東西或者團(tuán)隊(duì)要用VS工程格式.sln/.vcxproj那你只能在VS2019系列里選。另外提醒VS2022的離線安裝機(jī)制和2019基本一樣但現(xiàn)在不少老項(xiàng)目還在用2019工具集所以這篇文章的方法在2022上同樣可以套用只需要把安裝包文件名和部分Workload ID換掉。5. 常見問題與排查技巧實(shí)錄5.1 安裝卡在“正在準(zhǔn)備”或“下載中0%”這個現(xiàn)象90%的情況是安裝命令里漏了--layout參數(shù)或者--layout指向的目錄是空的/不完整的。內(nèi)網(wǎng)機(jī)器無法訪問微軟服務(wù)器安裝器會反復(fù)嘗試聯(lián)網(wǎng)然后超時(shí)。處理辦法確認(rèn)你執(zhí)行安裝命令時(shí)所在目錄確實(shí)是布局根目錄。查看Packages目錄是否是空的。如果確認(rèn)布局沒問題檢查系統(tǒng)代理設(shè)置。有些內(nèi)網(wǎng)機(jī)器的IE代理是壞掉的VS安裝器會嘗試走系統(tǒng)代理導(dǎo)致卡住??梢匀ァ翱刂泼姘濉鶬nternet選項(xiàng)→連接→局域網(wǎng)設(shè)置”把代理關(guān)掉或者讓安裝命令跳過代理。5.2 安裝過程中突然回滾日志里有“證書”關(guān)鍵字這種情況我在3.1節(jié)里強(qiáng)調(diào)過大概率是證書沒導(dǎo)入完整。VS的離線安裝源里有很多微軟簽名的組件只要系統(tǒng)不信任簽名證書安裝器就會判定為不可信然后執(zhí)行回滾。解決辦法是重新把所有.cer文件導(dǎo)到Root和TrustedPublisher然后重新運(yùn)行安裝命令。另外如果你發(fā)現(xiàn)日志里報(bào)“無法驗(yàn)證簽名”之類的錯誤也可能是拷貝過程中文件損壞。把對應(yīng)報(bào)錯文件重新從有網(wǎng)機(jī)器拷貝一次或者重新執(zhí)行一次--layout增量修復(fù)。5.3 安裝成功但找不到cl.exe或MSVC編譯器如果VS圖形界面能打開但命令行里cl沒反應(yīng)注意你用的是不是“開發(fā)者命令提示符”。普通CMD不會自動加載VS環(huán)境變量需要執(zhí)行vcvarsall.batcall C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat x64如果vcvarsall.bat都不存在說明安裝時(shí)C工作負(fù)載根本沒裝上。要么就是你安裝時(shí)用的是簡單的默認(rèn)安裝沒有在--add里指定Microsoft.VisualStudio.Workload.NativeDesktop。只能重新做增量安裝補(bǔ)上。5.4 磁盤空間不足與路徑帶中文名的問題離線包加安裝后的VS總體占用很容易超過30GB。部署前一定先確認(rèn)內(nèi)網(wǎng)機(jī)器的C盤和布局目錄所在盤剩余空間充足。另外盡量把布局目錄放在純英文路徑下。我踩過這樣的坑某臺機(jī)器用戶名是中文導(dǎo)致臨時(shí)目錄路徑里帶中文VS安裝器在解析部分組件時(shí)直接報(bào)錯無響應(yīng)。如果你只有中文用戶名可以考慮用set TEMPC:\Temp這種方式把臨時(shí)目錄切到純英文路徑再跑安裝命令。5.5 裝完VS后發(fā)現(xiàn)某些組件是壞的怎么辦內(nèi)網(wǎng)環(huán)境下沒辦法用在線修復(fù)功能但可以先把布局目錄中有問題的組件重新下載。實(shí)際操作中我會刪除Packages目錄里對應(yīng)的包文件然后在有網(wǎng)機(jī)器上重新跑一次帶相同--add參數(shù)的--layout命令它會重新拉取缺失文件再把增量同步到內(nèi)網(wǎng)最后在目標(biāo)機(jī)上執(zhí)行修復(fù)安裝vs_community.exe --installPath C:\Program Files (x86)\Microsoft Visual Studio\2019\Community --layout D:\vs2019_offline --repair --quiet--repair參數(shù)也是從本地布局讀取文件執(zhí)行的整個過程不需要互聯(lián)網(wǎng)。這也是離線布局方案的最大價(jià)值一旦擁有永久可用。最后再分享一個我個人的小習(xí)慣每次做離線部署前都會把有網(wǎng)機(jī)器上下載好的整個布局目錄做一份SHA256完整清單可以用get-filehash批量生成拷貝到內(nèi)網(wǎng)后先抽查幾個文件哈希是否一致再開始安裝。另外記得給U盤做個標(biāo)簽寫上生成日期和包含的組件ID防止過了一個月自己都想不起來這個離線包到底能不能裝MFC。這套方法我已經(jīng)在十幾臺內(nèi)網(wǎng)機(jī)器上驗(yàn)證過按順序操作基本不會出現(xiàn)“裝到一半回調(diào)”的糟心事。