A:增加打包时自动将指定文件复制到目标文件夹

U:可通过目录完成 cmd 命令调用
This commit is contained in:
jimmy committed 2025-06-18 21:44:57 +08:00
1 parent a345134e04
commit cf48204070
2 files changed
+109 -5

No files matched your search

+12 -5
View File
@@ -3,10 +3,12 @@ package utils
import ( import (
"bytes" "bytes"
"context" "context"
"encoding/json"
"fmt" "fmt"
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"rear/pkg/logger"
"runtime" "runtime"
"sync" "sync"
"time" "time"
@@ -76,8 +78,9 @@ func detectTools() error {
// findTool 查找工具 // findTool 查找工具
func findTool(name string, execDir string) string { func findTool(name string, execDir string) string {
// Windows 下添加 .exe 后缀 // Windows 下添加 .exe 后缀
exeName := name
if runtime.GOOS == "windows" { if runtime.GOOS == "windows" {
name = name + ".exe" exeName = name + ".exe"
} }
// 查找顺序: // 查找顺序:
@@ -87,10 +90,14 @@ func findTool(name string, execDir string) string {
// 4. 系统 PATH // 4. 系统 PATH
searchPaths := []string{ searchPaths := []string{
filepath.Join(execDir, name), filepath.Join(execDir, exeName),
filepath.Join(execDir, "bin", name), filepath.Join(execDir, "bin", exeName),
filepath.Join(execDir, "tools", name), filepath.Join(execDir, "tools", exeName),
filepath.Join(execDir, "tools", name, exeName),
} }
jsonBytes, _ := json.Marshal(searchPaths)
msg := string(jsonBytes)
logger.Warn(msg)
for _, path := range searchPaths { for _, path := range searchPaths {
if _, err := os.Stat(path); err == nil { if _, err := os.Stat(path); err == nil {
@@ -99,7 +106,7 @@ func findTool(name string, execDir string) string {
} }
// 尝试从 PATH 中查找 // 尝试从 PATH 中查找
if path, err := exec.LookPath(name); err == nil { if path, err := exec.LookPath(exeName); err == nil {
return path return path
} }
+97
View File
@@ -2,11 +2,15 @@ package main
import ( import (
"context" "context"
"embed"
"errors" "errors"
"fmt"
"io"
"log" "log"
"net/http" "net/http"
"os" "os"
"os/signal" "os/signal"
"path/filepath"
"rear/internal/config" "rear/internal/config"
"rear/internal/container" "rear/internal/container"
"rear/internal/db" "rear/internal/db"
@@ -22,6 +26,9 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
//go:embed tools/windows_amd64/exiftool/*
var exiftoolFS embed.FS
func main() { func main() {
// 日志初始化 // 日志初始化
err := logger.InitDefaultLogger() err := logger.InitDefaultLogger()
@@ -45,6 +52,21 @@ func main() {
// 初始化基础服务(启动写操作处理协程) // 初始化基础服务(启动写操作处理协程)
repositories.InitBaseService() repositories.InitBaseService()
// 创建运行目录
execPath, err := os.Executable()
execDir := filepath.Dir(execPath)
// 将 CLI 放到到运行目录
join := filepath.Join(execDir, "tools", "exiftool")
srcDir := `.\tools\windows_amd64\exiftool\exiftool` // 源目录
//destDir := `.\build\tools\exiftool` // 目标目录
// 复制整个目录
if err := copyDirectory(srcDir, join); err != nil {
fmt.Printf("复制失败: %v\n", err)
return
}
// 初始化外部(CLI)工具管理 // 初始化外部(CLI)工具管理
// utils.EnsureInitialized() // utils.EnsureInitialized()
@@ -123,3 +145,78 @@ func startHttp(con *container.Container) {
logger.Info("Server exited") logger.Info("Server exited")
} }
func copyDirectory(src, dest string) error {
// 获取源目录信息
srcInfo, err := os.Stat(src)
if err != nil {
return fmt.Errorf("源目录不存在: %s, 错误: %v", src, err)
}
// 创建目标目录
if err := os.MkdirAll(dest, srcInfo.Mode()); err != nil {
return fmt.Errorf("创建目标目录失败: %v", err)
}
// 读取源目录内容
entries, err := os.ReadDir(src)
if err != nil {
return fmt.Errorf("读取源目录失败: %v", err)
}
// 遍历并复制每个文件/目录
for _, entry := range entries {
srcPath := filepath.Join(src, entry.Name())
destPath := filepath.Join(dest, entry.Name())
if entry.IsDir() {
// 递归复制子目录
if err := copyDirectory(srcPath, destPath); err != nil {
return err
}
} else {
// 复制文件
if err := copyFile(srcPath, destPath); err != nil {
return err
}
}
}
return nil
}
func copyFile(src, dest string) error {
// 打开源文件
srcFile, err := os.Open(src)
if err != nil {
return err
}
defer srcFile.Close()
// 获取源文件信息
srcInfo, err := srcFile.Stat()
if err != nil {
return err
}
// 确保目标目录存在
if err := os.MkdirAll(filepath.Dir(dest), 0755); err != nil {
return err
}
// 创建目标文件
destFile, err := os.Create(dest)
if err != nil {
return err
}
defer destFile.Close()
// 复制文件内容
if _, err := io.Copy(destFile, srcFile); err != nil {
return err
}
// 设置文件权限
return os.Chmod(dest, srcInfo.Mode())
}