Tauri --config 路径坑:相对于 CWD,而非 src-tauri
给桌面应用搭多租户构建流水线时,我把基础配置 tauri.conf.json 放在 desktop/src-tauri/,再用脚本动态渲染出各环境的覆盖文件 tauri.conf.lan.c1.json 到同一目录。一切看起来顺理成章——直到构建脚本跑起来就炸。
现象
构建脚本大致如下:
spawnSync('npm', ['run', 'tauri', '--', 'build', '--config', 'tauri.conf.lan.c1.json'], {
cwd: path.join(ROOT, 'desktop'),
})报错:
error: invalid value 'tauri.conf.lan.c1.json' for '--config <CONFIG>':
failed to read configuration file tauri.conf.lan.c1.json:
No such file or directory (os error 2)
去 desktop/src-tauri/ 一看,文件明明在那里。更诡异的是,基础的 tauri.conf.json 没有用 --config 却能正常被读取。直觉告诉我 --config 应该和 tauri.conf.json 住在同一个解析基准目录——但它不是。
根因
Tauri CLI 对两件事用了不同的查找策略:
- 基础
tauri.conf.json:Tauri 从 CWD 向上扫目录,找到包含Cargo.toml的src-tauri/文件夹(即 tauri-dir),再从那里读tauri.conf.json。 --config <PATH>参数:直接相对于当前工作目录 (CWD) 解析,不经过 tauri-dir 这一层。
当 CWD 是 desktop/(通过 spawnSync 的 cwd 或 npm --prefix desktop),Tauri 去找 desktop/tauri.conf.lan.c1.json——而文件在 desktop/src-tauri/tauri.conf.lan.c1.json,路径差了一段 src-tauri/,自然 ENOENT。
tauri build --config X.json 里的 X.json 是相对 CWD 的路径,不是相对 src-tauri/ 的路径。tauri.conf.json 能被自动找到,是因为 Tauri 做了目录扫描;--config 参数不做扫描,只做字面路径拼接。
用 npm --prefix desktop run tauri 或 spawnSync(..., { cwd: 'desktop' }) 时,CWD 落在 desktop/,所以你必须显式写 src-tauri/X.json。
正解
把 --config 的参数改成从 CWD 出发的正确相对路径,或者直接用绝对路径(最稳):
// 方案 A:从 cwd (desktop/) 出发,前置 src-tauri/
spawnSync('npm', ['run', 'tauri', '--', 'build', '--config', `src-tauri/${renderedConf}`], {
cwd: path.join(ROOT, 'desktop'),
})
// 方案 B:绝对路径,彻底免疫 cwd 变化
const confAbs = path.join(ROOT, 'desktop', 'src-tauri', renderedConf)
spawnSync('npm', ['run', 'tauri', '--', 'build', '--config', confAbs], {
cwd: path.join(ROOT, 'desktop'),
})渲染脚本打印的「下一步」提示如果写了 --config ../../desktop/src-tauri/X.json,同样是错的——npm --prefix desktop 把 CWD 设到 desktop/,相对路径 ../../desktop/src-tauri/ 会跑到仓库之外。同步修掉 hint 里的路径,避免下次复制粘贴再踩一次。
排查技巧
在调用 Tauri 前先打印路径验证:
echo "config arg: $CONFIG"
echo "resolved: $(realpath "$CONFIG" 2>/dev/null || echo NOT_FOUND)"如果 realpath 输出 NOT_FOUND,说明路径从当前 CWD 出发根本找不到,直接定位问题。
一句话外卖
tauri build --config <PATH>的PATH相对于 CWD,不相对于src-tauri/;用包装脚本或npm --prefix时,永远显式写完整的相对路径或绝对路径。