Como posso instalar extensões de código do Visual Studio offline?


130

Instalei o Visual Studio Code em uma máquina que não está e não pode estar conectada à Internet. De acordo com a documentação , posso instalar uma extensão a partir da linha de comando, se tiver .vsix, mas não sei como obtê .vsix-lo no mercado.

Como posso fazer o download .vsixde uma extensão hospedada no mercado ?


Respostas:


202

UPDATE 2017-12-13

Agora você pode baixar a extensão diretamente do mercado .

Digite a descrição da imagem aqui

A partir do Visual Studio Code 1.7.1, arrastar ou abrir a extensão não funciona mais. Para instalá-lo manualmente, você precisa:

  • abra a barra lateral das extensões
  • clique nas reticências no canto superior direito
  • escolha Instalar do VSIX

Instalar a partir do VSIX ...


Método antigo

De acordo com a documentação , é possível baixar uma extensão diretamente:

O URL de download direto de uma extensão está no formato:

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

Isso significa que, para baixar a extensão, você precisa saber

  • o nome do editor
  • a versão
  • o nome da extensão

Você pode encontrar todas essas informações no URL.

Exemplo

Aqui está um exemplo para baixar uma instalação do C # v1.3.0 extensão :

Editor, extensão e versão

Você pode encontrar o editor e os nomes da extensão na página inicial da extensão em seu URL:

https://marketplace.visualstudio.com/items?itemName= ms-vscode . csharp

Aqui está o editor ms-vscodee o nome da extensão csharp.

A versão pode ser encontrada no lado direito na área Mais informações .

Para fazer o download, você precisa criar um link a partir do modelo acima:

https://ms-vscode.gallery.vsassets.io/_apis/public/gallery/publisher/ms-vscode/extension/csharp/1.3.0/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage

Todos os pacotes terão o mesmo nome Microsoft.VisualStudio.Services.VSIXPackage , portanto, você precisará renomeá-lo após o download, se quiser saber qual pacote foi posteriormente.

Instalação

Para instalar a extensão

  • Renomeie o arquivo e dê a *.vsixextensão
  • Abra o Código do Visual Studio, vá para o menu ArquivoAbrir arquivo ... ou Ctrl+ Oe selecione o .vsixarquivo
  • Se tudo correu bem, você deverá ver esta mensagem na parte superior da janela:

A extensão foi instalada com sucesso. Reinicie para habilitá-lo.


10
Eu criei um bookmarklet para usar na página de extensão. Vamos ver quanto tempo ele permanece trabalhando !: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

A etapa de instalação não funcionou para mim, no VS Code 1.7.1 (outubro de 2016).
Roy Dictus

@RoyDictus ideed, VSCode mostra o link para as extensões em vez de instalá-lo: - | eles devem ter mudado alguma coisa.
t3chb0t

@RoyDictus veja a atualização - isso deve funcionar para você. Vou anexar capturas de tela outra hora.
t3chb0t

2
Esta resposta tem boas informações; no entanto, o C # é um mau exemplo, especialmente porque a pergunta declara "uma máquina que não está e não pode estar conectada à Internet" . A extensão C # não pode ser instalada offline, conforme descrito aqui, porque tenta baixar componentes específicos da plataforma após a ativação e, em vez disso, um pacote offline específico deve ser criado .
Herohtar 5/02/19

19

adicionando à resposta do t3chb0t, sem saber por que a opção de download não é visível, criou um patch para quem usa o GreaseMonkey / TamperMonkey: você pode encontrar o código Gist aqui

Ou você pode simplesmente colar as linhas abaixo no console do navegador e o link aparecerá magicamente:

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

Bom, mas redundante como VSCode agora fornecer o link em seu site
Blowsie

1
@Blowsie não de forma consistente, no Windows eu vejo o link, no Linux eu não faço
kbolino

15

Todas essas sugestões são ótimas, mas meio dolorosas de se seguir, porque executar o código para construir a URL ou construir manualmente essa URL maluca é meio irritante ...

Então, juntei um aplicativo da web rápido para facilitar as coisas. Basta colar o URL da extensão desejada e sair o download da sua extensão já devidamente nomeada: publisher-extension-version.vsix.

