fix(local-tool): flash 模型檔案找不到 — 相對路徑未解析

根因:models.json 的 filePath 是相對路徑("data/nef/kl520/xxx.nef"),
但 server working directory 是 {app}\bin\(app.go 設 cmd.Dir = binary 目錄),
所以 server 在 {app}\bin\data\nef\ 找 .nef 檔,找不到。

實際位置:{app}\data\nef\(installer 裝的位置),對應 server 的 --data-dir
由 Wails app 傳入的 %APPDATA%\visiona-local(或 fallback 到 <exe>/../data)。

修法:
- flash.NewService 新增 dataDir 參數
- StartFlash 中把相對 filePath 用 dataDir 拼接成絕對路徑:
  "data/nef/..." → 去掉 "data/" 前綴 → dataDir + "/nef/..."
- main.go 傳 dataDir 給 flash.NewService

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
jim800121chen 2026-04-12 22:03:28 +08:00
parent c24a04cdb2
commit aa324cef42
2 changed files with 16 additions and 2 deletions

View File

@ -66,13 +66,15 @@ func resolveModelPath(filePath string, deviceType string) string {
type Service struct { type Service struct {
deviceMgr *device.Manager deviceMgr *device.Manager
modelRepo *model.Repository modelRepo *model.Repository
dataDir string
tracker *ProgressTracker tracker *ProgressTracker
} }
func NewService(deviceMgr *device.Manager, modelRepo *model.Repository) *Service { func NewService(deviceMgr *device.Manager, modelRepo *model.Repository, dataDir string) *Service {
return &Service{ return &Service{
deviceMgr: deviceMgr, deviceMgr: deviceMgr,
modelRepo: modelRepo, modelRepo: modelRepo,
dataDir: dataDir,
tracker: NewProgressTracker(), tracker: NewProgressTracker(),
} }
} }
@ -106,6 +108,18 @@ func (s *Service) StartFlash(deviceID, modelID string) (string, <-chan driver.Fl
return "", nil, fmt.Errorf("model %s has no .nef file path", modelID) return "", nil, fmt.Errorf("model %s has no .nef file path", modelID)
} }
// models.json 的 filePath 是相對路徑(例如 "data/nef/kl520/xxx.nef")。
// 如果不是絕對路徑,用 dataDir 解析:
// "data/nef/..." → 去掉 "data/" 前綴 → dataDir + "/nef/..."
// 其他相對路徑 → dataDir + "/" + filePath
if !filepath.IsAbs(modelPath) {
if strings.HasPrefix(modelPath, "data/") || strings.HasPrefix(modelPath, "data\\") {
modelPath = filepath.Join(s.dataDir, modelPath[len("data/"):])
} else {
modelPath = filepath.Join(s.dataDir, modelPath)
}
}
modelPath = resolveModelPath(modelPath, deviceInfo.Type) modelPath = resolveModelPath(modelPath, deviceInfo.Type)
taskID := fmt.Sprintf("flash-%s-%s", deviceID, modelID) taskID := fmt.Sprintf("flash-%s-%s", deviceID, modelID)

View File

@ -139,7 +139,7 @@ func main() {
cameraMgr := camera.NewManager(cfg.MockCamera) cameraMgr := camera.NewManager(cfg.MockCamera)
// Initialize services // Initialize services
flashSvc := flash.NewService(deviceMgr, modelRepo) flashSvc := flash.NewService(deviceMgr, modelRepo, dataDir)
inferenceSvc := inference.NewService(deviceMgr) inferenceSvc := inference.NewService(deviceMgr)
// Determine static file system for embedded frontend // Determine static file system for embedded frontend