[英]How can I install Visual Studio Code extensions offline?
您现在可以直接从市场下载扩展。
从 Visual Studio Code 1.7.1 开始,拖动或打开扩展不再起作用。 为了手动安装它,您需要:
根据文档,可以直接下载扩展:
扩展程序的直接下载 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
。
该版本可以在“更多信息”区域的右侧找到。
要下载它,您需要从上面的模板创建一个链接:
所有包都将具有相同的名称Microsoft.VisualStudio.Services.VSIXPackage ,因此如果您想知道稍后是哪个包,则需要在下载后重命名它。
为了安装扩展
*.vsix
扩展名.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);
所有这些建议都很棒,但遵循起来有点痛苦,因为执行代码来构造 URL 或手动构造那个疯狂的 URL 有点烦人......
所以,我拼凑了一个快速的网络应用程序,让事情变得更容易。 只需粘贴您想要的扩展程序的 URL,您的扩展程序的下载就会正确命名:publisher-extension-version.vsix。
希望有人觉得有帮助: 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)
我想在文件堆上放一个 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"
添加到 t3chb0t 的优秀答案 - 使用这些 PowerShell 命令在文件夹中安装所有 VSCode 扩展:
cd C:\PathToFolderWithManyDownloadedExtensionFiles
Get-ChildItem . -Filter *.vsix | ForEach-Object { code --install-extension $_.FullName }
然后,重新加载 VSCode 以完成安装。
我在我的 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"
}
现在您可以直接在“资源”部分下载扩展程序,有一个“下载扩展程序”链接,希望这些信息仍然有用。
如果您正在寻找脚本化解决方案:
.vsix
文件(见下面的例子)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
更多 FilterTypes"filterType": 7
- FilterType.ExtensionName
更多 FilterTypes"flags": 514
- 0x2 | 0x200
0x2 | 0x200
- Flags.IncludeFiles | Flags.IncludeLatestVersionOnly
Flags.IncludeFiles | Flags.IncludeLatestVersionOnly
- 更多标志
python -c "print(0x2|0x200)"
"assetTypes": ["Microsoft.VisualStudio.Services.VSIXPackage"]
- 仅获取指向.vsix
文件的更多 AssetTypes链接如果您的离线实例上有特定(旧)版本的 VSCode,则拉取最新扩展可能无法正确集成。
为了确保 VSCode 和扩展一起工作,它们必须一起安装在在线机器上。 这解决了任何依赖关系(具有特定版本),并确保离线实例的准确配置。
安装VSCode版本,关闭更新,安装扩展。 从安装位置复制扩展并将它们放在目标机器上。
在在线机器上安装 VSCode 的确切版本。 然后通过转到File -> Preferences -> Settings
关闭更新。 在Settings
窗口中,在User Settings -> Application
,转到Update
部分,并将Channel
的参数更改为none
。 这可以防止 VSCode 连接到 Internet 并将您的版本自动更新到最新版本。
然后转到 VSCode 扩展部分并安装所有所需的扩展。 将已安装的扩展从其安装位置(Windows 为C:\\Users\\<username>\\.vscode\\extensions
) C:\\Users\\<username>\\.vscode\\extensions
到目标机器上的相同位置。
完美运行。
对于 Python 用户,与t3chbot的优秀答案一起使用的模式如下所示:
https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-python/vsextensions/python/{version_number}/vspackage
请务必向右滚动以查看必须输入版本号的位置。
一个小的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
此处提供所有标志值
感谢 m4js7er 和 Adam Haynes 的启发
确实让我感到困惑的是,Marketplace 网页上没有提供直接的 curl 友好 URL 来下载 vscode 扩展! 我需要它来填充 CICD 管道中的容器。
我发现@t3chb0t 和@LetMeSOThat4U 的答案在这里非常有用。 另外,我发现:
实际的包要么命名为 vspackage,要么命名为 Microsoft.VisualStudio.Services.VSIXPackage(还有其他的吗?)。 有一个标签 VsixManifestAssetType 我认为可以用来获取类型:"VsixManifestAssetType":"Microsoft.VisualStudio.Services.VsixManifest"
这些工件是 tar 文件。 所以如果你有下载vspackage,看内容:tar vtf vspackage
现在据说,扩展 jupyter 应该有 .vsix 后缀,但这些包都没有以 .vsix 命名。 所以我认为下载后,必须相应地将包重命名为 .vsix。 使用 jupyter 版本 2021.7.0,我会将 vspackage 重命名为:vsx-jupyter-2021.7.0.vsix
在 Linux/Ubuntu 上:我可以使用以下命令来安装它:$ code-server --install-extensions vsx-jupyter-2021.7.0.vsix。 之后,可以使用:code-server --list-extensions 进行验证。
要获取包 ms-python 的 URL,请遵循 @LetMeSOThat4U 方法:
a. 使用 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 并查看哪个有效。 在这种情况下,它是后者,来自 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 # 会显示文件的内容
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.