返回资讯中心
外部精选
软件工程
#开发者实时流

开源下载管理器MacGet登陆macOS,可自适应多线程下载

来源标题:Show HN: MacGet – Open-source multi-connection download manager for macOS

MacGet是一款面向macOS的开源多线程下载管理器,通过运行时探测各主机的真实容量来调整并发连接,避免被CDN判定为盗链而限速或拒绝。它支持每个文件最多16个并行HTTP-Range分块,并具备断点续传、重启后恢复队列、剪贴板监听和浏览器扩展等功能。开发者称其与Internet Download Manager无关联,是独立的免费替代品。

Hacker News 最新dev_suryansh2026/11/7 · 5 天前17 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

一款原生 macOS 下载管理器,不会跟你的网络较劲。多线程 HTTP-Range 下载,配备自适应引擎,能识别防吸血 CDN、学习每个主机的限制,并避开 App Nap,让你切换应用时下载也能继续推进。 网站 · 安装指南 · 文档 · 种子下载 · 浏览器扩展 · 更新日志 注:MacGet 与 Tonec Inc. 或 Internet Download Manager 没有任何关联,也未获得其认可。它是一个独立的免费替代品。 大多数“多线程”下载管理器会天真地打开你能允许的任意数量的 TCP 连接。现代 CDN 把这视为吸血行为——它们会在传输几个字节后就用 TCP-RST 断开连接、对你的 IP 限速,或对你的请求返回 403。结果是:线程越多 = 下载越慢,有时还会失败。 MacGet 的引擎会在运行时探测每个主机的真实容量,并据此自适应: 每个文件最多 16 个并行 HTTP-Range 分块(行业标准上限;aria2 也用同样的上限)。 暂停 / 恢复 / 取消,状态在应用重启后仍能保留。 持久化队列——关闭应用再重新打开,进行中的下载会继续。 拖放、剪贴板监听、NSServices——可从任意位置粘贴 URL 或拖入文件。 下载进行中可实时调整线程数(受主机上限约束)。 内置书库目录——在应用内浏览和搜索 Project Gutenberg 与 Internet Archive,然后把书直接送入队列。也可添加任意 OPDS 源,包括你自己的 Calibre 服务器。 BitTorrent——磁力链接和 .torrent 文件与其他任务在同一个队列中下载,可同时进行多个。默认关闭;做种受你设定的比率和时间限制约束。MacGet 不搜索也不索引种子。 通过 Sparkle 自动更新——已启用并经过签名验证(详情)。 原生 SwiftUI,使用规范的 @Observable 视图模型和基于 actor 的引擎。 MIT 许可。无广告、无遥测、无付费。 安装 Homebrew(推荐) brew install --cask suryansh-codes2209/macget/macget 需要 Apple silicon 上的 macOS 26.4 或更高版本。该 cask 会在安装后移除 quarantine 属性,因此不会出现 Gatekeeper 提示,也没有“仍要打开”这一步。 从 Releases 页面下载 macget.dmg。 打开 DMG,把 Macget 拖到 Applications。 从 Applications 启动。 最低 macOS:26.4 Tahoe。 Macget 目前免费分发且未公证(没有付费的 Apple Developer 账号)。首次启动时 macOS Gatekeeper 会提示“Macget 无法打开,因为 Apple 无法检查其是否包含恶意软件。”这是预期行为——要打开它: 不想走上面这些步骤的高级用户可用一行命令: xattr -dr com.apple.quarantine /Applications/Macget.app 完成这一次性步骤后,通过 Sparkle 进行的自动更新即可顺利安装。 git clone https://github.com/Suryansh-Codes2209/Macget.git cd Macget open Macget.xcodeproj 然后在 Xcode 中:⌘R 运行,⌘U 测试。.xcodeproj 已提交,Sparkle 被包在 #if canImport(Sparkle) 之后,因此应用无需任何额外设置即可构建和运行。 要启用自动更新(可选):File → Add Package Dependencies… → https://github.com/sparkle-project/Sparkle(≥ 2.6.0)。 首次安装之后,你不需要再从本页重新下载 MacGet——它会通过 Sparkle 自我保持最新,Sparkle 是 Mac App Store 之外分发的应用所采用的标准自动更新框架。 Sparkle 被包在 #if canImport(Sparkle) 之后。自动更新在捆绑了 Sparkle SPM 依赖的发布构建中生效;不含该依赖的源码构建会回退到一个“检查更新…”菜单项,并说明缺少该依赖。 维护者——发布更新:切一个 release(见发布 DMG),然后用 Sparkle/bin/generate_appcast site/ 重新生成已签名的 feed 并推送 site/。GitHub Pages 会在上面的 SUFeedURL 提供 site/appcast.xml。EdDSA 私有签名密钥只存在于你的登录钥匙串(“Private key for signing Sparkle updates”)——请离线备份,否则你将永远无法为现有安装签名后续更新。 下载引擎是应用的核心;其余都只是胶水。单个下载任务的顶层流程: 探测(HEAD → GET Range:0-0 回退)→ 磁盘空间检查 → 规划分块 → 打开稀疏 partial 文件 → 启动 worker(错峰) → 通过 URLSession 流式传输 → 经 FileWriter actor 以 64 KB 写入 → 快速失败时降级 → 收尾 → 移动到目标位置 关键类型(位于 Macget/Engine/ 下): 更深入的细节请阅读 docs/architecture.md——完整的引擎讲解、对象图和恢复语义。CLAUDE.md 保存了贡献者的日常约定。 Macget/ ├── Macget/ ← Swift 源码 │ ├── App/ ← AppDelegate、AppEnvironment │ ├── Models/ ← Download、Chunk、Status、Settings │ ├── Persistence/ ← DownloadStore(queue.json)、HostCapStore(host_caps.json) │ ├── Engine/ ← ★ 多线程下载引擎 │ ├── Services/ ← 剪贴板监听、文件名解析、磁盘检查 │ │ └── Catalog/ ← OPDS 解析器/客户端、目录列表(catalogs.json) │ ├── Updater/ ← Sparkle 封装(受条件控制) │ ├── ViewModels/ ← @MainActor @Observable │ ├── Views/ ← SwiftUI │ ├── Resources/ ← Info.plist、entitlements、Assets.xcassets、Branding/ │ └── Supporting/ ← os.Logger ├── MacgetTests/ ← XCTest 测试套件(46 个测试) ├── MacgetUITests/ ← XCUITest 测试框架 ├── scripts/release.sh ← 构建 → DMG → 公证 → 装订 ├── site/index.html ← 落地页(通过 GitHub Pages 部署) ├── .github/workflows/ci.yml ← CI:推送/PR 时构建 + 测试 ├── CHANGELOG.md ├── CLAUDE.md ← 架构 + 约定 └── Macget.xcodeproj 构建、测试、发布 开发

构建

xcodebuild -project Macget.xcodeproj -scheme Macget -configuration Debug build

运行所有测试

xcodebuild test -project Macget.xcodeproj -scheme Macget -destination 'platform=macOS'

运行单个测试类或方法

xcodebuild test -project Macget.xcodeproj -scheme Macget -destination 'platform=macOS'
-only-testing:MacgetTests/ChunkPlannerTests 发布 DMG(scripts/release.sh) 免费、无需 Apple 账号:运行 ./scripts/release.sh --no-notarize。它会构建一个 临时签名的 DMG(捆绑 yt-dlp + ffmpeg),跳过 Developer ID 和

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →