Skip to content

Commit 5cd4557

Browse files
committed
fix(tauri): isolate dev builds from polluted rust target
1 parent 25c958e commit 5cd4557

3 files changed

Lines changed: 83 additions & 3 deletions

File tree

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
"start": "node scripts/start-server.js",
1111
"start:prod": "node dist/src/server.js",
1212
"tauri": "tauri",
13-
"tauri:dev": "npm run build && npm run ensure:sidecar:dev && npm run cleanup:tauri:sidecars && npx kill-port 3000 && npx tauri dev",
14-
"tauri:dev:mini": "npm run build:mini && npm run ensure:sidecar:dev && npm run cleanup:tauri:sidecars && npx kill-port 3000 && npx tauri dev",
15-
"tauri:dev:full": "npm run build:full && npm run ensure:sidecar:dev && npm run cleanup:tauri:sidecars && npx kill-port 3000 && npx tauri dev",
13+
"tauri:dev": "npm run build && npm run ensure:sidecar:dev && npm run cleanup:tauri:sidecars && npx kill-port 3000 && node scripts/run-tauri-dev.js",
14+
"tauri:dev:mini": "npm run build:mini && npm run ensure:sidecar:dev && npm run cleanup:tauri:sidecars && npx kill-port 3000 && node scripts/run-tauri-dev.js",
15+
"tauri:dev:full": "npm run build:full && npm run ensure:sidecar:dev && npm run cleanup:tauri:sidecars && npx kill-port 3000 && node scripts/run-tauri-dev.js",
1616
"tauri:dev:gpu": "set NOTE_CONNECTION_GPU=1&& npm run tauri:dev",
1717
"tauri:dev:mini:gpu": "set NOTE_CONNECTION_GPU=1&& npm run tauri:dev:mini",
1818
"tauri:build": "npm run build && npm run build:sidecar && npm run cleanup:tauri:sidecars && node scripts/run-tauri-build.js",

scripts/run-tauri-dev.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#!/usr/bin/env node
2+
3+
const { spawnSync } = require('child_process');
4+
const path = require('path');
5+
6+
function parsePositiveInt(value, fallback) {
7+
const parsed = Number.parseInt(String(value || ''), 10);
8+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
9+
}
10+
11+
function appendRustflag(existingRustflags, flag) {
12+
const base = String(existingRustflags || '').trim();
13+
if (base.includes(flag)) {
14+
return base;
15+
}
16+
return `${base} ${flag}`.trim();
17+
}
18+
19+
function buildLowMemoryRustflags(existingRustflags) {
20+
let rustflags = String(existingRustflags || '').trim();
21+
rustflags = appendRustflag(rustflags, '-C debuginfo=0');
22+
return rustflags;
23+
}
24+
25+
function resolveDefaultTargetDir() {
26+
return path.resolve(__dirname, '..', 'src-tauri', 'target-dev-lowmem');
27+
}
28+
29+
function main() {
30+
const cargoTargetDir = String(process.env.CARGO_TARGET_DIR || '').trim() || resolveDefaultTargetDir();
31+
const cargoBuildJobs = parsePositiveInt(process.env.CARGO_BUILD_JOBS, 1);
32+
const cargoIncremental = String(process.env.CARGO_INCREMENTAL || '0');
33+
const cargoProfileDevDebug = String(process.env.CARGO_PROFILE_DEV_DEBUG || '0');
34+
const rustflags = buildLowMemoryRustflags(process.env.RUSTFLAGS);
35+
const isWindows = process.platform === 'win32';
36+
const tauriArgs = ['tauri', 'dev', ...process.argv.slice(2)];
37+
const execCommand = isWindows ? 'cmd.exe' : 'npx';
38+
const execArgs = isWindows ? ['/d', '/s', '/c', 'npx', ...tauriArgs] : tauriArgs;
39+
40+
console.log(`[Tauri Dev Runner] Cargo target dir: ${cargoTargetDir}`);
41+
console.log(`[Tauri Dev Runner] Cargo jobs: ${cargoBuildJobs}`);
42+
console.log(`[Tauri Dev Runner] Cargo incremental: ${cargoIncremental}`);
43+
console.log(`[Tauri Dev Runner] Cargo dev debug: ${cargoProfileDevDebug}`);
44+
console.log(`[Tauri Dev Runner] RUSTFLAGS: ${rustflags || '(empty)'}`);
45+
console.log(`[Tauri Dev Runner] Executing: npx ${tauriArgs.join(' ')}`);
46+
47+
const result = spawnSync(execCommand, execArgs, {
48+
stdio: 'inherit',
49+
env: {
50+
...process.env,
51+
CARGO_TARGET_DIR: cargoTargetDir,
52+
CARGO_BUILD_JOBS: String(cargoBuildJobs),
53+
CARGO_INCREMENTAL: cargoIncremental,
54+
CARGO_PROFILE_DEV_DEBUG: cargoProfileDevDebug,
55+
RUSTFLAGS: rustflags,
56+
}
57+
});
58+
59+
if (result.error) {
60+
console.error(`[Tauri Dev Runner] Failed to start command: ${result.error.message}`);
61+
}
62+
if (result.signal) {
63+
console.error(`[Tauri Dev Runner] Command terminated by signal: ${result.signal}`);
64+
}
65+
66+
process.exit(result.status === null ? 1 : result.status);
67+
}
68+
69+
main();

