愈來愈多軟體採用隨選下載安裝,安裝程式只包含主程式,其他需要的模組、套件會等用到時再從 Internet 下載自動安裝,如此使用者不需要下載好幾 GB 的安裝程式,裡面包含一堆這輩子都不會用到內容,用多少下載多少,能節省可觀的頻寬與時間,說來聰明又環保。

VSCode 也依循這樣的設定哲學,剛安裝好時不包含任何 Extension (擴充套件),但除了手動尋找安裝,VSCode 還能識別副檔名建議下載 Extension。像是第一次編輯 .ps1 檔案便會出現以下提示:

不過,這種方便設計一旦遇到不能連上 Internet 的環境就要吃癟了。

所幸,除了直接下載安裝,VSCode Extension 也支援以 .vsix 檔形式安裝,Marketplace 網頁都有下載連結,方便預先下載再部署到目的主機安裝。

.vsix 可透過操作介面安裝:

或直接跑指令:

code --install-extension  <extension-vsix-path>

基本上,這樣就能做到離線安裝了。

且慢,所以我得列出 Extension 清單,瀏覽網站找到 Extension 一個個找到 Download 連結下載存成 .vsix 檔案?那不如一刀給我個痛快。

Yes,自動下載 VSCode 已安裝 Extension 的 PowerShell 腳本來惹!

# 列出已安裝 VSCode Extension 清單
$list = code --list-extensions

[System.IO.Directory]::CreateDirectory("$(Get-Location)\vsix") | Out-Null
# 下載  VSCode Extension .vsix
function DownloadVsix([string]$extName) {
    $reqBody = @"
    {
        "filters": [
            {
                "criteria": [
                    {
                        "filterType": 8,
                        "value": "Microsoft.VisualStudio.Code"
                    },
                    {
                        "filterType": 10,
                        "value": "$extName"
                    },
                    {
                        "filterType": 12,
                        "value": "4096"
                    }
                ],
                "pageNumber": 1,
                "pageSize": 50,
                "sortBy": 0,
                "sortOrder": 0
            }
        ],
        "assetTypes": [],
        "flags": 950
    }
"@
    $res = (Invoke-WebRequest -Uri https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery -Method POST -ContentType 'application/json' -Body $reqBody).Content | ConvertFrom-Json
    ($res.results.extensions.versions | Where-Object { !$_.targetPlatform -or $_.targetPlatform -eq 'win32-x64' }).files | 
        Where-Object { $_.assetType -eq 'Microsoft.VisualStudio.Services.VSIXPackage' }  | 
        Select-Object -ExpandProperty source -First 1 | ForEach-Object {
            Write-Host "Downloading $extName"
            Invoke-WebRequest -Uri $_ -OutFile "vsix\$extName.vsix"
        }
}
$list | ForEach-Object { DownloadVsix $_ }

以上腳本先用 code --list-extensions 列出 VSCode 已安裝的 Extension 清單,再呼叫 _apis/public/gallery/extensionquery WebAPI 查詢該 Extension 的 .vsix 下載網址(註:有些 Extension 會區分版號跟平台,我寫了一段簡單邏輯找出 win32-x64 的最新版本,這段沒有完整測試過,打算遇到問題再修),再透過 Invoke-WebRequest 下載,一氣喝成。

就醬,我們就能泡杯茶翹腳等 PowerShell 把用到的 Extension 一次下載回來,敲開勳。

Tips of how to install VSCode extension offline and writing a PowerShell script to downlad all .vsix files of installed extensions.


Comments

# by Joe

有些extension安裝好之後會在啟動的時候去網路上下載他特有的檔案,像是omnisharp ,只下載vsix 檔案是不夠的,大大有什麼好的做法嗎?

# by Jeffrey

to Joe, 謝謝分享,學到額外經驗。我離線安裝 VSCode 主要用來寫 PowerShell,倒沒注意到 omnisharp 有此特性,Stackoverflow 有網友分享額外複製資料夾的做法,可以參考看看 https://stackoverflow.com/a/52159656/288936

Post a comment