如何脱机安装 VisualStudio 代码扩展插件?

我已经将 VisualStudio 代码安装在一台没有连接到 Internet 的机器上,也不能连接到 Internet。如果我有 .vsix,我可以从命令行安装一个扩展,但是我不知道如何从市场上获得 .vsix

如何下载 市场上的扩展的 .vsix

174345 次浏览

更新日期2017-12-13

现在可以直接从 市场下载扩展。

Enter image description here

从 Visual Studio Code 1.7.1开始,拖动或打开扩展不再有效。为了手动安装,你需要:

  • 打开扩展工具条
  • 点击右上角的省略号
  • 选择 从 VSIX 安装

Install from VSIX...


老方法

根据 文件,可以直接下载一个扩展:

扩展程序的直接下载 URL 如下:

https://${publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${publisher}/extension/${extension name}/${version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage

这意味着,为了下载扩展,您需要知道

  • 出版商的名字
  • 版本
  • 分机名

您可以在 URL 中找到所有这些信息。

例子

下面是下载安装 C # v1.3.0扩展的示例:

出版商,扩展和版本

你可以在扩展主页的 URL 中找到发布者和扩展名:

Https://marketplace.visualstudio.com/items?itemname= MS-VScode

这里的发布者是 ms-vscode,扩展名是 csharp

版本可以在 更多信息区域的右侧找到。

要下载它,你需要从上面的模板中创建一个链接:

Https://ms-vscode.gallery.vsassets.io/_apis/public/gallery/publisher/ms-vscode/extension/csharp/1.3.0/assetbyname/microsoft 视觉工作室服务 VSIXPackage

所有的软件包都有相同的名字 Microsoft.VisualStudio.Services.VSIXPackage,所以如果你想知道之后是什么软件包,你需要在下载之后重命名它。

安装

为了安装扩展

  • 重命名该文件,并将其改为 *.vsix扩展名
  • 打开 Visual Studio Code,转到菜单 档案 & rarr; 打开文件..。Ctrl + 并选择 .vsix文件
  • 如果一切正常,您应该会在窗口顶部看到以下消息:

扩展已成功安装。请重新启动以启用它。

添加到 t3chb0t 的答案中,不确定为什么下载选项不可见,所以为那些使用 GreaseMonkey/TamperMonkey 的用户创建了一个补丁: 你可以找到主要代码 给你

或者你可以在浏览器控制台中粘贴下面的行,链接就会神奇地出现:

let version = document.querySelector('.ux-table-metadata > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2) > div:nth-child(1)').innerText
, itemDetails = window.location.search.replace('?', '').split('&').filter(str => !str.indexOf('itemName')).map(str => str.split('=')[1])[0]
, [author, extension] = itemDetails.split('.')
, lAuthor = author.toLowerCase()
, href = `https://${lAuthor}.gallery.vsassets.io:443/_apis/public/gallery/publisher/${author}/extension/${extension}/${version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage`
, element = document.createElement('a');




element.href = href;
element.className = 'vscode-moreinformation dark';
element.innerHTML = 'download .vsix file';
element.download  = `${extension}.${version}.vsix`;
document.querySelector('.vscode-install-info-container').appendChild(element);

我想在这堆文件中添加一个 PowerShell 下载选项,以防其他人遇到这个问题。我有几个脱机场景,我运行这个循环下载和更新所有的扩展,我使用脱机。

$page = Invoke-WebRequest -Uri 'https://marketplace.visualstudio.com/items?itemName=ms-vscode.PowerShell'


$details = ( $page.Scripts | ? {$_.class -eq 'vss-extension'}).innerHTML | Convertfrom-Json


$extensionName = $details.extensionName
$publisher     = $details.publisher.publisherName
$version       = $details.versions.version


