关于 ShareX Architecture and Porting
这份开发技能文档说明 XerahS 的架构与移植规则,包括平台抽象边界和 Avalonia 解决方案结构,供移植 ShareX 后端代码的贡献者参考。
主要功能
- 01平台抽象要求
- 02移植 ShareX 代码的规则
- 03建议的 Avalonia 项目结构
- 04历史版本对照指南
适用场景
- 01将原生代码与共享逻辑分离
- 02在 UI 开发前规划后端模块
- 03将实现与指定提交进行比较
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ sharex/ xerahs --skill sharex-architecture-and-porting安装后在 Claude Code 中输入/sharex-architecture-and-porting确认已加载。
详细介绍
平台抽象和原生代码规则
所有特定于平台的功能都必须通过平台抽象接口隔离。
XerahS.Platform.* 项目之外的代码不得引用:
NativeMethodsNativeConstants、NativeEnums、NativeStructs- Win32 P/Invoke
System.Windows.Forms- Windows 专用句柄或消息
禁止在 Common、Core、Uploaders、Media 或其他后端项目中直接调用 Windows API。
必需的架构
在 XerahS.Platform.Abstractions 中定义平台中立的接口。
在 XerahS.Platform.Windows 中实现 Windows 功能。
为未来的平台创建存根实现:
XerahS.Platform.LinuxXerahS.Platform.MacOS
仅限 Windows 的功能
如果某项功能仅适用于 Windows:
- 仍必须通过抽象接口定义。
- Windows 提供具体实现。
- 其他平台提供存根实现,且应:
- 抛出
PlatformNotSupportedException,或 - 记录警告后安全地不执行任何操作。
- 抛出
UI 和工作流必须检测功能是否可用,并停用或隐藏不受支持的功能。
迁移现有 ShareX 代码的规则
只有完全不包含以下引用的文件,才可以直接迁移:
NativeMethods或相关原生辅助代码- WinForms 类型
- Windows 专用互操作
如果文件混合了逻辑和原生调用:
- 将纯逻辑提取到 Common 或 Core。
- 将原生代码移至
XerahS.Platform.Windows。 - 将调用点替换为接口调用。
原生方法名称和签名应保持为 Windows 专用内容,不得泄漏到共享层。
执行规则
迁移 ShareX.HelpersLib 时,引用以下内容的文件:
NativeMethods.csNativeMethods_Helpers.csNativeMessagingHost.cs- DWM、钩子、剪贴板或输入 API
必须视为平台代码,不得整体复制。
主要目标和迁移规则
- 主要目标:先迁移 ShareX 后端,再设计 Avalonia UI,以此构建 XerahS。
- 检查
C:\Users\liveu\source\repos\ShareX Team\ShareX,了解现有的非 UI 逻辑,并在拟定 Avalonia 解决方案和项目后,将其复制到此仓库中复用。 - 不要复用 WinForms 或任何 WinForms UI 代码;只能复制非 UI 方法和数据模型。
- 在明确开始 UI 设计阶段之前,优先迁移后端。
Avalonia 解决方案提案(基于 ShareX 分析)
- 先从最简单的后端库开始,再逐步迁移到更复杂的模块。
- 建议的结构:
XerahS.Common:共享辅助代码、序列化和实用工具。XerahS.Core:任务设置、工作流和应用级服务。XerahS.Uploaders:上传器、配置、OAuth 和 HTTP 辅助代码。XerahS.History:历史记录模型和持久化。XerahS.Indexer:文件索引和搜索。XerahS.ImageEffects:滤镜/效果处理流水线。XerahS.Media:编码、缩略图和 FFmpeg 集成。XerahS.ScreenCapture:捕获引擎和平台抽象。XerahS.Platform.*:特定于操作系统的实现(先支持 Windows,其他平台稍后支持)。XerahS.App和XerahS.UI:Avalonia UI 和视图模型(待后端就绪后再处理)。
历史比较与一致性
当被要求确保与某个特定历史提交保持功能一致,或“使其与提交 X 完全相同”时:
- 不要反复调用 git:避免在会话期间反复查询 git 历史记录中的文件内容。
- 创建
ref目录:创建一个临时文件夹(例如src/XerahS/ref)。 - 下载参考文件:使用
git show <commit_hash>:<file_path> > src/XerahS/ref/<commit_short>_<filename>,核实相关文件在该提交中的状态。 - 在本地比较:对当前本地文件与下载的参考文件进行差异比较和分析。
- 清理:任务完成并核实后,删除
ref目录,除非另有指示。
这样可以减少 git 命令开销,并为一致性检查提供稳定的参考点。
评论
支持 Markdown