hn-readcard-go/一键打包.sh

118 lines
3.9 KiB
Bash
Raw Normal View History

2026-08-06 11:23:33 +08:00
#!/usr/bin/env bash
set -euo pipefail
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
BUILD_VERSION="1.0.1"
MIN_GO_MAJOR=1
MIN_GO_MINOR=22
DIST_DIR="$PROJECT_DIR/dist"
VENDOR_SOURCE="$PROJECT_DIR/../card-read-service/package/DWCardReaderDLL"
VENDOR_DLL="$VENDOR_SOURCE/CardReaderDLL.dll"
cd "$PROJECT_DIR"
fail() {
printf '\n[ERROR] %s\n' "$1" >&2
exit 1
}
printf '%s\n' "========================================"
printf '%s\n' "Checking readcard-go packaging environment..."
printf 'Version: %s\n' "$BUILD_VERSION"
printf '%s\n\n' "========================================"
command -v go >/dev/null 2>&1 || fail \
"Go was not found in PATH. Install Go $MIN_GO_MAJOR.$MIN_GO_MINOR or later from https://go.dev/dl/"
GO_VERSION_RAW="$(go env GOVERSION 2>/dev/null || true)"
case "$GO_VERSION_RAW" in
go[0-9]*.[0-9]*) ;;
*) fail "Unable to parse the installed Go version: ${GO_VERSION_RAW:-unknown}" ;;
esac
GO_VERSION="${GO_VERSION_RAW#go}"
GO_MAJOR="${GO_VERSION%%.*}"
GO_REMAINDER="${GO_VERSION#*.}"
GO_MINOR="${GO_REMAINDER%%.*}"
case "$GO_MAJOR:$GO_MINOR" in
*[!0-9:]*|:*|*:) fail "Unable to parse the installed Go version: $GO_VERSION_RAW" ;;
esac
if [ "$GO_MAJOR" -lt "$MIN_GO_MAJOR" ] || \
{ [ "$GO_MAJOR" -eq "$MIN_GO_MAJOR" ] && [ "$GO_MINOR" -lt "$MIN_GO_MINOR" ]; }; then
fail "Go $GO_VERSION_RAW is too old. Install Go $MIN_GO_MAJOR.$MIN_GO_MINOR or later from https://go.dev/dl/"
fi
printf '[OK] Go: %s\n' "$GO_VERSION_RAW"
if ! go tool dist list 2>/dev/null | grep -x "windows/386" >/dev/null; then
fail "The installed Go toolchain does not support windows/386."
fi
printf '%s\n' "[OK] Go target: windows/386"
[ -f "$PROJECT_DIR/go.mod" ] || fail "Missing Go module file: $PROJECT_DIR/go.mod"
printf '%s\n' "[OK] Go module file"
[ -f "$PROJECT_DIR/config.json" ] || fail "Missing configuration file: $PROJECT_DIR/config.json"
printf '%s\n' "[OK] Configuration file"
2026-08-12 13:40:06 +08:00
[ -f "$PROJECT_DIR/readcard-go.exe.manifest" ] || fail \
"Missing Windows application manifest: $PROJECT_DIR/readcard-go.exe.manifest"
printf '%s\n' "[OK] Windows application manifest"
[ -f "$PROJECT_DIR/rsrc_windows_386.syso" ] || fail \
"Missing embedded Windows resource: $PROJECT_DIR/rsrc_windows_386.syso"
printf '%s\n' "[OK] Embedded Windows resource"
2026-08-06 11:23:33 +08:00
[ -f "$VENDOR_DLL" ] || fail \
"Vendor DLL was not found: $VENDOR_DLL. Restore card-read-service/package/DWCardReaderDLL before packaging."
printf '%s\n' "[OK] Vendor DLL package"
if [ "${1:-}" = "--check" ]; then
printf '\n%s\n' "Environment check passed."
exit 0
fi
TMP_BUILD_DIR="$(mktemp -d "${TMPDIR:-/tmp}/readcard-go-build.XXXXXX")"
cleanup() {
rm -rf -- "$TMP_BUILD_DIR"
}
trap cleanup EXIT INT TERM
printf '\n%s\n\n' "Environment check passed. Packaging readcard-go, please wait..."
printf '%s\n' "Compiling Windows x86 tests..."
GOOS=windows GOARCH=386 CGO_ENABLED=0 \
go test -c -buildvcs=false -o "$TMP_BUILD_DIR/readcard-go.test.exe" .
printf '%s\n' "Building Windows x86 executable..."
GOOS=windows GOARCH=386 CGO_ENABLED=0 \
go build \
-buildvcs=false \
-trimpath \
2026-08-12 13:40:06 +08:00
-ldflags "-s -w -H windowsgui -X main.version=$BUILD_VERSION" \
2026-08-06 11:23:33 +08:00
-o "$TMP_BUILD_DIR/readcard-go.exe" \
.
mkdir -p "$DIST_DIR/package"
cp "$TMP_BUILD_DIR/readcard-go.exe" "$DIST_DIR/readcard-go.exe"
cp "$PROJECT_DIR/config.json" "$DIST_DIR/config.json"
cp -R "$VENDOR_SOURCE" "$TMP_BUILD_DIR/DWCardReaderDLL"
VENDOR_TARGET="$DIST_DIR/package/DWCardReaderDLL"
case "$VENDOR_TARGET" in
"$DIST_DIR"/*) ;;
*) fail "Unexpected vendor target path: $VENDOR_TARGET" ;;
esac
rm -rf -- "$VENDOR_TARGET"
mv "$TMP_BUILD_DIR/DWCardReaderDLL" "$VENDOR_TARGET"
printf '\n%s\n' "========================================"
printf '%s\n' "Packaging completed successfully."
printf 'Output directory: %s\n' "$DIST_DIR"
printf '%s\n' "========================================"
if [ "$(uname -s)" = "Darwin" ] && command -v open >/dev/null 2>&1; then
open "$DIST_DIR" >/dev/null 2>&1 || true
fi