如何离线安装Visual Studio Code扩展?


Answers:


202

更新2017-12-13

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

在此处输入图片说明

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

  • 打开扩展侧边栏
  • 单击右上角的省略号
  • 选择从VSIX安装

从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.VisualStudio.Services.VSIXPackage

所有软件包都将具有相同的名称Microsoft.VisualStudio.Services.VSIXPackage,因此,如果您想知道以后是哪个软件包,则需要在下载后重命名。

安装

为了安装扩展

  • 重命名文件并给它*.vsix扩展名
  • 打开Visual Studio Code,转到菜单FileOpen File ...Ctrl+ O并选择.vsix文件
  • 如果一切正常,您应该在窗口顶部看到以下消息:

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


10
我做了一个书签,可以在扩展页面上使用。让我们看看它能工作多久!:javascript:(function() {var ver = document.querySelector("[data-bind='text: version']").innerText; var pub = window.location.href.replace(/.*itemName=(.*?)\.(.*)/,"$1"); var name = window.location.href.replace(/.*itemName=(.*?)\.(.*)/,"$2"); window.location = "https://" + pub + ".gallery.vsassets.io/_apis/public/gallery/publisher/" + pub + "/extension/" + name + "/" + ver + "/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage";})()
TheQuickBrownFox

在VS Code 1.7.1(2016年10月)中,安装步骤不适用于我。
罗伊·迪克特斯

@RoyDictus表示,VSCode显示扩展的链接,而不是安装它:-| 他们一定已经改变了一些东西。
t3chb0t

@RoyDictus查看更新-这应该适合您。我将再次附加屏幕截图。
t3chb0t

2
这个答案有很好的信息。但是,C#是一个不好的例子,特别是因为该问题指出“未连接到互联网且无法连接到互联网的机器”。C#扩展无法按此处所述离线安装,因为它会在激活后尝试下载特定于平台的组件,而必须构建一个特定的离线软件包
Herohtar

19

加上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);

不错,但很多余,因为VSCode现在在其网站上提供了链接
Blowsie '17

1
@Blowsie不一致,在Windows上我看到链接,在Linux上我没有链接
kbolino

15

所有这些建议都很棒,但遵循起来却很痛苦,因为执行代码来构造URL或手动构造疯狂的URL有点烦人...

因此,我整理了一个快速的Web应用程序来简化事情。只需粘贴所需扩展名的URL,就可以下载已经正确命名的扩展名:publisher-extension-version.vsix。

希望有人对它有所帮助:http : //vscode-offline.herokuapp.com/


不错,但很多余,因为VSCode现在在其网站上提供了链接
Blowsie '17

正确。这是他们最近的一项补充。我可能会在不久的将来取消我的服务。
Yaakov Chaikin

@YaakovChaikin链接不会始终显示,但是您的服务将始终如一地工作
kbolino

这很酷。不幸的是,当其他人在GitHub页面而不是Heroku上做类似的事情时,像ChrisF这样的用户删除了他们,说“不要链接到您的GitHub”。当主持人变成恶霸时,这很可悲。
iconoclast

4

从今天开始,最新版本扩展的下载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正则表达式提取dl URL:

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

3

我想将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"

2

添加到t3chb0t的一个很好的答案-使用以下PowerShell命令在文件夹中安装所有VSCode扩展:

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

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


1

现在,您可以直接在“资源”部分中下载扩展,其中有一个“下载扩展”链接,希望此信息仍然有用。


1

我已经将脚本存储在要点中,以便使用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"
}

0

对于Python用户,与t3chbot出色答案结合使用的模式如下:

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

请确保向右滚动以查看必须在何处输入版本号。


0

如果您正在寻找脚本解决方案:

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

对于API,请先看以下示例,并获得有关如何修改请求的提示,网址https://github.com/Microsoft/vscode/blob/master/src/vs/platform/extensionManagement/node/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- 多个标志
    • 获取标志十进制值,您可以运行 python -c "print(0x2|0x200)"
  • "assetTypes": ["Microsoft.VisualStudio.Services.VSIXPackage"]-仅获取链接以.vsix提交更多AssetTypes

0

如果您的脱机实例上具有特定的(旧版)VSCode版本,则无法正确集成最新的扩展。

为确保VSCode和扩展一起使用,必须将它们全部一起安装在在线计算机上。这样可以解决所有依赖关系(具有特定版本),并确保脱机实例的准确配置。

快速步骤:

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

详细步骤:

在联机计算机上安装VSCode的确切版本。然后转到来关闭更新File -> Preferences -> Settings。在Settings窗下User Settings -> Application,去Update节,并更改参数Channelnone。这样可以防止VSCode接触到Internet并自动将您的版本更新为最新版本。

然后转到VSCode扩展部分,并安装所有需要的扩展。将已安装的扩展程序从其安装位置(带有Windows C:\Users\<username>\.vscode\extensions)复制到目标计算机上的相同位置。

完美运作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.