/** * Build Linux release artifacts. * * AppImage packaging uses Linux tooling (mksquashfs). Running it from * Windows PowerShell reaches linux-unpacked, then fails while creating * the AppImage. Build from Linux/WSL instead. */ import { spawnSync } from 'node:child_process'; import fs from 'node:fs'; import path from 'node:path'; import process from 'node:process'; function run(command, args) { const result = spawnSync(command, args, { stdio: 'inherit', shell: process.platform === 'win32', }); if (result.status !== 0) { process.exit(result.status ?? 1); } } /** electron-builder для AppImage x64 часто даёт `x86_64` в имени — выравниваем под feed. */ function normalizeLinuxReleaseNames() { const releaseDir = path.resolve('release'); if (!fs.existsSync(releaseDir)) return; for (const name of fs.readdirSync(releaseDir)) { if (!name.includes('x86_64')) continue; const from = path.join(releaseDir, name); const to = path.join(releaseDir, name.replaceAll('x86_64', 'x64')); if (from !== to && !fs.existsSync(to)) { fs.renameSync(from, to); console.log(`[pack:linux] renamed ${name} -> ${path.basename(to)}`); } } for (const ymlName of fs.readdirSync(releaseDir)) { if (!ymlName.startsWith('latest-linux') || !ymlName.endsWith('.yml')) continue; const ymlPath = path.join(releaseDir, ymlName); const text = fs.readFileSync(ymlPath, 'utf8'); const next = text.replaceAll('x86_64', 'x64'); if (next !== text) { fs.writeFileSync(ymlPath, next); console.log(`[pack:linux] patched ${ymlName} (x86_64 -> x64)`); } } } if (process.platform === 'win32') { console.error( [ '[pack:linux] AppImage нельзя собрать напрямую из Windows PowerShell.', 'Запустите команду внутри Linux/WSL из папки проекта:', '', ' cd /mnt/d/Work/my_projects/dnd_project/dnd_player', ' npm ci', ' npm run pack:linux', ].join('\n'), ); process.exit(1); } run('npm', ['run', 'build']); run('electron-builder', ['--linux']); normalizeLinuxReleaseNames();