提交 1afb9691 编写于 作者: chai2010's avatar chai2010

config: 支持 vfs 参数

上级 2ca544e3
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
package config package config
import ( import (
"io/fs"
"os" "os"
"runtime" "runtime"
) )
...@@ -15,6 +16,7 @@ type StdSizes struct { ...@@ -15,6 +16,7 @@ type StdSizes struct {
// 通用配置信息 // 通用配置信息
type Config struct { type Config struct {
VFS fs.FS // 虚拟文件系统, 为空时从本地文件系统读取
WaRoot string // 凹 程序根目录, src 目录下是包代码 WaRoot string // 凹 程序根目录, src 目录下是包代码
WaArch string // 目标 CPU WaArch string // 目标 CPU
WaOS string // 目标 OS WaOS string // 目标 OS
......
...@@ -55,70 +55,38 @@ func (p *Manifest) Clone() *Manifest { ...@@ -55,70 +55,38 @@ func (p *Manifest) Clone() *Manifest {
} }
// 加载 WaModFile 文件 // 加载 WaModFile 文件
func LoadManifest(appPath string) (*Manifest, error) { // 如果 vfs 为空则从本地文件系统读取
workDir := appPath func LoadManifest(vfs fs.FS, appPath string) (p *Manifest, err error) {
if workDir == "" { if appPath == "" {
wd, err := os.Getwd() return nil, fmt.Errorf("loader.LoadManifest: appPath is empty")
if err != nil {
return nil, fmt.Errorf("loader.LoadManifest: workDir is empty")
}
workDir = wd
} }
// 查找 WaModFile 路径 // 查找 WaModFile 路径
kManifestPath, err := findManifestPath(nil, workDir) kManifestPath, err := findManifestPath(vfs, appPath)
if err != nil { if err != nil {
return nil, fmt.Errorf("loader.LoadManifest: find '%s' failed : %w", WaModFile, err) return nil, fmt.Errorf("loader.LoadManifest: find '%s' failed : %w", WaModFile, err)
} }
// 读取 WaModFile 文件 // 读取 WaModFile 文件
data, err := os.ReadFile(kManifestPath) var data []byte
if vfs != nil {
data, err = fs.ReadFile(vfs, kManifestPath)
} else {
data, err = os.ReadFile(kManifestPath)
}
if err != nil { if err != nil {
return nil, fmt.Errorf("loader.LoadManifest: read %s failed: %w", kManifestPath, err) return nil, fmt.Errorf("loader.LoadManifest: read %s failed: %w", kManifestPath, err)
} }
// 解码 JSON // 解码 JSON
p := new(Manifest) p = new(Manifest)
if err := json.Unmarshal(data, &p.Pkg); err != nil { if err := json.Unmarshal(data, &p.Pkg); err != nil {
return nil, fmt.Errorf("loader.LoadManifest: json.Unmarshal %s failed: %w", kManifestPath, err) return nil, fmt.Errorf("loader.LoadManifest: json.Unmarshal %s failed: %w", kManifestPath, err)
} }
// 当前 app 默认目录 // 当前 app 默认目录
p.Root = filepath.Dir(kManifestPath) p.Root = filepath.Dir(kManifestPath)
p.MainPkg, _ = filepath.Rel(p.Root, workDir) p.MainPkg, _ = filepath.Rel(p.Root, appPath)
if p.MainPkg == "" || p.MainPkg == "." {
p.MainPkg = p.Pkg.Pkgpath
}
return p, nil
}
// 从 vfs 加载 WaModFile 文件
func LoadManifestVFS(vfs fs.FS, appPath string) (*Manifest, error) {
workDir := appPath
// 查找 WaModFile 路径
kManifestPath, err := findManifestPath(vfs, workDir)
if err != nil {
return nil, fmt.Errorf("loader.LoadManifestVFS: find '%s' failed : %w", WaModFile, err)
}
// 读取 WaModFile 文件
data, err := fs.ReadFile(vfs, kManifestPath)
if err != nil {
return nil, fmt.Errorf("loader.LoadManifestVFS: read %s failed: %w", kManifestPath, err)
}
// 解码 JSON
p := new(Manifest)
if err := json.Unmarshal(data, &p.Pkg); err != nil {
return nil, fmt.Errorf("loader.LoadManifestVFS: json.Unmarshal %s failed: %w", kManifestPath, err)
}
// 当前 app 默认目录
p.Root = filepath.Dir(kManifestPath)
p.MainPkg, _ = filepath.Rel(p.Root, workDir)
if p.MainPkg == "" || p.MainPkg == "." { if p.MainPkg == "" || p.MainPkg == "." {
p.MainPkg = p.Pkg.Pkgpath p.MainPkg = p.Pkg.Pkgpath
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册