FIX 3 van de Windows:

1. LOAD CHAM: PyInstaller onefile 723MB giai nen toan bo vao %TEMP% moi lan chay -> chuyen ONEDIR (engine.spec COLLECT) + bundle qua Tauri resources (resource_dir/daw_engine/daw_engine.exe) thay externalBin — khoi dong tuc thi khong giai nen
2. WINDOW PICKER: Tauri v2 khong co window.__TAURI__.dialog — goi invoke('plugin:dialog|open', {options:{directory:true}}) qua __TAURI__.core.invoke
3. ICON exe: bundle.icon chuyen icon.ico -> favicon.ico + thay 3 PNG bang favicon render
- build_windows.ps1 buoc 4: copy onedir dist/daw_engine -> src-tauri/resources/daw_engine
This commit is contained in:
2026-08-09 03:30:57 +00:00
parent 466bf25a0b
commit bc8431fe81
9 changed files with 55 additions and 21 deletions
+7 -3
View File
@@ -5299,11 +5299,15 @@ const PluginManagerModal = ({ isOpen, onClose, pluginsData }) => {
setTimeout(() => { try { window.lucide.createIcons(); } catch(e) {} }, 50);
}
}, [isOpen]);
// Folder picker: Tauri dialog (desktop) nếu có; fallback: paste path.
// Folder picker: Tauri v2 dialog qua invoke (window.__TAURI__.dialog KHONG
// ton tai trong v2 plugin dialog chi co JS binding qua npm; goi truc tiep
// command 'plugin:dialog|open'). Fallback: prompt nhap path (browser).
const pickPluginFolder = async () => {
try {
if (window.__TAURI__ && window.__TAURI__.dialog) {
const sel = await window.__TAURI__.dialog.open({ directory: true, multiple: false });
if (window.__TAURI__ && window.__TAURI__.core && window.__TAURI__.core.invoke) {
const sel = await window.__TAURI__.core.invoke('plugin:dialog|open', {
options: { directory: true, multiple: false }
});
if (typeof sel === 'string' && sel) {
if (!pmDirs.includes(sel)) setPmDirs(prev => [...prev, sel]);
}
File diff suppressed because one or more lines are too long
+13 -3
View File
@@ -50,9 +50,19 @@ if ($LASTEXITCODE -ne 0) {
exit 1
}
Write-Host "== [4/6] Sidecar binary -> src-tauri/binaries (tauri triple naming) =="
New-Item -ItemType Directory -Force src-tauri\binaries | Out-Null
Copy-Item dist\daw_engine.exe src-tauri\binaries\daw_engine-x86_64-pc-windows-msvc.exe -Force
Write-Host "== [4/6] ONEDIR engine -> src-tauri/resources/daw_engine (Tauri resources) =="
# ONEDIR: copy ca thu muc dist\daw_engine\ (exe + _internal) vao resources.
# Tauri bundle resources -> resource_dir()/daw_engine/daw_engine.exe luc runtime.
if (-not (Test-Path "dist\daw_engine\daw_engine.exe")) {
Write-Host "ERROR: dist\daw_engine\daw_engine.exe khong ton tai (onedir build loi?)" -ForegroundColor Red
exit 1
}
if (Test-Path "src-tauri\resources\daw_engine") {
Remove-Item -Recurse -Force "src-tauri\resources\daw_engine"
}
New-Item -ItemType Directory -Force "src-tauri\resources\daw_engine" | Out-Null
Copy-Item "dist\daw_engine\*" "src-tauri\resources\daw_engine\" -Recurse -Force
Write-Host "Copied onedir engine -> src-tauri\resources\daw_engine"
Write-Host "== [5/6] VC++ Redistributable cho hooks.nsh =="
if (-not (Test-Path src-tauri\vc_redist.x64.exe)) {
+12 -3
View File
@@ -112,10 +112,8 @@ pyz = PYZ(a.pure, a.zipped_data, cipher=None)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
exclude_binaries=True,
name='daw_engine',
debug=False,
bootloader_ignore_signals=False,
@@ -128,3 +126,14 @@ exe = EXE(
# sinh boi tools/gen_favicon_ico.py). Cung nguon voi icon hien thi trong app.
icon='src-tauri/icons/favicon.ico',
)
# ONEDIR (khong phai onefile): exe 700MB+ onefile phai giai nen toan bo vao
# %TEMP% moi lan chay -> load RAT CHAM tren Windows. Onedir chay truc tiep tu
# thu muc (bundle qua Tauri resources), khoi dong gan nhu tuc thi.
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
name='daw_engine',
)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1009 B

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 B

After

Width:  |  Height:  |  Size: 2.2 KiB

+15 -7
View File
@@ -12,15 +12,23 @@ pub fn run() {
.plugin(tauri_plugin_shell::init())
.plugin(tauri_plugin_dialog::init())
.setup(|app| {
// 1. Spawn sidecar daw_engine.exe (PyInstaller bundle)
let sidecar_command = app
.shell()
.sidecar("daw_engine")
.expect("sidecar daw_engine not found — run build_windows.ps1 first");
let (_rx, child) = sidecar_command
// 1. Spawn daw_engine (PyInstaller ONEDIR bundle — khong giai nen
// moi lan chay nhu onefile, khoi dong nhanh). Bundle qua Tauri
// resources: resource_dir()/daw_engine/daw_engine(.exe)
let res_dir = app
.path()
.resource_dir()
.expect("resource dir not found");
let engine_dir = res_dir.join("daw_engine");
let engine_exe = if cfg!(windows) {
engine_dir.join("daw_engine.exe")
} else {
engine_dir.join("daw_engine")
};
let (_rx, child) = tauri_plugin_shell::process::Command::new(engine_exe)
.env("SF_PARENT_PID", std::process::id().to_string())
.spawn()
.expect("Failed to spawn daw_engine sidecar");
.expect("Failed to spawn daw_engine (onedir resource) — run build_windows.ps1 first");
app.manage(EngineProcess(Mutex::new(Some(child))));
println!("Python Background Engine started (localhost:8000, auto-fallback 8000-8010)");
+4 -3
View File
@@ -30,11 +30,12 @@
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.ico"
"icons/favicon.ico"
],
"externalBin": [
"binaries/daw_engine"
"resources": [
"resources/daw_engine/**"
],
"externalBin": [],
"windows": {
"nsis": {
"installerHooks": "hooks.nsh"