173 lines
10 KiB
Makefile
173 lines
10 KiB
Makefile
set dotenv-load := true
|
||
|
||
default:
|
||
@just --list
|
||
|
||
dev-back:
|
||
go run ./cmd/cdropd
|
||
|
||
dev-front:
|
||
cd web && npm run dev
|
||
|
||
build-back:
|
||
mkdir -p dist
|
||
go build -o dist/cdropd ./cmd/cdropd
|
||
|
||
build-front:
|
||
cd web && npm run build
|
||
|
||
build: build-back build-front
|
||
|
||
test:
|
||
go test ./...
|
||
|
||
typecheck-front:
|
||
cd web && npm run typecheck
|
||
|
||
fmt:
|
||
gofmt -w .
|
||
|
||
vet:
|
||
go vet ./...
|
||
|
||
# 生成一对 VAPID 密钥(Web Push 用)。输出两行 env,写进部署密钥后固定不变——
|
||
# 更换会使所有既有浏览器订阅失效。两者皆设才启用推送。
|
||
vapid-keygen:
|
||
go run ./cmd/vapidgen
|
||
|
||
# ---- desktop client (Wails · macOS 主开发,Windows 在 Parallels 验证) ----
|
||
|
||
# wails CLI 在 go install 后落在 $(go env GOPATH)/bin/wails,
|
||
# 用绝对路径避免依赖 shell PATH 配置。
|
||
wails := `go env GOPATH` + "/bin/wails"
|
||
|
||
# 起 wails dev 热重载,前端走 Vite dev server。
|
||
desktop-dev:
|
||
cd desktop && {{wails}} dev
|
||
|
||
# 构建 macOS Apple Silicon .app(darwin/arm64;不支持 Intel)。
|
||
# 每次清理 build/bin:带空格的 macOS .app 若残留在 Go 模块内,会被后续跨平台
|
||
# 绑定生成误判为包路径;同一输出槽也只保留本次平台的一份客户端。
|
||
#
|
||
# ⚠️ 先手动构建前端再 `wails build -s`(跳过 wails 自带前端步骤):wails build 的
|
||
# frontend:build 在本仓库结构下不可靠(不实际重建 web/ → 嵌入旧 JS)。显式构建
|
||
# web → desktop/frontend/dist,再用 -s 让 go:embed 嵌入这份新 dist。
|
||
desktop-build-mac:
|
||
cd web && npm run build -- --outDir ../desktop/frontend/dist --emptyOutDir
|
||
cd desktop && {{wails}} build -clean -s -platform darwin/arm64
|
||
|
||
# 正式 macOS 分发:复用钥匙串中的 Developer ID Application 证书,对 ARM64 Wails app
|
||
# 启用 hardened runtime + 时间戳签名,先公证并装订 app,再生成、签名、公证和装订 DMG。
|
||
# 公证使用与 iOS provisioning 共用的 ASC API Key;所有身份和密钥路径从 .env 读取。
|
||
desktop-dist-mac: desktop-build-mac
|
||
[ -n "$CDROP_DEVID_IDENTITY" ] && [ -n "$CDROP_ASC_KEY_PATH" ] && [ -n "$CDROP_ASC_KEY_ID" ] && [ -n "$CDROP_ASC_ISSUER_ID" ] || { echo "缺 .env(CDROP_DEVID_IDENTITY / CDROP_ASC_KEY_PATH / CDROP_ASC_KEY_ID / CDROP_ASC_ISSUER_ID)"; exit 1; }
|
||
[ -f "$CDROP_ASC_KEY_PATH" ]
|
||
security find-identity -v -p codesigning | rg -F "$CDROP_DEVID_IDENTITY"
|
||
codesign --force --deep --options runtime --timestamp --sign "$CDROP_DEVID_IDENTITY" 'desktop/build/bin/Commilitia Drop.app'
|
||
codesign --verify --deep --strict --verbose=2 'desktop/build/bin/Commilitia Drop.app'
|
||
rm -f 'desktop/build/bin/Commilitia Drop.app.zip' 'desktop/build/bin/Commilitia Drop.dmg'
|
||
ditto -c -k --keepParent 'desktop/build/bin/Commilitia Drop.app' 'desktop/build/bin/Commilitia Drop.app.zip'
|
||
xcrun notarytool submit 'desktop/build/bin/Commilitia Drop.app.zip' --key "$CDROP_ASC_KEY_PATH" --key-id "$CDROP_ASC_KEY_ID" --issuer "$CDROP_ASC_ISSUER_ID" --wait
|
||
xcrun stapler staple 'desktop/build/bin/Commilitia Drop.app'
|
||
xcrun stapler validate 'desktop/build/bin/Commilitia Drop.app'
|
||
bash desktop/scripts/make-dmg.sh 'desktop/build/bin/Commilitia Drop.app' 'desktop/build/bin/Commilitia Drop.dmg'
|
||
codesign --force --timestamp --sign "$CDROP_DEVID_IDENTITY" 'desktop/build/bin/Commilitia Drop.dmg'
|
||
xcrun notarytool submit 'desktop/build/bin/Commilitia Drop.dmg' --key "$CDROP_ASC_KEY_PATH" --key-id "$CDROP_ASC_KEY_ID" --issuer "$CDROP_ASC_ISSUER_ID" --wait
|
||
xcrun stapler staple 'desktop/build/bin/Commilitia Drop.dmg'
|
||
xcrun stapler validate 'desktop/build/bin/Commilitia Drop.dmg'
|
||
spctl --assess --type execute --verbose=2 'desktop/build/bin/Commilitia Drop.app'
|
||
spctl --assess --type open --context context:primary-signature --verbose=2 'desktop/build/bin/Commilitia Drop.dmg'
|
||
rm -f 'desktop/build/bin/Commilitia Drop.app.zip'
|
||
|
||
# 交叉编译 Windows amd64 .exe。macOS 原生即可——Windows 侧无 cgo(darwin 的
|
||
# NSStatusBar/NSPasteboard CGO 走 build tag 排除,WebView2 是纯 Go),不需 mingw。
|
||
# 与 mac 同:先手动构建前端再 -s(wails 自带 frontend:build 在本仓库不可靠)。
|
||
# 产物 build/bin/Commilitia Drop.exe;真测试经 RDP 到 Windows 机器跑。
|
||
desktop-build-win:
|
||
cd web && npm run build -- --outDir ../desktop/frontend/dist --emptyOutDir
|
||
cd desktop && {{wails}} build -clean -s -platform windows/amd64
|
||
|
||
# 清空 build/bin/ 产物。
|
||
desktop-clean:
|
||
rm -rf desktop/build/bin
|
||
|
||
# 环境自检。
|
||
desktop-doctor:
|
||
{{wails}} doctor
|
||
|
||
# ---- iOS 真机 ----
|
||
|
||
# 列出已连接的真机(手机插 USB 后取 UDID,填进门户 Devices + just ios-device)。
|
||
ios-devices:
|
||
xcrun devicectl list devices
|
||
|
||
# 拉取品牌字标字体 Fredoka(logo / Wordmark 用,不入库——虽为开源 OFL 仍统一从 Google Fonts 拉,
|
||
# 保持仓库精简)。幂等:已存在则跳过。ios-sim-build / ios-device 构建前已 chain 本步。前置:curl;造
|
||
# Fredoka 静态实例需 python3 + fonttools(python3 -m pip install --user fonttools)。UI 界面字体已改用
|
||
# 系统原生字体(不再拉 Orbit Gothic / Maple Mono);见 ios/CDrop/Shared/Fonts/README.md。
|
||
ios-fonts:
|
||
mkdir -p ios/CDrop/Shared/Fonts
|
||
[ -f ios/CDrop/Shared/Fonts/Fredoka-SemiBold.ttf ] || just ios-fonts-fredoka
|
||
|
||
# Fredoka 字标:从 Google Fonts 变量字体实例化出静态 SemiBold(wght=600, wdth=100)。
|
||
ios-fonts-fredoka:
|
||
curl -fsSL "https://raw.githubusercontent.com/google/fonts/main/ofl/fredoka/Fredoka%5Bwdth%2Cwght%5D.ttf" -o /tmp/Fredoka-VF.ttf
|
||
python3 -m fontTools.varLib.instancer /tmp/Fredoka-VF.ttf wght=600 wdth=100 -o ios/CDrop/Shared/Fonts/Fredoka-SemiBold.ttf --update-name-table
|
||
rm -f /tmp/Fredoka-VF.ttf
|
||
|
||
# 模拟器编译验证(无需签名 / Apple 账号):拉字体 + xcodegen + xcodebuild iphonesimulator。原生数据面
|
||
# 引擎走 SPM 的 libwebrtc(首次构建自动拉取 WebRTC.xcframework),无需预构建步骤。用于改动自检。
|
||
ios-sim-build:
|
||
just ios-fonts
|
||
cd ios/CDrop && xcodegen generate
|
||
cd ios/CDrop && xcodebuild -project CommilitiaDrop.xcodeproj -scheme CommilitiaDrop -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' -derivedDataPath build/DD build
|
||
|
||
# 内部:生成工程 + 解析 SPM 依赖 + 补齐 macOS WebRTC 头。stasel/WebRTC 149 的原生 macOS 切片随包
|
||
# 只带 umbrella、缺全部子头(`import WebRTC` 编不过;二进制有效),须从 ios 切片补齐,见
|
||
# scripts/patch-macos-webrtc-headers.sh。mac-build / mac-test 共用;须 resolve 之后 build 之前跑。
|
||
mac-prep:
|
||
cd ios/CDrop && xcodegen generate
|
||
cd ios/CDrop && xcodebuild -project CommilitiaDrop.xcodeproj -scheme CommilitiaDropMac -sdk macosx -derivedDataPath build/DD-mac -resolvePackageDependencies
|
||
bash ios/CDrop/scripts/patch-macos-webrtc-headers.sh ios/CDrop/build/DD-mac
|
||
|
||
# macOS 原生迁移候选的本地编译(ad-hoc 签名,无需 Apple 账号),仅供开发验证,不是正式
|
||
# 客户端或分发入口。正式 macOS 客户端仍由 desktop-build-mac 构建;只有完成功能对等、三语、
|
||
# 签名扩展与真机验收后才允许切换。候选产物位于 build/DD-mac/Build/Products/Debug/
|
||
# CommilitiaDropMac.app。
|
||
mac-build: mac-prep
|
||
cd ios/CDrop && xcodebuild -project CommilitiaDrop.xcodeproj -scheme CommilitiaDropMac -sdk macosx -destination 'platform=macOS' -derivedDataPath build/DD-mac -disableAutomaticPackageResolution build
|
||
|
||
# 原生数据面 macOS 冒烟(P0 闸):跑 CommilitiaDropMacTests 环回端到端测试——两个 LibWebRtcEngine
|
||
# 同进程交叉连,20MB 逐字节验证 libwebrtc macOS 切片上线协议闭环。证实原生数据面在 Mac 可用。
|
||
mac-test: mac-prep
|
||
cd ios/CDrop && xcodebuild test -project CommilitiaDrop.xcodeproj -scheme CommilitiaDropMac -sdk macosx -destination 'platform=macOS' -derivedDataPath build/DD-mac -disableAutomaticPackageResolution
|
||
|
||
# 真机构建 + 装机(自动 provisioning,经 ASC API Key)。必须把
|
||
# CDROP_APPLE_DEVELOPMENT_IDENTITY 设为钥匙串内既有 Apple Development 证书的 SHA-1;构建前
|
||
# 先验证该身份存在,再将其固定传给 xcodebuild,不允许以“自动签名”为由切换或新建证书。
|
||
# -allowProvisioningUpdates 只用于登记设备、更新能力与 profile。模拟器构建不需这些。
|
||
# 用法:just ios-device <设备UDID>(UDID 见 just ios-devices)。全程不使用 Xcode GUI。
|
||
ios-device udid:
|
||
[ -n "$CDROP_TEAM_ID" ] && [ -n "$CDROP_ASC_KEY_PATH" ] && [ -n "$CDROP_ASC_KEY_ID" ] && [ -n "$CDROP_ASC_ISSUER_ID" ] && [ -n "$CDROP_APPLE_DEVELOPMENT_IDENTITY" ] || { echo "缺 .env(CDROP_TEAM_ID / CDROP_ASC_KEY_PATH / CDROP_ASC_KEY_ID / CDROP_ASC_ISSUER_ID / CDROP_APPLE_DEVELOPMENT_IDENTITY)——见 ios/CDrop/REALDEVICE.md"; exit 1; }
|
||
security find-identity -v -p codesigning | rg -F "$CDROP_APPLE_DEVELOPMENT_IDENTITY"
|
||
just ios-fonts
|
||
cd ios/CDrop && xcodegen generate
|
||
cd ios/CDrop && xcodebuild -project CommilitiaDrop.xcodeproj -scheme CommilitiaDrop -configuration Debug -destination "platform=iOS,id={{udid}}" -derivedDataPath build/DD-device -allowProvisioningUpdates -authenticationKeyPath "$CDROP_ASC_KEY_PATH" -authenticationKeyID "$CDROP_ASC_KEY_ID" -authenticationKeyIssuerID "$CDROP_ASC_ISSUER_ID" DEVELOPMENT_TEAM="$CDROP_TEAM_ID" CODE_SIGN_STYLE=Automatic CODE_SIGN_IDENTITY="$CDROP_APPLE_DEVELOPMENT_IDENTITY" build
|
||
xcrun devicectl device install app --device {{udid}} ios/CDrop/build/DD-device/Build/Products/Debug-iphoneos/CommilitiaDrop.app
|
||
|
||
# ---- deploy plumbing ----
|
||
|
||
# 一次性预热:把 Go modules + node_modules 烤进 cdrop-base:latest。
|
||
# 仅 go.mod/go.sum 或 web/package*.json 改动时需要重跑。
|
||
# 用宿主原生 arch(macOS arm64 → linux/arm64),让 BUILDPLATFORM 跨编译走原生。
|
||
docker-base:
|
||
docker buildx build -f docker/Dockerfile.base -t cdrop-base:latest --load .
|
||
|
||
# 应用镜像:从 cdrop-base 起步只编译源码,最终落 linux/amd64 distroless。
|
||
# dev mode 部署时 export VITE_CDROP_DEV_TOKEN=<同后端 token> 把它烤进前端 bundle。
|
||
docker-image:
|
||
docker buildx build --platform linux/amd64 \
|
||
--build-arg VITE_CDROP_DEV_TOKEN="${VITE_CDROP_DEV_TOKEN:-}" \
|
||
--build-arg VITE_CDROP_STUN_URLS="${VITE_CDROP_STUN_URLS:-}" \
|
||
-f docker/Dockerfile -t cdrop:latest --load .
|