
桌面应用【免费下载链接】WhiskyA modern Wine wrapper for macOS built with SwiftUI项目地址https://gitcode.com/gh_mirrors/wh/Whisky点击查看免费下载Whisky 是一个面向 Apple Silicon Mac 的原生 SwiftUI 应用它以优雅的图形界面封装了 Wine、CrossOver 与 Apple Game Porting ToolkitGPTK让用户无需掌握任何命令行知识即可创建和管理 Bottle、安装并运行 Windows 应用与游戏。本文将以本仓库的 README.md 为主线结合WhiskyKit与Whisky两个模块的源码逐层剖析 Whisky 的系统要求、安装方式、Bottle 与 Wine 架构、命令行工具及维护状态帮助你理解其内部实现并正确上手。一、项目定位Wine 之上的“更浓一杯”Whisky 的自我定位是 “Wine but a bit stronger”。它并不是一个从零实现的 Windows 兼容层而是一个图形化包装器Graphical WrapperWhisky provides a clean and easy to use graphical wrapper for Wine built in native SwiftUI. You can make and manage bottles, install and run Windows apps and games, and unlock the full potential of your Mac with no technical knowledge required.从 README.md 可以确认Whisky 建立在两个关键底座之上CrossOver 22.1.1CodeWeavers 基于 Wine 的商业化发行版Whisky 直接复用了它的 Wine 构建Apple 的 Game Porting ToolkitGPTK / D3DMetalApple 提供的 Direct3D→Metal 转换层用于在 macOS 上运行 Windows 游戏。仓库的代码结构也印证了这一点WhiskyKit是整个应用的核心逻辑层Bottle 管理、Wine 进程调度、PE 文件解析、WhiskyWine 安装器而Whisky则是 SwiftUI 界面层WhiskyCmd提供了命令行入口。三层结构分别对应WhiskyKit/Sources/WhiskyKit/Whisky/Bottle.swiftBottle 数据模型与生命周期WhiskyKit/Sources/WhiskyKit/Wine/Wine.swiftwine64/wineserver 进程封装Whisky/Views全部 SwiftUI 视图。二、系统要求与前置条件README 给出的硬性要求只有两条这也是所有后续操作的前提项目要求CPUApple SiliconM 系列芯片操作系统macOS Sonoma 14.0 或更高版本从源码看Whisky 对 Apple Silicon 的依赖主要体现在两个层面Rosetta 2Wine 的 Windows x86 程序需要在 ARM 上通过 Rosetta 2 转译运行。在 Rosetta2.swift 中Whisky 通过检查/Library/Apple/usr/libexec/oah/libRosettaRuntime是否存在来判断 Rosetta 是否已安装若未安装则调用/usr/sbin/softwareupdate --install-rosetta --agree-to-license静默安装。首次启动向导SetupView的第一阶段就是 Rosetta 检查流程定义在 SetupView.swift 的SetupStage枚举中rosetta → whiskyWineDownload → whiskyWineInstall。D3DMetal 与 MSyncGPTK 与基于 Apple 同步原语Semaphore的 msync 增强同步方案均面向 Apple Silicon 设计。三、安装方式3.1 Homebrew官方推荐README 提供了唯一的官方安装命令brew install --cask whisky该命令会通过 Homebrew Cask 安装 Whisky 应用本体并引导你完成首次启动时的 Rosetta 2 与 WhiskyWine 组件安装。3.2 应用内组件安装Whisky 运行时的 Wine 运行时称为WhiskyWine并非随应用打包而是首次启动时由安装器从远端拉取并解压。相关实现位于 WhiskyWineInstaller.swift安装目录~/Library/Application Support/{bundleId}其中Libraries/Wine/bin存放wine64与wineserver二进制WhiskyWineInstaller.swift版本校验安装器读取本地WhiskyWineVersion.plist并对比https://data.getwhisky.app/Wine/WhiskyWineVersion.plist上的远端版本若远端更新则提示升级WhiskyWineInstaller.swift安装动作将下载的 tar 包解压至应用目录Tar.untar随后删除临时文件WhiskyWineInstaller.swift。界面侧对应 WhiskyWineDownloadView.swift 与 WhiskyWineInstallView.swift 两个下载/安装阶段视图。四、Bottle一次点击的创建与管理Bottle酒瓶是 Wine 世界里的“隔离环境”——每个 Bottle 拥有独立的WINEPREFIX、独立的 Windows 系统设置与已安装程序。Whisky 的核心卖点之一就是“One-click bottle creation and management”一键创建与管理 Bottle。4.1 Bottle 的存储结构在 BottleData.swift 中可以看到 Bottle 的默认落盘位置~/Library/Containers/{whiskyBundleIdentifier}/ ├── Bottles/ # 所有 Bottle 的存放目录默认 └── BottleVM.plist # Bottle 路径索引Property List其中BottleVM.plist保存了所有已知 Bottle 的 URL 列表paths: [URL]BottleData每次改动路径都会自动重新编码该 plistBottleData.swift。每个 Bottle 自身是一个独立文件夹内部包含Metadata.plistBottle 的完整配置名称、Windows 版本、Wine 版本、DXVK 开关、Pins、Blocklist 等由 Bottle.swift 负责读写drive_c/Windows 虚拟 C 盘windows/system32、windows/syswow64等Program Settings/每个程序独立的.plist配置。4.2 创建 Bottle 的完整流程界面创建流程位于 BottleCreationView.swift填写名称、选择 Windows 版本WinVersion、选择存放目录后调用BottleVM.shared.createNewBottle(...)。命令行版本则在WhiskyCmd的Create子命令中whisky create My Bottle其实现逻辑WhiskyCmd/Main.swift是在默认目录下用UUID创建新文件夹 → 初始化BottleinFlight: true表示尚未完成配置→ 设置 Windows 版本为win10→ 将路径追加到BottleData.paths。4.3 BottleSettings配置即 plistBottle 的全部配置集中在 BottleSettings.swift 的BottleSettings结构中它由四个子配置聚合而成配置块关键字段默认值BottleInfoname、pins、blocklistBottle、空、空BottleWineConfigwineVersion、windowsVersion、enhancedSync、avxEnabled7.7.0、.win10、.msync、falseBottleMetalConfigmetalHud、metalTrace、dxrEnabled均为falseBottleDXVKConfigdxvk、dxvkAsync、dxvkHudfalse、true、.off所有配置均通过PropertyListEncoder/Decoder序列化为 XML plistBottleSettings.swift并以fileVersion当前为1.0.0做格式兼容校验——版本不符时重置为默认配置并重新写入。WinVersion枚举支持从 Windows XP 到 Windows 11 共 6 个取值winxp64、win7、win8、win81、win10、win11见 BottleSettings.swift。五、Wine 集成进程、环境变量与注册表Wine.swift 是 Whisky 与 Wine 交互的核心枢纽它封装了wine64与wineserver两个二进制并提供同步/异步两种调用方式。5.1 核心 API 一览API作用底层命令runProgram(at:args:bottle:environment:)运行 Windows 程序wine64 start /unix {exe路径} {参数}Wine.swiftrunWine(_:bottle:environment:)执行任意 Wine 命令并返回输出wine64 {args}Wine.swiftrunBatchFile(url:bottle:)执行批处理脚本wine64 cmd /c {脚本}Wine.swiftkillBottle(bottle:)终止 Bottle 内全部 Wine 进程wineserver -kWine.swiftenableDXVK(bottle:)为 Bottle 注入 DXVK替换system32/syswow64下的 DLLWine.swiftwineVersion()查询 Wine 版本wine64 --versionWine.swift5.2 环境变量的组装每次启动 Wine 进程前Whisky 都会构造一套环境变量Wine.swiftWINEPREFIXbottle 路径 WINEDEBUGfixme-all GST_DEBUG1随后按 Bottle 配置追加变量BottleSettings.swiftDXVK 开启WINEDLLOVERRIDESdxgi,d3d9,d3d10core,d3d11n,bDXVK HUDDXVK_HUD可选full完整、devinfo,fps,frametimespartial、fps三档异步 DXVKDXVK_ASYNC1增强同步WINEESYNC1esync或WINEMSYNC1msync。值得注意的是msync 模式下 Whisky 会同时设置WINEESYNC1因为 D3DM 会检测 ESYNC 并据此改变行为必须“欺骗”它以避免在 MSYNC 下出错该值硬编码在lid3dshared.dylib中Metal HUDMTL_HUD_ENABLED1Metal 追踪METAL_CAPTURE_ENABLED1AVX 支持ROSETTA_ADVERTISE_AVX1通过 Rosetta 向程序声明 AVX 指令集支持DXR光追D3DM_SUPPORT_DXR1。5.3 注册表操作Whisky 通过wine64 reg命令读写注册表实现 Windows 版本切换、Retina 模式、DPI 缩放等设置Wine.swiftWindows 版本winecfg -v {winver}枚举值即前文的WinVersionBuild 版本号写HKLM\Software\Microsoft\Windows NT\CurrentVersion下的CurrentBuild/CurrentBuildNumberRetina 模式HKCU\Software\Wine\Mac Driver下的RetinaModey/nDPI 分辨率HKCU\Control Panel\Desktop下的LogPixelsREG_DWORD十六进制读取。六、程序管理与 PE 解析Whisky 不只是“运行 exe”它还会对每个程序做独立的配置管理每个程序在 Bottle 的Program Settings/目录下有独立的{程序名}.plist保存locale区域语言、environment自定义环境变量、arguments启动参数三项配置见 ProgramSettings.swift。区域语言支持从德语、日语到简体/繁体中文等 12 种通过LC_ALL环境变量注入Program.swiftPins固定机制可将常用程序固定到 Bottle 首页pin 信息名称、URL、是否可移除保存在BottleSettings.pins中见 Bottle.swiftPE 解析WhiskyKit 内置了完整的 Windows PE 文件解析器WhiskyKit/Sources/WhiskyKit/PE覆盖 DOS/COFF 文件头COFFFileHeader.swift、可选头OptionalHeader.swift、节表Section.swift以及资源段RSRC/下的ResourceDirectoryTable、ResourceDataEntry等Program初始化时即尝试解析 PE 以提取程序信息Program.swift。七、WhiskyCmd命令行接口除了图形界面Whisky 还提供了基于swift-argument-parser的命令行工具WhiskyCmdWhiskyCmd/Main.swift。已实现的子命令如下子命令功能list以表格列出所有 Bottle名称、Windows 版本、路径create name创建一个新的 Bottleadd path将磁盘上已有的 Bottle 导入 Whiskydelete name从磁盘删除 Bottleremove name从 Whisky 中移除 Bottle 记录不删磁盘文件run bottle path [args...]在指定 Bottle 中运行程序shellenv bottle打印可供eval的环境变量导出语句shellenv的输出源自 Wine.swift 的generateTerminalEnvironmentCommand它会导出wine64的 bin 目录到PATH设置WINEwine64并为winecfg、msiexec、regedit、wineboot等常用命令建立别名最后导出该 Bottle 的完整环境变量使用户可以在终端中直接以当前 Bottle 为前缀操作 Wineeval $(whisky shellenv My Bottle)八、游戏兼容性说明与维护状态8.1 游戏不工作怎么办README 明确指出“Some games need special steps to get working.” 即部分游戏需要特殊步骤才能运行。README 原文指向项目 wiki 的 Game Support 页面获取按游戏整理的兼容性资料。实践中建议确认系统满足上文要求的 Apple Silicon macOS 14.0优先为游戏单独创建 Bottle避免多游戏共享前缀导致 DLL 污染按游戏需求在 Bottle 配置中切换 Windows 版本、开启 DXVK 或调整增强同步模式esync/msync。8.2 维护状态重要README 顶部有一条醒目的Maintenance NoticeWhisky is no longer actively maintained. Apps and games may break at any time.即该项目已停止积极维护应用与游戏随时可能出现兼容性故障。这意味着本仓库中的代码反映的是项目停止维护时的最终状态Wine 生态、macOS 系统更新都可能导致部分功能失效使用时应以当前仓库与已安装组件为准不要假设未来的持续更新。九、致谢与依赖生态Whisky 的成功建立在多个开源与商业项目的协作之上。README 的 Credits 部分列出的关键依赖包括msyncmarzent基于 Mach Semaphore 的 Wine 增强同步方案即上文WINEMSYNC的来源DXVK-macOSGcenx / doitsujinDirect3D 9/10/11 → Vulkan 的转换层被 Whisky 用于在 macOS 上运行 DX 游戏MoltenVKKhronosGroupVulkan → Metal 实现层与 DXVK 配合构成 macOS 上的 DX 渲染链路Sparkle应用自动更新框架CrossOver 22.1.1CodeWeavers / WineHQWhiskyWine 运行时的基础D3DMetalAppleGame Porting Toolkit 的核心组件swift-argument-parser、SemanticVersion、SwiftyTextTable分别支撑WhiskyCmd的 CLI 解析、版本比较与表格输出。这些依赖也解释了本仓库目录中的几个关联产物仓库根目录的Libraries/cabextract用于解包 Windows 安装程序的工具、images/cw-dark.png与images/cw-light.pngREADME 中展示的 CrossOver 宣传图以及 SwiftPM 的依赖锁定文件 Whisky.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved。十、从源码开始的进一步探索如果你想深入理解 Whisky 的实现细节建议按以下路径阅读源码入口与界面流从 Whisky/WhiskyApp.swift 与 Whisky/Views/Setup/SetupView.swift 入手理解首次启动的 Rosetta → WhiskyWine 下载 → 安装流程Bottle 数据层通读 WhiskyKit/Sources/WhiskyKit/Whisky/Bottle.swift、BottleSettings.swift 与 BottleData.swift掌握配置持久化与索引机制Wine 进程层精读 WhiskyKit/Sources/WhiskyKit/Wine/Wine.swift并配合ProcessExtensions.swift位于 WhiskyKit/Sources/WhiskyKit/Extensions理解异步输出流AsyncStreamProcessOutput的实现PE 解析器探索 WhiskyKit/Sources/WhiskyKit/PE 下的 COFF 头、可选头、节表与资源目录实现。总结Whisky 的定位非常清晰在 Apple Silicon 的 macOS 上用零门槛的 SwiftUI 界面把 Wine CrossOver GPTK 的复杂能力组织成“建瓶、装程序、点运行”三步操作。从本文的分析可以看到它的工程实现同样扎实——plist 化的 Bottle 配置、围绕WINEPREFIX的环境变量组装、基于wine64/wineserver/reg的进程与注册表封装、以及完整的 PE 解析器都为“图形化 Wine”这个目标提供了可靠的底层支撑。需要注意的是该项目已宣布停止积极维护评估长期使用时需自行权衡兼容性风险。赞分享桌面应用【免费下载链接】WhiskyA modern Wine wrapper for macOS built with SwiftUI项目地址https://gitcode.com/gh_mirrors/wh/Whisky点击查看免费下载相关推荐TorchGAN论文解读灵活高效的GAN训练框架核心原理TorchGAN论文解读灵活高效的GAN训练框架核心原理 TorchGAN是一个基于PyTorch的灵活高效的GAN训练框架它通过模块化设计让研究人员和开发Whisky 项目贡献指南基于 SwiftUI 的 macOS Wine 封装器的协作规范与工程实践Whisky 项目贡献指南基于 SwiftUI 的 macOS Wine 封装器的协作规范与工程实践 Whisky 是一个基于 SwiftUI 构建、为 ma桌面应用Whisky新一代macOS Wine封装器用SwiftUI打造的现代化Windows应用运行方案Whisky新一代macOS Wine封装器用SwiftUI打造的现代化Windows应用运行方案 引言告别复杂配置迎接macOS上的Windows应用桌面应用上一篇90DaysOfDevOpsLinux 系统、文件系统与存储管理实战指南Day 16下一篇LeetCode-Go 题解 | 498. Diagonal Traverse 对角线遍历坐标轴模拟法与边界处理详解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考