CodMate 构建与发布教程:Makefile + SwiftPM 打包 Developer ID 签名 DMG 的完整流程
【免费下载链接】codmate
CodMate is a macOS SwiftUI app for managing CLI AI sessions: browse, search, organize, resume, and review work produced by Codex, Claude Code, and Gemini CLI. It focuses on speed, a compact three-column UI, and “ship it” workflows like Project Review (Git Changes) and one-click Resume/New.
CodMate 是一款 macOS SwiftUI 应用,用于管理 Codex、Claude Code 和 Gemini CLI 的会话。本文带你完整走一遍 CodMate 的构建与发布流程:从 SwiftPM 编译、Makefile目标,到 Developer ID 签名、公证(notarization)和 DMG 打包,帮助你快速上手 macOS 应用发布。
构建环境准备:macOS + Swift 6 工具链 🧰
CodMate 采用纯 SwiftPM 构建(无 Xcode 工程文件),因此环境要求很简单:
| 依赖 | 要求 | 用途 |
|---|---|---|
| macOS | 13.5+ | 最低部署目标 |
| Swift | 6 工具链 | 编译主程序与notify辅助工具 |
| Xcode Command Line Tools | 必须安装 | 提供xcrun actool编译资源目录 |
| Developer ID Application 证书 | 发布必须 | 签名应用与 DMG |
create-dmg | 可选 | 生成带拖拽安装的漂亮 DMG,缺失时自动回退hdiutil |
💡 本地开发调试不需要签名证书,构建脚本会自动退回到 ad-hoc 签名。
获取源码:一行命令克隆仓库
git clone https://gitcode.com/gh_mirrors/co/codmate cd codmate项目根目录的 Makefile 是构建入口,输入make help可以查看所有可用目标:
make help构建体系一览:Makefile 目标速查表 ⚙️
Makefile 中封装了完整的构建流程,核心目标如下:
| 目标 | 说明 | 示例 |
|---|---|---|
build | SwiftPM 调试构建 | make build |
release | SwiftPM 发布构建 | make release |
test | 运行 SwiftPM 测试 | make test |
run | 调试构建并直接启动应用 | make run |
app | 生成CodMate.app应用包 | make app VER=1.2.3 |
dmg | 生成 Developer ID 签名 DMG | make dmg VER=1.2.3 |
zip | 将 DMG 压缩为 zip 发布包 | make zip VER=1.2.3 |
clean | 清理构建产物 | make clean |
两个关键环境变量:
VER:营销版本号(写入CFBundleShortVersionString),如1.4.0;ARCH:目标架构,支持arm64、x86_64,也可以写"arm64 x86_64"构建通用二进制。
本地快速调试:make run 一步启动
开发阶段最常用的命令:
make run它会以本机架构做一次 debug 构建(自动使用 ad-hoc 签名),然后打开build/CodMate.app。如果需要查看运行时日志,Makefile 还提供了几个调试目标:
make debug:终端前台输出程序日志;make debug-app:后台启动应用并流式输出统一日志;make debug-logs:在应用运行时实时追踪log stream输出;make debug-file:日志同时写入logs/debug.log。
应用打包:make app 背后的构建流程 📦
执行make app VER=1.2.3时,实际调用的是 scripts/create-app-bundle.sh,它完成了完整的打包链路:
- 多架构编译:对
ARCH_MATRIX中的每个架构执行swift build -c release --arch <arch>; - 架构校验:用
lipo -info检查产物架构是否纯净,多架构时用lipo -create合并为 universal 二进制; - 二进制瘦身:默认执行
strip(可用STRIP=0关闭); - 组装 .app 包:复制主程序与
codmate-notify通知助手、写入Info.plist(Bundle ID 为ai.umate.codmate); - 编译资源:用
xcrun actool编译 assets/Assets.xcassets,生成Assets.car与应用图标; - 打入打包数据:复制 payload/providers.json、payload/terminals.json、提示词与内部技能等内置资源。
版本号策略由BUILD_NUMBER_STRATEGY控制:
| 策略 | 构建号生成方式 |
|---|---|
date(默认) | yyyymmddHHMM时间戳,如202510291430 |
git | git rev-list --count HEAD提交计数 |
counter | 本地计数器文件自增 |
脚本还会把 Git tag、commit 短哈希和 dirty 状态写入Info.plist,方便在"关于"面板中追踪产物来源。
发布流程核心:make dmg 生成签名 DMG 🚀
# 单架构(当前主机架构) make dmg VER=1.4.0 # 指定架构 make dmg VER=1.4.0 ARCH=arm64 # 双架构:同时产出 codmate-arm64.dmg 和 codmate-x86_64.dmg make dmg VER=1.4.0 ARCH="arm64 x86_64"make dmg调用的是 scripts/macos-build-notarized-dmg.sh,每个架构会经历五个阶段:
- 打包:复用上面的
create-app-bundle.sh生成该架构的CodMate-<arch>.app; - 签名:检测到 Developer ID 证书时,先签内部二进制
codmate-notify,再签主程序,最后签整个 bundle(带--options runtime硬运行时保护),并用codesign --verify --deep --strict自检。找不到证书时自动降级为 ad-hoc 签名并给出警告; - 制作 DMG:优先使用
create-dmg生成带 "拖入 Applications" 图标的安装盘,失败或未安装时回退到hdiutil create; - 公证:将 DMG 提交给 Apple 公证服务(见下一节);
- 装订验证:
xcrun stapler staple+stapler validate完成收尾。
产物输出到artifacts/release/目录,文件名为codmate-<arch>.dmg。
公证(Notarization)的两种认证方式
macOS 要求分发给普通用户的 Developer ID 应用必须经过 Apple 公证,否则 Gatekeeper 会拦截。脚本支持两种提交方式,且会自动识别(NOTARY_MODE=auto):
方式一:Keychain Profile(推荐,CI 友好)
xcrun notarytool store-credentials "AC_PROFILE" \ --team-id YOUR_TEAM_ID \ --apple-id you@apple.com \ --password app-specific-password APPLE_NOTARY_PROFILE="AC_PROFILE" make dmg VER=1.4.0方式二:Apple ID + 应用专用密码
APPLE_ID="you@apple.com" \ APPLE_PASSWORD="xxxx-xxxx-xxxx-xxxx" \ TEAM_ID="YOURTEAMID" \ make dmg VER=1.4.0🔒 脚本支持从项目根目录的
.env文件读取APPLE_SIGNING_IDENTITY、APPLE_ID、APPLE_PASSWORD、APPLE_TEAM_ID,命令行显式导出的变量优先,无需在 CI 日志中暴露密码。
如果设置了SKIP_NOTARIZATION=1或未提供任何凭据,脚本会跳过公证并明确提示——这样的 DMG 只适合内测,不能公开发布。
分发最后一公里:zip 打包与产物校验
DMG 公证完成后,通常还会再压一层 zip 方便下载渠道分发:
make zip VER=1.4.0它会在artifacts/release/下为每个 DMG 生成同名.zip。发布前建议手动做一次终检:
codesign --verify --deep --strict build/CodMate.app xcrun stapler validate artifacts/release/codmate-arm64.dmg此外,项目依赖变更后记得更新第三方许可声明:
make notices该目标通过 scripts/gen-third-party-notices.py 扫描 Package.resolved 与本地依赖缓存,重新生成THIRD-PARTY-NOTICES.md,任何缺失许可文件的依赖都会让构建失败。
常见问题排查 🛠️
| 现象 | 原因与解决 |
|---|---|
error: VER is required | app/dmg/zip目标必须传VER,例如make app VER=1.2.3 |
[warn] libghostty.a not found | 内嵌终端依赖的 Ghostty 静态库缺失,需先按ghostty/目录说明构建对应架构的libghostty.a |
Signing identity not found | 钥匙串中没有 Developer ID 证书,会降级 ad-hoc 签名;发布前请在 Xcode 的 Keychain Access 中确认证书存在 |
| DMG 缺少拖拽安装图标 | 未安装create-dmg,回退使用了hdiutil;安装create-dmg后重跑make dmg即可 |
| 用户打开 DMG 提示已损坏 | 未公证或证书链不完整,补齐公证凭据重新执行make dmg |
相关文档与源码位置 📚
- 构建总览文档:scripts/BUILD.md
- 构建入口 Makefile:Makefile
- 应用打包脚本:scripts/create-app-bundle.sh
- DMG 签名与公证脚本:scripts/macos-build-notarized-dmg.sh
- SwiftPM 包描述(依赖 GhosttyKit 与 MCP Swift SDK):Package.swift
- 许可声明生成器:scripts/gen-third-party-notices.py
- 构建与发布说明:README.md
流程回顾:make run日常调试 →make app VER=x.y.z出应用包 →make dmg VER=x.y.z签名并公证出 DMG →make zip生成发布产物。掌握这条流水线,你就能独立完成 CodMate 从源码到可分发 DMG 的完整构建与发布。
【免费下载链接】codmate
CodMate is a macOS SwiftUI app for managing CLI AI sessions: browse, search, organize, resume, and review work produced by Codex, Claude Code, and Gemini CLI. It focuses on speed, a compact three-column UI, and “ship it” workflows like Project Review (Git Changes) and one-click Resume/New.
相关推荐
ILSpy macOS 发布全流程:CI 无签名构建、离线签名公证与 DMG 打包实战
ILSpy macOS 发布全流程:CI 无签名构建、离线签名公证与 DMG 打包实战 本篇指南以 ILSpy 仓库中 BuildTools/packaging
逆向工程开发工具BaoCut macOS 打包发布指南:Developer ID 签名、Apple 公证与 Appcast 分批推送完整教程
BaoCut macOS 打包发布指南:Developer ID 签名、Apple 公证与 Appcast 分批推送完整教程 BaoCut 是一款带可编辑时间线
为什么Trimmy无法帮你粘贴?macOS辅助功能权限配置与避坑完全指南
为什么Trimmy无法帮你粘贴?macOS辅助功能权限配置与避坑完全指南 如果你在使用 Trimmy(一款把多行命令压成一行、让复制的 shell 片段一次粘贴
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考