ARTICLE · 1194411
Scoop下载太慢?手把手教你手动放对缓存文件

哈喽大家好👋 我是程序🦍kk。把复杂知识掰成大白话讲明白,是我一直以来的小追求✨;打好基础才能稳步进阶,是我始终秉持的学习理念~
📢 我搭建了5000人程序猿专属学习交流群,群内会同步前端开发/全栈开发/Web3开发/远程工作等干货资源z,关注我并回复 加群 ,就能加入交流圈啦🚀
前言
用 Scoop 的朋友多少都遇到过:明明 scoop install 一条命令的事,可下载偏偏卡在网速上,半天不动。于是就想自己动手——先把安装包下载好,扔进 Scoop 的缓存目录,让安装秒过。可真操作起来,会发现一个很气人的问题:从 manifest 里的下载链接手动下载下来的文件名,跟 Scoop 实际要用的缓存文件名对不上,缓存根本击不中,Scoop 还是吭哧吭哧重新下载。
这篇文章就把这个“对不上”的根源一次讲透,并附上可直接照抄的完整步骤。
1. 先看现象:缓存文件名长什么样
在默认安装下,缓存文件在 ~/scoop/cache/ 目录里。这里补一句:Scoop 的安装路径是可选的,~/scoop 只是“默认装到用户目录”时的路径,也可以通过 $env:SCOOP 环境变量指到别的目录,缓存目录会跟着安装目录一起走。缓存文件长这样:
clash-verge-rev#2.4.2#1271c54.7z
拆开看是三段:
第一段 clash-verge-rev:软件名(app)第二段 2.4.2:版本号(version)第三段 1271c54:一截 7 位的短哈希(大多数人就栽在这)后缀 .7z:后面会讲,它其实只是个“统一命名格式”
2. 核心结论:第三段哈希不是安装包文件的哈希
很多人(包括一开始的我)都以为 1271c54 是那个安装包 exe 的 SHA256 前 7 位,所以拿着自己文件的哈希去对,怎么都对不上。
真相是:这一截 7 位哈希,是“下载链接 URL 那段文本”本身的 SHA256 前 7 位,跟安装包文件一点关系都没有。
也就是说,同一个软件的同一个版本,只要下载链接换一个镜像,缓存文件名就会完全变掉;而文件本身的哈希变不变,跟它无关。
3. 源码证明:Scoop 到底怎么算缓存文件名(core.ps1)
Scoop 生成缓存文件名的逻辑在 lib/core.ps1 的 cache_path 里,大致是这样:

# cache_path 核心逻辑$urlStream = [System.IO.MemoryStream]::new([System.Text.Encoding]::UTF8.GetBytes($url))$sha = (Get-FileHash -Algorithm SHA256 -InputStream $urlStream).Hash.ToLower().Substring(0, 7)$filePath = "$app#$version#$sha$extension"要点就三步:
4. 真正的坑:URL 必须和 manifest 一字不差(含 #/dl.7z)
光知道“是 URL 的哈希”还不够。很多人算出来还是对不上,最容易被忽略的是——clash-verge-rev 这类软件,manifest 里的 URL 末尾带了一段 #/dl.7z:
https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v2.4.2/Clash.Verge_2.4.2_x64-setup.exe#/dl.7z
而很多人拿的是不带 #/dl.7z 的裸链接去算哈希。字符串不一样,SHA256 完全不同,7 位前缀自然对不上。
所以:算哈希用的 URL,必须和 bucket 里 manifest json 写的完整 URL 完全一致,一个字符都不能差。
5. manifest 的 hash 和缓存文件名的哈希,完全是两码事
6. 手动复用安装包的完整步骤(以 clash-verge-rev 2.5.2 为例)
第 1 步:打开 bucket 里的 clash-verge-rev.json,复制 2.5.2 那条完整、带 #/dl.7z 的 url;
第 2 步:用下面的脚本算出 7 位短哈希(把 $url 换成从 json 里复制的那串):
# 必须和 manifest 内完全一致,包含 #/dl.7z$url = "https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v2.5.2/Clash.Verge_2.5.2_x64-setup.exe#/dl.7z"$bytes = [System.Text.Encoding]::UTF8.GetBytes($url)$ms = [System.IO.MemoryStream]::new($bytes)$fullSha = (Get-FileHash -InputStream $ms -Algorithm SHA256).Hash.ToLower()$shortSha = $fullSha.Substring(0, 7)Write-Host "完整URL SHA256: $fullSha"Write-Host "缓存文件名7位hash: $shortSha"第 3 步:把本地下载好的 exe 重命名成:
clash-verge-rev#2.5.2#算出的7位哈希.7z
(后缀统一用 .7z,它只是命名格式,不要求源文件真是 7z 压缩包)
第 4 步:放回 ~/scoop/cache/;
第 5 步(关键前提):bucket json 里 2.5.2 对应的 hash 值,必须是本地这个 exe 文件的 SHA256,否则安装时校验失败,依旧会重新下载。
7. 误区澄清(三连)
千万别用 exe 文件的 SHA256 去做缓存文件名,永远是“URL 的 SHA256”; 就算同一个安装包,换个镜像 URL,缓存文件名 7 位串会完全改变; .7z后缀只是统一命名格式,不要求源文件真是 7z 压缩包。
8. 补充:新旧两种缓存文件名是怎么共存的
老版本 Scoop:缓存文件名是 app#version#URL转下划线;新版本 Scoop:优先查老文件名,不存在才用“7 位 URL 哈希.后缀”; 在 cache/里看到的clash-verge-rev#2.4.2#1271c54.7z,就是新版哈希命名规则,计算基准是带#/dl.7z的完整 URL 字符串。
相关链接
Scoop 官方仓库(cache_path 逻辑在 lib/core.ps1):https://github.com/ScoopInstaller/Scoop core.ps1 源码:https://github.com/ScoopInstaller/Scoop/blob/master/lib/core.ps1 Scoop 缓存管理 Wiki:https://github.com/ScoopInstaller/Scoop/wiki clash-verge-rev 发布页:https://github.com/clash-verge-rev/clash-verge-rev
写在最后
好啦,今天的分享就到这里!
💬 互动时间:
手动放过 Scoop 缓存、却被“文件名对不上”坑过的朋友,欢迎在评论区聊聊👇
最后,感谢你看到这里👏
如果喜欢这篇内容,不妨顺手给小编安排一波👇 点赞👍|转发📲|推荐❤️|评论📣
要是想第一时间蹲到新内容推送,记得给我点个星标⭐️
更多干货内容正在持续填坑中,咱们下期见👋

















































































