夜雨聆风学习资料网

ARTICLE · 1194411

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

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"

要点就三步:

  1. 把【完整 URL 文本】按 UTF-8 转成字节流;
  2. 对这串文本算 SHA256,转小写,只取前 7 位;
  3. 拼成 app#version#7位哈希.后缀。

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 和缓存文件名的哈希,完全是两码事

字段
计算对象
用途
manifest 里的 hash
安装包 exe 二进制文件
安装时校验文件完整性,防止被篡改
缓存文件名的 7 位短哈希
下载链接 URL 的文本
区分同一软件同一版本的不同下载来源,避免文件名过长

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. 误区澄清(三连)

  1. 千万别用 exe 文件的 SHA256 去做缓存文件名,永远是“URL 的 SHA256”;
  2. 就算同一个安装包,换个镜像 URL,缓存文件名 7 位串会完全改变;
  3. .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 缓存、却被“文件名对不上”坑过的朋友,欢迎在评论区聊聊👇

最后,感谢你看到这里👏

如果喜欢这篇内容,不妨顺手给小编安排一波👇 点赞👍|转发📲|推荐❤️|评论📣

要是想第一时间蹲到新内容推送,记得给我点个星标⭐️

更多干货内容正在持续填坑中,咱们下期见👋

相关学习资料