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
相关产品推荐
相关产品推荐