src/tauri.sidecar.cleanup.contract.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ describe('tauri sidecar cleanup integration', () => {
77
const cleanupScriptPath = path.join(repoRoot, 'scripts', 'cleanup-tauri-sidecars.js');
88
const sidecarEnsureScriptPath = path.join(repoRoot, 'scripts', 'ensure-sidecar-ready.js');
99
const tauriBuildRunnerPath = path.join(repoRoot, 'scripts', 'run-tauri-build.js');
10+
const tauriDevRunnerPath = path.join(repoRoot, 'scripts', 'run-tauri-dev.js');
1011
const tauriRunnerPath = path.join(repoRoot, 'scripts', 'run-tauri-tests.js');
1112

1213
test('desktop tauri scripts run stale sidecar cleanup before cargo build flow', () => {
@@ -19,6 +20,8 @@ describe('tauri sidecar cleanup integration', () => {
1920
expect(pkg.scripts['tauri:dev:mini']).toContain('npm run cleanup:tauri:sidecars');
2021
expect(pkg.scripts['tauri:dev']).toContain('npm run ensure:sidecar:dev');
2122
expect(pkg.scripts['tauri:dev:mini']).toContain('npm run ensure:sidecar:dev');
23+
expect(pkg.scripts['tauri:dev']).toContain('node scripts/run-tauri-dev.js');
24+
expect(pkg.scripts['tauri:dev:mini']).toContain('node scripts/run-tauri-dev.js');
2225
expect(pkg.scripts['tauri:build']).toContain('npm run cleanup:tauri:sidecars');
2326
expect(pkg.scripts['tauri:build:mini']).toContain('npm run cleanup:tauri:sidecars');
2427
expect(pkg.scripts['tauri:build']).toContain('node scripts/run-tauri-build.js');
@@ -35,6 +38,14 @@ describe('tauri sidecar cleanup integration', () => {
3538
expect(tauriBuildRunner).toContain('CARGO_PROFILE_RELEASE_CODEGEN_UNITS');
3639
expect(tauriBuildRunner).toContain("['tauri', 'build', '--ci'");
3740

41+
const tauriDevRunner = fs.readFileSync(tauriDevRunnerPath, 'utf8');
42+
expect(tauriDevRunner).toContain('CARGO_TARGET_DIR');
43+
expect(tauriDevRunner).toContain('target-dev-lowmem');
44+
expect(tauriDevRunner).toContain('CARGO_BUILD_JOBS');
45+
expect(tauriDevRunner).toContain('CARGO_PROFILE_DEV_DEBUG');
46+
expect(tauriDevRunner).toContain('CARGO_INCREMENTAL');
47+
expect(tauriDevRunner).toContain("['tauri', 'dev'");
48+
3849
const sidecarEnsureScript = fs.readFileSync(sidecarEnsureScriptPath, 'utf8');
3950
expect(sidecarEnsureScript).toContain('Sidecar binaries are valid and up-to-date');
4051
expect(sidecarEnsureScript).toContain("runNodeScript('build-sidecar.js')");

0 commit comments

Comments
 (0)