mirror of
https://gitcode.com/JianFeeeee/homeagent-sdk.git
synced 2026-10-15 12:15:11 +00:00
SDK 仓已迁到 GitHub 作为权威源,go module 路径同步: `gitcode.com/JianFeeeee/homeagent-sdk` → `github.com/JianFeeeee/homeagentsdk` ## 范围 74 个文件:71 个 Go 源码 + go.mod/go.sum + hmapdev 模板 + CI 与打包脚本。 主仓(HomeAgent)侧对应改动是 6d38a164。本仓这些文件当时**不在工作树上** (见下),所以那次的批量替换扫不到它们——这里是补偿。 ## 为何这批文件当时不在工作树上(事故与恢复) 10-08 07:58 主仓做 checkout/cherry-pick 序列时,把本仓工作树的 20 个文件 误清理了(`example/*/plugin.go` + `plg.json`,10 个示例)。 根因是**结构误判**:本仓是「一目录两仓库」结构下主仓 `third_party/` 里的 **独立 git 仓库**,而主仓 .gitignore 忽略了 `example/`,于是它在主仓 `git status` 里不可见 —— 看着像「不受跟踪的构建产物」,实际是本仓受跟踪的源码。 已全部恢复(`git checkout -- <D 文件>`,只恢复删除、不动迁移改动), 20 个文件与 HEAD 逐字节一致。 **破坏的连锁后果**:恢复出来的 `plugin.go` 仍写着旧 module 路径, 因为迁移时它们已不在工作树上。所以这次补偿是必须的,不是可选优化。 ## 保留 gitcode 引用 以下位置的 `gitcode` **有意保留**,不要"顺手清掉": - README.md / docs 里「二进制实际分发地址目前是 gitcode」的说明 - mkdocs.yml 的 gitcode 镜像链接(国内直连更快) - `tools/hmapdev/templates.go` 里「SDK 已从 gitcode 迁到 GitHub」的注释 gitcode 仍是**只读镜像**(源码同步;release 附件暂时仍在那边)。 ## 验证 - 本仓根 module:`go build ./...` + `go test ./...` 全通过 - 全部 20 个 example:`go vet` 通过(补偿前 10 个因旧 module 路径失败) - example/qq:`go test` 通过,且能从源码 build 出可用 plugin 产物
109 lines
4.3 KiB
Bash
Executable File
109 lines
4.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
|
||
PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||
BUILD_DIR="${PROJECT_ROOT}/build"
|
||
VERSION="${VERSION:-$(git -C "$PROJECT_ROOT" describe --tags --dirty 2>/dev/null || echo "0.7.1")}"
|
||
GO="${GO:-$(command -v go 2>/dev/null || echo "/home/jianf/go1.26.5/go/bin/go")}"
|
||
# 宿主平台必须在**本脚本 export GOOS/GOARCH 之前**取定。
|
||
# 否则 `go env GOOS` 会返回被 export 的目标平台(此前 `build.sh all all`
|
||
# 就是因此拿 darwin 二进制在 linux 上跑,报 cannot execute binary file)。
|
||
NATIVE_GOOS="$(env -u GOOS -u GOARCH "$GO" env GOOS 2>/dev/null || uname -s | tr 'A-Z' 'a-z')"
|
||
NATIVE_GOARCH="$(env -u GOOS -u GOARCH "$GO" env GOARCH 2>/dev/null || uname -m)"
|
||
case "$NATIVE_GOARCH" in x86_64|amd64) NATIVE_GOARCH="amd64" ;; aarch64|arm64) NATIVE_GOARCH="arm64" ;; esac
|
||
case "$NATIVE_GOOS" in darwin|linux|windows) ;; *) NATIVE_GOOS="linux" ;; esac
|
||
GOCACHE="${GOCACHE:-}"
|
||
GOPATH="${GOPATH:-}"
|
||
|
||
TARGET="${1:-native}"
|
||
COMPONENT="${2:-all}"
|
||
|
||
case "$TARGET" in
|
||
native) GOOS="" GOARCH="" ;;
|
||
linux/amd64) GOOS=linux GOARCH=amd64 ;;
|
||
linux/arm64) GOOS=linux GOARCH=arm64 ;;
|
||
darwin/amd64) GOOS=darwin GOARCH=amd64 ;;
|
||
darwin/arm64) GOOS=darwin GOARCH=arm64 ;;
|
||
windows/amd64) GOOS=windows GOARCH=amd64 ;;
|
||
all)
|
||
"$0" linux/amd64 "$COMPONENT"
|
||
"$0" linux/arm64 "$COMPONENT"
|
||
"$0" darwin/amd64 "$COMPONENT"
|
||
"$0" darwin/arm64 "$COMPONENT"
|
||
"$0" windows/amd64 "$COMPONENT"
|
||
exit 0
|
||
;;
|
||
*)
|
||
echo "Unknown target: $TARGET"
|
||
echo "Usage: $0 [native|linux/amd64|linux/arm64|darwin/amd64|darwin/arm64|windows/amd64|all] [all|hmapdev|examples]"
|
||
exit 1
|
||
esac
|
||
|
||
if [ -n "${GOOS:-}" ]; then
|
||
SUFFIX="${GOOS}_${GOARCH}"
|
||
export GOOS GOARCH
|
||
fi
|
||
export CGO_ENABLED=0
|
||
[ -n "$GOCACHE" ] && export GOCACHE
|
||
[ -n "$GOPATH" ] && export GOPATH
|
||
|
||
mkdir -p "$BUILD_DIR"
|
||
|
||
build_hmapdev() {
|
||
local src="tools/hmapdev"
|
||
local out="$BUILD_DIR/hmapdev${SUFFIX:+_$SUFFIX}"
|
||
if [ "$GOOS" = "windows" ]; then out="${out}.exe"; fi
|
||
|
||
echo "[BUILD] hmapdev ${GOOS:-linux}/${GOARCH:-amd64} → $out"
|
||
cd "$PROJECT_ROOT/$src"
|
||
"$GO" build -trimpath -ldflags "-X github.com/JianFeeeee/homeagentsdk/meta.Version=${VERSION}" \
|
||
-o "$out" .
|
||
echo " OK ($(du -h "$out" | cut -f1))"
|
||
cd "$PROJECT_ROOT"
|
||
}
|
||
|
||
# 示例插件产物随 SDK 一起发。
|
||
#
|
||
# 为什么必须发:插件二进制与内核是**协议绑定**的(ProtocolVersion + 统一共享
|
||
# 内存区魔数)。SDK 升版常伴随协议变化,只发工具链不发示例产物,使用者很可能
|
||
# 拿旧产物去装,表现是握手失败(魔数不匹配)——看起来像「插件坏了」而不是
|
||
# 「版本不配套」。
|
||
#
|
||
# 用**宿主可执行**的那把工具链(而非 PATH 里的),保证产物与本次发版同源。
|
||
#
|
||
# 为什么不能用目标平台的那把:示例的跨平台构建是由 hmapdev 的 `--target GOOS/GOARCH`
|
||
# 完成的,被执行的进程本身必須能在当前机器上跑。拿目标平台的二进制去跑只会得到
|
||
# “cannot execute binary file: Exec format error”(`build.sh all all` 在 darwin 处断过)。
|
||
build_examples() {
|
||
local dev
|
||
dev="$BUILD_DIR/hmapdev_${NATIVE_GOOS}_${NATIVE_GOARCH}"
|
||
[ "$NATIVE_GOOS" = "windows" ] && dev="${dev}.exe"
|
||
# 宿主工具链缺失时先补建(`all` 的第一个目标可能不是宿主平台)。
|
||
if [ ! -x "$dev" ]; then
|
||
echo "[BUILD] 先补建宿主工具链 ${NATIVE_GOOS}/${NATIVE_GOARCH}(示例的跨平台由 --target 完成)"
|
||
( unset GOOS GOARCH; bash "$0" "${NATIVE_GOOS}/${NATIVE_GOARCH}" hmapdev ) || return 1
|
||
fi
|
||
if [ ! -x "$dev" ]; then
|
||
echo "[BUILD] 无法构建示例:缺少宿主可执行的工具链 $dev" >&2
|
||
echo " 先跑: $0 ${NATIVE_GOOS}/${NATIVE_GOARCH} hmapdev" >&2
|
||
return 1
|
||
fi
|
||
echo "[BUILD] example plugins ${GOOS:-linux}/${GOARCH:-amd64} → $BUILD_DIR/examples(用 ${NATIVE_GOOS}/${NATIVE_GOARCH} 的工具链交叉构建)"
|
||
PLUGINDEV="$dev" VERSION="$VERSION" bash "$PROJECT_ROOT/package/build-examples.sh" "$TARGET" "$BUILD_DIR/examples"
|
||
echo " OK"
|
||
}
|
||
|
||
case "$COMPONENT" in
|
||
all)
|
||
# 工具链必须先建完:示例用它来构建(同源保证协议一致)。
|
||
build_hmapdev
|
||
build_examples
|
||
;;
|
||
hmapdev) build_hmapdev ;;
|
||
examples) build_examples ;;
|
||
*)
|
||
echo "Unknown component: $COMPONENT"
|
||
exit 1
|
||
;;
|
||
esac
|