Espero que alguém ache útil: http://vscode-offline.herokuapp.com/


Bom, mas redundante como VSCode agora fornecer o link em seu site
Blowsie

Corrigir. Essa é uma adição muito recente da parte deles. Provavelmente, retirarei meu serviço no futuro próximo.
Yaakov Chaikin

@YaakovChaikin o link nem sempre aparecem, mas o seu serviço funciona de forma consistente
kbolino

Isso é legal. Infelizmente, quando outros fizeram coisas semelhantes nas páginas do GitHub em vez do Heroku, usuários como ChrisF os excluíram dizendo "não vinculam ao seu GitHub". É triste quando os moderadores se tornam agressores.
Iconoclast

4

Atualmente, o URL de download da versão mais recente da extensão é incorporado literalmente na origem da página no Marketplace, por exemplo, na URL:

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

contém string:

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

Eu uso o seguinte regexp Python para extrair URL dl:

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

3

Eu queria lançar uma opção de download do PowerShell na pilha, caso alguém se deparasse com isso. Eu tenho vários cenários offline e executo isso em um loop para baixar e atualizar todas as extensões que uso offline.

$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

Adicionando à excelente resposta do t3chb0t - Use estes comandos do PowerShell para instalar todas as extensões do VSCode em uma pasta:

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

Em seguida, recarregue o VSCode para concluir a instalação.


1

Agora você pode baixar uma extensão diretamente na seção "Recursos", há um link "Baixar extensão". Espero que essas informações ainda sejam úteis.


1

Eu armazenei um script na minha essência para baixar uma extensão do mercado usando um script do PowerShell. Sinta-se livre para comentar sobre compartilhá-lo.

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

Para usuários do Python, o padrão a ser usado com a excelente resposta do t3chbot é semelhante a:

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

certifique-se de rolar para a direita para ver onde você deve inserir o número da versão.


0

Se você está procurando uma solução com script:

  1. Obter URL de download binário: você pode usar uma API, mas saiba que não há documentação para isso. Esta API pode retornar um URL para fazer o download.vsix arquivos (veja o exemplo abaixo)
  2. Faça o download do binário
  3. Cuidadosamente, unzipo binário entra em ~/.vscode/extensions/: você precisa modificar o nome do diretório descompactado, remover um arquivo e mover / renomear outro.

Para começar a API, observe o exemplo a seguir e para obter dicas sobre como modificar a solicitação, acesse 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,
}

Explicações para o exemplo acima:

  • "filterType": 8- FilterType.Target mais FilterTypes
  • "filterType": 7- FilterType.ExtensionName mais FilterTypes
  • "flags": 514- 0x2 | 0x200- Flags.IncludeFiles | Flags.IncludeLatestVersionOnly- mais Bandeiras
    • para obter o valor decimal da bandeira, você pode executar python -c "print(0x2|0x200)"
  • "assetTypes": ["Microsoft.VisualStudio.Services.VSIXPackage"]- para obter apenas um link para .vsixarquivar mais AssetTypes

0

Se você possui uma versão (herdada) específica do VSCode na sua instância offline, as extensões mais recentes podem não se integrar adequadamente.

Para garantir que o VSCode e as extensões funcionem juntos, todos eles devem ser instalados juntos na máquina online. Isso resolve quaisquer dependências (com versões específicas) e garante a configuração exata da instância offline.

Etapas rápidas:

Instale a versão do VSCode, desative a atualização e instale as extensões. Copie as extensões do local instalado e coloque-as na máquina de destino.

Etapas detalhadas:

Instale a versão exata do VSCode na máquina online. Em seguida, desative as atualizações acessando File -> Preferences -> Settings. Na Settingsjanela, em User Settings -> Application, vá para a Updateseção e altere o parâmetro para Channelpara none. Isso impede que o VSCode acesse a Internet e atualize automaticamente suas versões para as mais recentes.

Em seguida, vá para a seção Extensões do VSCode e instale todas as extensões desejadas. Copie as extensões instaladas do local de instalação (com o Windows C:\Users\<username>\.vscode\extensions) para o mesmo local na máquina de destino.

Funciona perfeitamente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.