feat: 增加win打包
This commit is contained in:
parent
c0680a6ae4
commit
dbd72287d4
|
|
@ -1,11 +0,0 @@
|
||||||
.git
|
|
||||||
.github
|
|
||||||
.trae
|
|
||||||
deploy
|
|
||||||
**/*_test.go
|
|
||||||
**/*.log
|
|
||||||
**/*.tmp
|
|
||||||
**/*.swp
|
|
||||||
**/.DS_Store
|
|
||||||
**/node_modules
|
|
||||||
**/.vscode
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
.trae
|
.trae
|
||||||
.vscode
|
.vscode
|
||||||
__debug*
|
__debug*
|
||||||
|
dist
|
||||||
43
Dockerfile
43
Dockerfile
|
|
@ -1,43 +0,0 @@
|
||||||
FROM golang:1.21-alpine AS builder
|
|
||||||
|
|
||||||
ARG APK_MIRROR=https://mirrors.aliyun.com/alpine
|
|
||||||
ARG GOPROXY=https://goproxy.cn,direct
|
|
||||||
|
|
||||||
RUN set -eux; \
|
|
||||||
printf '%s\n' \
|
|
||||||
"${APK_MIRROR}/v3.20/main" \
|
|
||||||
"${APK_MIRROR}/v3.20/community" > /etc/apk/repositories; \
|
|
||||||
apk add --no-cache ca-certificates tzdata git
|
|
||||||
|
|
||||||
WORKDIR /src
|
|
||||||
|
|
||||||
COPY go.mod go.sum ./
|
|
||||||
ENV GOPROXY=${GOPROXY}
|
|
||||||
|
|
||||||
RUN go mod download
|
|
||||||
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
RUN set -eux; \
|
|
||||||
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
|
|
||||||
go build -trimpath -ldflags="-s -w" -o /out/qr-scanner .
|
|
||||||
|
|
||||||
FROM alpine:3.20
|
|
||||||
|
|
||||||
ARG APK_MIRROR=https://mirrors.aliyun.com/alpine
|
|
||||||
|
|
||||||
RUN set -eux; \
|
|
||||||
printf '%s\n' \
|
|
||||||
"${APK_MIRROR}/v3.20/main" \
|
|
||||||
"${APK_MIRROR}/v3.20/community" > /etc/apk/repositories; \
|
|
||||||
apk add --no-cache ca-certificates tzdata; \
|
|
||||||
addgroup -S app && adduser -S -G app app
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
COPY --from=builder /out/qr-scanner /app/qr-scanner
|
|
||||||
COPY --from=builder /src/static /app/static
|
|
||||||
|
|
||||||
USER app
|
|
||||||
EXPOSE 8080
|
|
||||||
ENTRYPOINT ["/app/qr-scanner"]
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
环境变量:
|
环境变量:
|
||||||
|
|
||||||
- `QR_SCANNER_PORT`:端口(默认 8080)
|
- `QR_SCANNER_PORT`:端口(默认 8001)
|
||||||
- `QR_SCANNER_TEMP_DIR`:临时目录(默认 /tmp/qr-scanner)
|
- `QR_SCANNER_TEMP_DIR`:临时目录(默认 /tmp/qr-scanner)
|
||||||
- `QR_SCANNER_RETENTION_MINUTES`:结果保留分钟数(默认 30)
|
- `QR_SCANNER_RETENTION_MINUTES`:结果保留分钟数(默认 30)
|
||||||
- `QR_SCANNER_DEFAULT_WORKERS`:默认并发(默认 4)
|
- `QR_SCANNER_DEFAULT_WORKERS`:默认并发(默认 4)
|
||||||
|
|
@ -29,7 +29,7 @@ go run .
|
||||||
|
|
||||||
浏览器打开:
|
浏览器打开:
|
||||||
|
|
||||||
- `http://localhost:8080/`
|
- `http://localhost:8001/`
|
||||||
|
|
||||||
## API(v1.0)
|
## API(v1.0)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ type Config struct {
|
||||||
func Default() Config {
|
func Default() Config {
|
||||||
return Config{
|
return Config{
|
||||||
Host: "0.0.0.0",
|
Host: "0.0.0.0",
|
||||||
Port: 8080,
|
Port: 8001,
|
||||||
TempDir: "/tmp/qr-scanner",
|
TempDir: "/tmp/qr-scanner",
|
||||||
MaxUploadMB: 100,
|
MaxUploadMB: 100,
|
||||||
MaxFiles: 10000,
|
MaxFiles: 10000,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
cd "$ROOT_DIR"
|
||||||
|
|
||||||
|
OUT_DIR="$ROOT_DIR/dist"
|
||||||
|
mkdir -p "$OUT_DIR"
|
||||||
|
|
||||||
|
APP_NAME="qr-scanner"
|
||||||
|
OUT_EXE="$OUT_DIR/${APP_NAME}.exe"
|
||||||
|
|
||||||
|
echo "Building Windows exe -> $OUT_EXE"
|
||||||
|
|
||||||
|
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 \
|
||||||
|
go build -trimpath -ldflags "-s -w" -o "$OUT_EXE" .
|
||||||
|
|
||||||
|
echo "Done."
|
||||||
|
echo "Run on Windows: double-click ${APP_NAME}.exe (auto opens http://localhost:8001/)"
|
||||||
46
main.go
46
main.go
|
|
@ -1,8 +1,14 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"embed"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/fs"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"runtime"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
|
@ -12,6 +18,9 @@ import (
|
||||||
"qr-scanner/services"
|
"qr-scanner/services"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//go:embed static/*
|
||||||
|
var staticFS embed.FS
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
cfg := config.Default().WithEnv()
|
cfg := config.Default().WithEnv()
|
||||||
|
|
||||||
|
|
@ -35,8 +44,12 @@ func main() {
|
||||||
r.MaxMultipartMemory = cfg.MaxUploadMB * 1024 * 1024
|
r.MaxMultipartMemory = cfg.MaxUploadMB * 1024 * 1024
|
||||||
}
|
}
|
||||||
|
|
||||||
r.GET("/", func(c *gin.Context) { c.File("./static/index.html") })
|
sub, err := fs.Sub(staticFS, "static")
|
||||||
r.Static("/static", "./static")
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
r.GET("/", func(c *gin.Context) { c.Redirect(http.StatusFound, "/static/index.html") })
|
||||||
|
r.StaticFS("/static", http.FS(sub))
|
||||||
|
|
||||||
api := r.Group("/api")
|
api := r.Group("/api")
|
||||||
{
|
{
|
||||||
|
|
@ -59,7 +72,34 @@ func main() {
|
||||||
}()
|
}()
|
||||||
|
|
||||||
addr := fmt.Sprintf("%s:%d", cfg.Host, cfg.Port)
|
addr := fmt.Sprintf("%s:%d", cfg.Host, cfg.Port)
|
||||||
if err := r.Run(addr); err != nil {
|
ln, err := net.Listen("tcp", addr)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
openURL := fmt.Sprintf("http://%s:%d/", browserHost(cfg.Host), cfg.Port)
|
||||||
|
_ = openBrowser(openURL)
|
||||||
|
|
||||||
|
srv := &http.Server{Handler: r}
|
||||||
|
if err := srv.Serve(ln); err != nil && err != http.ErrServerClosed {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func browserHost(listenHost string) string {
|
||||||
|
if listenHost == "" || listenHost == "0.0.0.0" || listenHost == "::" {
|
||||||
|
return "localhost"
|
||||||
|
}
|
||||||
|
return listenHost
|
||||||
|
}
|
||||||
|
|
||||||
|
func openBrowser(url string) error {
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "windows":
|
||||||
|
return exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()
|
||||||
|
case "darwin":
|
||||||
|
return exec.Command("open", url).Start()
|
||||||
|
default:
|
||||||
|
return exec.Command("xdg-open", url).Start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue