【问题标题】:How can I install Visual Studio Code extensions offline?如何离线安装 Visual Studio Code 扩展?
【发布时间】:2016-09-01 11:14:47
【问题描述】:

我在一台没有也不能连接到 Internet 的计算机上安装了 Visual Studio Code。 According to the documentation,如果我有.vsix,我可以从命令行安装扩展,但我不知道如何从市场上获取.vsix

如何下​​载.vsix 以获取托管在the marketplace 上的扩展程序?

【问题讨论】:

标签: visual-studio-code


【解决方案1】:

确实让我感到困惑的是,市场网页上没有提供直接的 curl 友好 URL 来下载 vscode 扩展!我需要它来填充 CICD 管道中的容器。

我发现@t3chb0t 和@LetMeSOThat4U 的答案在这里非常有用。另外,我发现:

  1. 实际的包名为 vspackage 或名为 Microsoft.VisualStudio.Services.VSIXPackage(还有其他吗?)。有一个标签 VsixManifestAssetType 我认为可以用来获取类型:“VsixManifestAssetType”:“Microsoft.VisualStudio.Services.VsixManifest”

  2. 这些工件是 tar 文件。所以如果你有下载vspackage,查看内容:tar vtf vspackage

  3. 现在,据推测,扩展 jupyter 应该具有 .vsix 后缀,但这些包都没有以 .vsix 命名。所以我认为下载后,必须相应地将包重命名为 .vsix 。对于 jupyter 版本 2021.7.0,我会将 vspackage 重命名为:vsx-jupyter-2021.7.0.vsix

  4. 在 Linux/Ubuntu 上:我可以使用以下命令来安装它:$ code-server --install-extensions vsx-jupyter-2021.7.0.vsix。之后,可以使用:code-server --list-extensions 来验证。

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

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

b.右击鼠标选择查看页面源并搜索字符串:“AssetUri”:你会看到 "AssetUri":"https://ms-python.gallerycdn.vsassets.io/extensions/ms-python/python/2021.6.944021595/1623882641726"

c。现在尝试附加 vspackage 或 Microsoft.VisualStudio.Services.VSIXPackage 并查看哪个有效。在这种情况下,它是后者,来自 VsixManifestAssetType。所以使用 curl 的实际 CLI: $ curl -o vsx-ms-python-2021.6.vsix --insecure https://ms-python.gallerycdn.vsassets.io/extensions/ms-python/python/2021.6.944021595/1623882641726/Microsoft.VisualStudio.Services.VSIXPackage

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

【讨论】:

    【解决方案2】:

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

    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 more FilterTypes
    • "filterType": 7 - FilterType.ExtensionName more FilterTypes
    • "flags": 514 - 0x2 | 0x200 - Flags.IncludeFiles | Flags.IncludeLatestVersionOnly - more Flags
      • 要获取标志十进制值,您可以运行python -c "print(0x2|0x200)"
    • "assetTypes": ["Microsoft.VisualStudio.Services.VSIXPackage"] - 仅获取到 .vsix 文件 more AssetTypes 的链接

    【讨论】:

      【解决方案3】:

      一个小型的 powershell 来获取 Visual Studio 扩展所需的信息:

      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
      

      所有标志值都可用here

      感谢 m4js7er 和 Adam Haynes 的启发

      【讨论】:

        【解决方案4】:

        我在 Gist 中存储了一个脚本,用于使用 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"
        }
        

        【讨论】:

        • url结构变了,现在是"https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${Publisher}/vsextensions/${ExtensionName}/${Version}/vspackage"
        【解决方案5】:

        2017 年 12 月 13 日更新

        您现在可以直接从marketplace 下载扩展。

        从 Visual Studio Code 1.7.1 开始,拖动或打开扩展不再起作用。要手动安装,您需要:

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


        旧方法

        根据the documentation可以直接下载扩展:

        扩展程序的直接下载 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.csharp

        这里发布者是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 文件
        • 如果一切正常,您应该会在窗口顶部看到以下消息:

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

        【讨论】:

        • 我制作了一个小书签以在扩展页面上使用。让我们看看它还能工作多久!: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";})()
        • 安装步骤对我不起作用,在 VS Code 1.7.1(2016 年 10 月)中。
        • @RoyDictus ideed,VSCode 显示扩展的链接而不是安装它:-|他们一定改变了什么。
        • @RoyDictus 查看更新 - 这应该适合您。下次我会附上截图。
        • 这个答案有很好的信息;然而,C# 是一个不好的例子,特别是因为问题指出“一台没有也不能连接到互联网的机器”。 C# 扩展无法按照此处所述脱机安装,因为它会在激活后尝试下载特定于平台的组件,而不是 a specific offline package must be built
        【解决方案6】:

        如果您的离线实例上有特定(旧)版本的 VSCode,则拉取最新的扩展可能无法正确集成。

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

        快速步骤:

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

        详细步骤:

        在在线机器上安装正确版本的 VSCode。然后转到File -> Preferences -> Settings 关闭更新。在Settings 窗口的User Settings -> Application 下,转到Update 部分,并将@​​987654325@ 的参数更改为none。这可以防止 VSCode 连接到 Internet 并将您的版本自动更新到最新版本。

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

        完美运行。

        【讨论】:

          【解决方案7】:

          对于 Python 用户,与 t3chbot 的出色答案一起使用的模式如下所示:

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

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

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

                截至今天,最新版扩展程序的下载 URL 已逐字嵌入 Marketplace 页面的源代码中,例如来源网址:

                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)
                

                【讨论】:

                  【解决方案11】:

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

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

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

                  【讨论】:

                  • 很好但多余,因为 VSCode 现在在他们的网站上提供链接
                  • 正确。这是他们最近的一个补充。我可能会在不久的将来停止我的服务。
                  • @YaakovChaikin 链接并不总是显示,但您的服务始终有效
                  • 这很酷。不幸的是,当其他人在 GitHub 页面而不是 Heroku 上做类似的事情时,像 ChrisF 这样的用户删除了他们说“不要链接到你的 GitHub”。当版主变成恶霸时,这很可悲。
                  【解决方案12】:

                  我想添加一个 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"
                  

                  【讨论】:

                    【解决方案13】:

                    添加到 t3chb0t 的答案,不知道为什么下载选项不可见,所以为使用 GreaseMonkey/ TamperMonkey 的人创建了一个补丁:您可以找到 gist 代码here

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

                    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 不一致,在 Windows 上我看到链接,在 Linux 上我没有
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-11-16
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-06-16
                    • 1970-01-01
                    • 2019-03-20
                    • 1970-01-01
                    相关资源
                    最近更新 更多