Invoke-WebRequest -uri "$($details.versions.fallbackAssetUri)/Microsoft.VisualStudio.Services.VSIXPackage" `
-OutFile "C:\Scripts\extensions\$publisher.$extensionName.$version.VSIX"

所有这些建议都很棒,但是跟随它们有点痛苦,因为执行代码来构造 URL 或者手工构造那个疯狂的 URL 有点烦人... ..。

所以,我做了一个快速的网络应用程序,让事情变得更简单。只需粘贴您想要的扩展的 URL,就可以下载您已经正确命名的扩展了: Publisher-extension-version。V6.

希望有人能从中受益: Http://vscode-offline.herokuapp.com/

从今天开始,最新的版本扩展的下载 URL 将逐字嵌入到 Marketplace 页面的源代码中,例如,URL 的源代码:

https://marketplace.visualstudio.com/items?itemName=lukasz-wronski.ftp-sync

包含字符串:

https://lukasz-wronski.gallerycdn.vsassets.io/extensions/lukasz-wronski/ftp-sync/0.3.3/1492669004156/Microsoft.VisualStudio.Services.VSIXPackage

我使用下面的 Python regexp 来提取 dl URL:

urlre = re.search(r'source.+(http.+Microsoft\.VisualStudio\.Services\.VSIXPackage)', content)
if urlre:
return urlre.group(1)

现在您可以直接在“参考资料”部分下载一个扩展,有一个“下载扩展”链接,希望这些信息仍然有用。

添加到 t3chb0t 的出色答案-使用这些 PowerShell 命令在一个文件夹中安装所有 VSCode 扩展:

cd C:\PathToFolderWithManyDownloadedExtensionFiles
Get-ChildItem . -Filter *.vsix | ForEach-Object { code --install-extension $_.FullName }

然后,重新加载 VSCode 以完成安装。

对于 Python 用户来说,与 T3chbot的优秀答案一起使用的模式如下:

https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-python/vsextensions/python/{version_number}/vspackage

一定要向右滚动,看看要在哪里输入版本号。

如果您正在寻找一个脚本化的解决方案:

  1. 获取二进制下载 URL: 您可以使用一个 API,但要注意,没有相关的文档。这个 API 可以返回一个 URL 来下载 .vsix文件(参见下面的示例)
  2. 下载二进制文件
  3. 小心地将二进制文件 unzip转换为 ~/.vscode/extensions/: 您需要修改解压缩的目录名,删除一个文件并移动/重命名另一个文件。

对于 API,首先看下面的例子,以及如何将请求头修改为 https://github.com/Microsoft/vscode/blob/master/src/vs/platform/extensionManagement/common/extensionGalleryService.ts的提示。

POST https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery?api-version=5.1-preview HTTP/1.1
content-type: application/json


{
"filters": [
{
"criteria": [
{
"filterType": 8,
"value": "Microsoft.VisualStudio.Code",
},
{
"filterType": 7,
"value": "ms-python.python",
}
],
"pageNumber": 1,
"pageSize": 10,
"sortBy": 0,
"sortOrder": 0,
}
],
"assetTypes": ["Microsoft.VisualStudio.Services.VSIXPackage"],
"flags": 514,
}

对上述例子的解释:

  • "filterType": 8-FilterType.Target 更多过滤类型
  • "filterType": 7-FilterType.ExtensionName 更多过滤类型
  • "flags": 514-0x2 | 0x200-Flags.IncludeFiles | Flags.IncludeLatestVersionOnly -< a href = “ https://github.com/microsoft/vscode/blob/b43174e1b275850f5b80d170e47c1c04eb780790/src/vs/platsionManagement/node/extsionGalleryService.ts # L75-L88”rel = “ nofollow noReferrer”> more Flags
    • 要获得标记的十进制值,可以运行 python -c "print(0x2|0x200)"
  • 获取到 .vsix文件 更多资产类型的链接

如果您的脱机实例上有特定(遗留)版本的 VSCode,那么提取最新的扩展可能无法正确集成。

为了确保 VSCode 和扩展一起工作,必须将它们全部安装在联机机器上。这将解析任何依赖项(具有特定版本) ,并确保离线实例的确切配置。

快速步骤:

安装 VSCode 版本,关闭更新,并安装扩展。从安装的位置复制扩展并将它们放在目标计算机上。

详细步骤:

在联机机器上安装 VSCode 的精确版本。然后转到 File -> Preferences -> Settings关闭更新。在 Settings窗口中,在 User Settings -> Application下,转到 Update部分,并将 Channel的参数更改为 none或 Untick Update,如下所示。这样可以防止 VSCode 连接到互联网并自动更新到最新版本。

enter image description here

然后转到 VSCode 扩展部分并安装所有需要的扩展。将已安装的扩展插件从它们的安装位置(窗口为 C:\Users\<username>\.vscode\extensions)复制到目标计算机上的相同位置。

效果很好。

我在要点中存储了一个脚本,用于使用 PowerShell 脚本从市场下载一个扩展。 欢迎评论分享。

Https://gist.github.com/azurekid/ca641c47981cf8074aeaf6218bb9eb58

[CmdletBinding()]
param
(
[Parameter(Mandatory = $true)]
[string] $Publisher,


[Parameter(Mandatory = $true)]
[string] $ExtensionName,


[Parameter(Mandatory = $true)]
[ValidateScript( {
If ($_ -match "^([0-9].[0-9].[0-9])") {
$True
}
else {
Throw "$_ is not a valid version number. Version can only contain digits"
}
})]
[string] $Version,


[Parameter(Mandatory = $true)]
[string] $OutputLocation
)


Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"


Write-Output "Publisher:        $($Publisher)"
Write-Output "Extension name:   $($ExtensionName)"
Write-Output "Version:          $($Version)"
Write-Output "Output location   $($OutputLocation)"


$baseUrl = "https://$($Publisher).gallery.vsassets.io/_apis/public/gallery/publisher/$($Publisher)/extension/$($ExtensionName)/$($Version)/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage"
$outputFile = "$($Publisher)-$($ExtensionName)-$($Version).visx"


if (Test-Path $OutputLocation) {
try {
Write-Output "Retrieving extension..."
[uri]::EscapeUriString($baseUrl) | Out-Null
Invoke-WebRequest -Uri $baseUrl -OutFile "$OutputLocation\$outputFile"
}
catch {
Write-Error "Unable to find the extension in the marketplace"
}
}
else {
Write-Output "The Path $($OutputLocation) does not exist"
}

一个小的 Powershell,以获得视觉工作室扩展所需的信息:

function Get-VSMarketPlaceExtension {
[CmdLetBinding()]
Param(
[Parameter(ValueFromPipeline = $true,Mandatory = $true)]
[string[]]
$extensionName
)
begin {
$body=@{
filters = ,@{
criteria =,@{
filterType=7
value = $null
}
}
flags = 1712
}
}
process {
foreach($Extension in $extensionName) {
$response =  try {
$body.filters[0].criteria[0].value = $Extension
$Query =  $body|ConvertTo-JSON -Depth 4
(Invoke-WebRequest -Uri "https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery?api-version=6.0-preview" -ErrorAction Stop -Body $Query -Method Post -ContentType "application/json")
} catch [System.Net.WebException] {
Write-Verbose "An exception was caught: $($_.Exception.Message)"
$_.Exception.Response
}
$statusCodeInt = [int]$response.StatusCode


if ($statusCodeInt -ge 400) {
Write-Warning "Erreur sur l'appel d'API :  $($response.StatusDescription)"
return
}
$ObjResults = ($response.Content | ConvertFrom-Json).results
    

If ($ObjResults.resultMetadata.metadataItems.count -ne 1) {
Write-Warning "l'extension '$Extension' n'a pas été trouvée."
return
}
    

$Extension = $ObjResults.extensions
    

$obj2Download = ($Extension.versions[0].properties | Where-Object key -eq 'Microsoft.VisualStudio.Services.Payload.FileName').value
[PSCustomObject]@{
displayName = $Extension.displayName
extensionId = $Extension.extensionId
deploymentType = ($obj2Download -split '\.')[-1]
version = [version]$Extension.versions[0].version
LastUpdate = [datetime]$Extension.versions[0].lastUpdated
IsValidated = ($Extension.versions[0].flags -eq "validated")
extensionName = $Extension.extensionName
publisher     = $Extension.publisher.publisherName
SourceURL = $Extension.versions[0].assetUri +"/" + $obj2Download
FileName = $obj2Download
}
}
}
}

这使用市场 API 来获取扩展信息。 使用和结果的例子:

>Get-VSMarketPlaceExtension "ProBITools.MicrosoftReportProjectsforVisualStudio"




displayName    : Microsoft Reporting Services Projects
extensionId    : 85e42f76-6afa-4a68-afb5-033d1fe08d7b
deploymentType : vsix
version        : 2.6.7
LastUpdate     : 13/05/2020 22:23:45
IsValidated    : True
extensionName  : MicrosoftReportProjectsforVisualStudio
publisher      : ProBITools
SourceURL      : https://probitools.gallery.vsassets.io/_apis/public/gallery/publisher/ProBITools/extension/MicrosoftReportProjectsforVisualStudio/2.6.7/assetbyname/Microsoft.DataTools.ReportingServices.vsix
FileName       : Microsoft.DataTools.ReportingServices.vsix

所有标志值都可用 给你

感谢 m4js7er 和 Adam Haynes 的启发

实际上,我感到困惑的是,在 Marketplace 网页上没有提供直接的卷曲友好的 URL 来下载 vscode 扩展!我需要它来填充 CICD 管道中的一个容器。

我发现@t3chb0t 和@LetMeSOThat4U 给出的答案非常有用。此外,我还发现:

  1. 实际的包要么命名为 vspackage,要么命名为 Microsoft。VisualStudio.Services.VSIXPackage (还有吗?).有一个标签 Vsix ManifestAssetType 我认为可以用来获得类型: “ Vsix ManifestAssetType”: “ Microsoft。VisualStudio.服务。V6货单

  2. 这些构件是 tar 文件

  3. 现在,据推测,一个延长木星应该有。Vsix 后缀,但是这些包都没有使用。V6.所以我认为在下载之后,必须将包重命名为。相应的 V6。使用 jupyter version 2021.7.0,我将把 vspackage 重命名为: vsx-jupyter-2021.7.0。V6

  4. 在 Linux/Ubuntu 上: 我可以使用下面的命令来安装它: $code-server —— install-extons vsx-jupyter-2021.7.0。V6.然后,可以使用: code-server —— list- 更改。

  5. 要获取包 ms-python 的 URL,请按照@LetMeSOThat4U 方法:

使用 Chrome 浏览器或 curl/wget 获取页面 https://marketplace.visualstudio.com/items?itemName=ms-python.python

右键单击鼠标选择查看页面源代码并搜索字符串: “ AssetUri”: 您将看到 “ AssetUri”: “ https://ms-python.gallerycdn.vsassets.io/extensions/ms-python/python/2021.6.944021595/1623882641726" ;

C.现在尝试附加 vspackage 或 Microsoft。VisualStudio.Services.VSIXPackage,看看哪个能用。在这种情况下,它是后者,来自 Vsix ManifestAssetType。所以实际的 CLI 使用 curl: $curl-o vsx-ms-python-2021.6. vsix —— security Https://ms-python.gallerycdn.vsassets.io/extensions/ms-python/python/2021.6.944021595/1623882641726/microsoft 视觉工作室服务 VSIXPackage

$tar vtf vsx-ms-python-2021.6. vsix # 将显示文件的内容

从版本历史选项卡扩展可以下载

enter image description here