qinggeng2015/diff-tools

★ 0Forks 0SwiftGitHub ↗Compare

README

DiffTools

DiffTools 是一款完全本地运行的 macOS 文本差异对比工具。应用使用 Swift 和 macOS 原生界面实现,不包含 Electron、WebView 或 HTML 运行时;输入内容不会离开设备。

功能

  • 左右双栏输入并实时展示文本差异
  • 使用高对比配色清晰标记新增、删除和修改内容
  • 默认使用 16pt 等宽中等字重正文,并支持 ⌘+ / ⌘- 缩放、⌘0 恢复默认大小;字号会自动保存
  • 交换左右内容、清空内容以及复制结果
  • 将逐行数据按字典序重排后再对比
  • 解析 JSON,并将对象中的 key 递归按字典序重排后再对比
  • 所有处理均在本机离线完成

系统要求

  • macOS 13 Ventura 或更高版本
  • Intel(x86_64)或 Apple Silicon(arm64)Mac

安装

在仓库的 GitHub Releases 页面下载与 Mac 匹配的安装包:

  • Intel Mac:DiffTools-<版本>-macOS-x86_64.dmg
  • Apple Silicon Mac:DiffTools-<版本>-macOS-arm64.dmg

打开 DMG,将 DiffTools.app 拖入 Applications 文件夹。

关于自签名和 Gatekeeper

CI 使用 macOS ad-hoc 本地自签名(codesign --sign -)签署 .app 和 .dmg。这种签名可在构建与校验阶段发现签名后发生的文件修改,但不包含开发者证书,不能证明发布者身份,也不是 Apple Developer ID 签名;安装包未经过 Apple 公证。因此 macOS 第一次打开时会显示“无法验证开发者”等 Gatekeeper 提示,这是预期行为。

确认安装包来自本仓库且 SHA-256 与 Release 中的 .sha256 文件一致后,可在 Finder 中按住 Control 点击 DiffTools.app,选择“打开”,再在提示中选择“打开”。通常只需执行一次。

如果 Finder 仍阻止启动,也可以在确认下载来源与校验值后执行:

xattr -dr com.apple.quarantine /Applications/DiffTools.app

校验下载文件:

shasum -a 256 -c DiffTools-0.2.0-macOS-arm64.dmg.sha256

本地开发

需要 Xcode 15 或更高版本(Swift 5.9+)。完整 Xcode 同时提供运行 XCTest 所需的测试运行时;仅安装 Command Line Tools 的环境可能只能构建而无法运行测试。

运行测试:

swift test

运行开发构建:

swift run DiffTools

在当前 Mac 的原生架构上创建自签名 DMG:

./scripts/package-dmg.sh

ad-hoc 签名不创建或导入任何证书,不访问 Keychain,也不需要 sudo。它适合无需 Apple Developer 账号的开源构建,但无法消除 Gatekeeper 提示。

也可以明确指定架构和输出目录:

./scripts/package-dmg.sh x86_64 "$PWD/artifacts/x86_64"
./scripts/package-dmg.sh arm64 "$PWD/artifacts/arm64"

指定的架构必须受当前 Swift 工具链与主机支持。GitHub Actions 分别在原生 Intel 和 Apple Silicon runner 上构建,因此发布文件不会依赖 Rosetta 交叉编译。

可用环境变量覆盖打包元数据:

变量 默认值 说明
PRODUCT_NAME DiffTools .app 和 DMG 中显示的产品名
EXECUTABLE_NAME DiffTools Swift Package 可执行产品名
BUNDLE_IDENTIFIER com.qinggeng.DiffTools App Bundle Identifier
MINIMUM_MACOS_VERSION 13.0 最低 macOS 版本
VERSION 0.2.0 显示版本及 DMG 文件名版本
BUILD_NUMBER GitHub run number 或 1 App 构建号
APP_ICON_PATH target 的 Resources/AppIcon.icns 可选应用图标路径
DISABLE_SWIFTPM_SANDBOX 0 设为 1 时给 SwiftPM 追加 --disable-sandbox,仅用于已由外层沙箱隔离的受管环境

正常本机和 CI 构建应保留 SwiftPM 默认沙箱。只有在外层沙箱明确导致嵌套 sandbox-exec 失败时,才使用 DISABLE_SWIFTPM_SANDBOX=1。

CI/CD 与发布

.github/workflows/ci.yml 在推送到 main、Pull Request 和手动触发时运行。矩阵任务会:

  1. 在 macos-15-intel 上运行测试并构建 x86_64 App;
  2. 在 macos-15 Apple Silicon runner 上运行测试并构建 arm64 App;
  3. 对 App 和 DMG 执行 ad-hoc 本地自签名,并通过 codesign --verify 验证;
  4. 用 lipo -info 验证可执行文件架构;
  5. 用 hdiutil verify 验证并实际挂载 DMG,检查其中的 App 后再上传 artifacts。

创建版本 Release:

git tag v0.2.0
git push origin v0.2.0

v* tag 的两个架构任务全部成功后,工作流会校验 SHA-256,并创建或更新对应 GitHub Release,上传两个 DMG 和两个校验文件。

许可证

本项目基于 MIT License 发布,详见 LICENSE。

Contributors

qinggeng2015

Issues