Files

173 lines
10 KiB
Makefile
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 .appdarwin/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 "缺 .envCDROP_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 侧无 cgodarwin 的
# NSStatusBar/NSPasteboard CGO 走 build tag 排除,WebView2 是纯 Go),不需 mingw。
# 与 mac 同:先手动构建前端再 -swails 自带 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
# 拉取品牌字标字体 Fredokalogo / Wordmark 用,不入库——虽为开源 OFL 仍统一从 Google Fonts 拉,
# 保持仓库精简)。幂等:已存在则跳过。ios-sim-build / ios-device 构建前已 chain 本步。前置:curl;造
# Fredoka 静态实例需 python3 + fonttoolspython3 -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 变量字体实例化出静态 SemiBoldwght=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 "缺 .envCDROP_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 改动时需要重跑。
# 用宿主原生 archmacOS 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 .