You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS Code扩展用latest与具体版本下载的SHA256哈希不一致问询

VS Code Marketplace使用latest与明确版本号下载扩展的SHA256校验和不一致问题

问题描述

当从VS Code Marketplace下载扩展归档时,使用latest作为版本号获取的文件SHA256校验和,与使用明确的最新版本号下载得到的校验和不一致。以ms-toolsai.jupyter扩展为例,在nix repl中的测试结果如下:

nix-repl> builtins.fetchurl { url = "https://ms-toolsai.gallery.vsassets.io/_apis/public/gallery/publisher/ms-toolsai/extension/jupyter/latest/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage"; sha256 = ""; }  
warning: found empty hash, assuming 'sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='
error: hash mismatch in file downloaded from 'https://ms-toolsai.gallery.vsassets.io/_apis/public/gallery/publisher/ms-toolsai/extension/jupyter/latest/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage':
         specified: sha256:0000000000000000000000000000000000000000000000000000
         got:       sha256:0wimki8s5vygbmz0l60r1vbqz5b6wj9c5wd6aippz8wy3rl4c1pf

nix-repl> builtins.fetchurl { url = "https://ms-toolsai.gallery.vsassets.io/_apis/public/gallery/publisher/ms-toolsai/extension/jupyter/2023.5.1001411100/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage"; sha256 = ""; }
warning: found empty hash, assuming 'sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='
error: hash mismatch in file downloaded from 'https://ms-toolsai.gallery.vsassets.io/_apis/public/gallery/publisher/ms-toolsai/extension/jupyter/2023.5.1001411100/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage':
         specified: sha256:0000000000000000000000000000000000000000000000000000
         got:       sha256:0zr607q8w1gfrmbgdldikswg8gw6g5vgs1fsvvvpbpgd7hsg2c4m

该现象在多个扩展中出现,但并非所有扩展都会发生。

背景

在NixOS环境下,我通过API使用latest标签抓取常用扩展的最新版本,并用自定义bash脚本从归档中提取版本号,构建含明确版本号的扩展列表供NixOS使用,将扩展安装到不可变的VS Code扩展目录中。目前的解决方案是下载两次扩展:一次用latest版本获取实际版本号,再用明确版本号下载以得到正确的SHA256哈希值。

疑问与解答

1. 这是API的Bug还是预期行为?

这是预期行为,并非API Bug。

2. 若为预期行为,原因是什么?是否存在安全或其他层面的考量?

主要原因来自两方面:

  • CDN缓存与分发延迟:当扩展作者发布新版本后,latest标签会立即更新,但全球CDN节点需要时间同步新的VSIX包。此时用latest下载可能从尚未同步的节点拿到旧版本包,而明确版本号的URL会直接指向对应版本的固定存储位置,导致两者哈希不一致。
  • 预发布版本优先级:部分扩展作者会开启预发布版本,latest标签可能优先指向预发布版本,而你使用的明确版本号可能是公开稳定版,两者本身就是不同的包,自然哈希不同。

安全与可靠性层面的考量:latest的设计是为了快速获取当前最新可用版本,但受限于CDN缓存,无法保证绝对的确定性;而明确版本号的URL指向不可变的资源,适合Nix这种需要完全可复现环境的场景,避免因缓存或版本切换导致的不一致。

3. 是否有无需先下载扩展即可获取最新版本的更优方法?

有,直接调用VS Code Marketplace的官方API查询扩展的最新版本号,无需下载扩展包:

  • 构造查询请求,向扩展查询API发送POST请求,请求体包含扩展的发布者和名称信息,例如查询ms-toolsai.jupyter的请求体可以是:
    {
      "filters": [
        {
          "criteria": [
            { "filterType": 7, "value": "ms-toolsai.jupyter" }
          ],
          "pageSize": 1,
          "pageNumber": 1
        }
      ],
      "flags": 914
    }
    
  • 解析返回的JSON数据,从results[0].extensions[0].version字段中提取最新版本号,再用该版本号构造下载URL,即可一次下载得到对应版本的包并获取正确的SHA256哈希值。

内容的提问来源于stack exchange,提问作者chronicc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:12:50