返回博客

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.tomlsrc-tauri/ 文件夹(即 tauri-dir),再从那里读 tauri.conf.json
  • --config <PATH> 参数:直接相对于当前工作目录 (CWD) 解析,不经过 tauri-dir 这一层。

当 CWD 是 desktop/(通过 spawnSynccwdnpm --prefix desktop),Tauri 去找 desktop/tauri.conf.lan.c1.json——而文件在 desktop/src-tauri/tauri.conf.lan.c1.json,路径差了一段 src-tauri/,自然 ENOENT。

坑:--config 不跟着 tauri.conf.json 走,跟着 CWD 走

tauri build --config X.json 里的 X.json 是相对 CWD 的路径,不是相对 src-tauri/ 的路径。tauri.conf.json 能被自动找到,是因为 Tauri 做了目录扫描;--config 参数不做扫描,只做字面路径拼接。

npm --prefix desktop run taurispawnSync(..., { 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'),
})
正解:路径加上 src-tauri/ 前缀,或改用绝对路径

渲染脚本打印的「下一步」提示如果写了 --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 时,永远显式写完整的相对路径或绝对路径。