Build Scripts Documentation
This directory contains scripts for building and packaging AionUi across different platforms and architectures.
Scripts Overview
| Script | Lines | Purpose |
|---|---|---|
build-with-builder.js |
116 | Coordinates Electron Forge and electron-builder |
rebuildNativeModules.js |
219 | Unified native module rebuild utility |
beforeBuild.js |
38 | Pre-packaging native module rebuild hook |
afterPack.js |
67 | Post-packaging verification (Linux only) |
afterSign.js |
47 | macOS code signing and notarization |
Total: 487 lines (down from 711 lines before optimization)
Architecture
Build Flow
npm run dist:*
↓
build-with-builder.js
↓
├─→ Electron Forge (webpack compilation)
↓
electron-builder
↓
├─→ beforeBuild.js → rebuildNativeModules.js (all platforms)
├─→ Package app
├─→ afterPack.js → rebuildNativeModules.js (Linux only)
└─→ afterSign.js (macOS only)
Native Module Rebuild Strategy
rebuildNativeModules.js - Unified Rebuild Utility
This is the core module that handles all native module rebuilding. It provides:
Functions
-
rebuildWithElectronRebuild(options)- Used by:
beforeBuild.js - Rebuilds all native modules in source directory
- Modules:
better-sqlite3
- Used by:
-
rebuildSingleModule(options)- Used by:
afterPack.js - Rebuilds a single module in packaged app
- Strategy: Try prebuild-install first, fall back to electron-rebuild
- Used by:
-
verifyModuleBinary(moduleRoot, moduleName)- Verifies native binary exists after rebuild
-
Helper utilities:
normalizeArch(): Normalize architecture namesgetModulesToRebuild(): Get platform-specific module listbuildEnvironment(): Create rebuild environment variables
Platform-Specific Behavior
Windows
- Modules rebuilt:
better-sqlite3 - Skipped:
node-pty(uses prebuilt binaries) - Environment: MSVS 2022, Windows SDK 10.0.19041.0
macOS
- Modules rebuilt:
better-sqlite3 - When:
beforeBuildhook only - Post-build: Code signing and notarization
Linux
- Modules rebuilt:
better-sqlite3 - When:
beforeBuild: Rebuild in source directoryafterPack: Rebuildbetter-sqlite3in packaged app
- Strategy: Download prebuilt binary first, compile if unavailable
Usage Examples
Building for specific platform
# Build for macOS
npm run dist:mac
# Build for Windows
npm run dist:win
# Build for Linux
npm run dist:linux
Manual native module rebuild
const { rebuildWithElectronRebuild } = require('./scripts/rebuildNativeModules');
rebuildWithElectronRebuild({
platform: 'linux',
arch: 'arm64',
electronVersion: '37.3.1',
});
Rebuild single module in packaged app
const { rebuildSingleModule } = require('./scripts/rebuildNativeModules');
rebuildSingleModule({
moduleName: 'better-sqlite3',
moduleRoot: '/path/to/app.asar.unpacked/node_modules/better-sqlite3',
platform: 'linux',
arch: 'arm64',
electronVersion: '37.3.1',
});
Why Two Rebuild Stages?
beforeBuild (All Platforms)
- Rebuilds modules in source directory (
node_modules/) - Ensures correct binaries are packaged
- Uses
electron-rebuildfor all modules
afterPack (Linux Only)
- Rebuilds
better-sqlite3in packaged app (app.asar.unpacked/) - Handles cross-compilation issues
- Uses
prebuild-installfor faster builds (downloads prebuilt binary)
Troubleshooting
Module not found after packaging
Symptom: Error: Cannot find module 'better-sqlite3'
Solution: Check that:
- Module is in
packages/desktop/electron-builder.yml→filessection - Module is in
packages/desktop/electron-builder.yml→asarUnpacksection beforeBuild.jsran successfully during build- For Linux:
afterPack.jsran successfully
Native module crashes on launch
Symptom: App crashes with segfault or binary incompatibility error
Solution:
- Verify target architecture matches build architecture
- Check that
beforeBuild.jsrebuilt for correct architecture - For Linux ARM64: Ensure
afterPack.jsrebuilt the module
Cross-compilation fails
Symptom: Native module rebuild fails during cross-arch build
Solution:
- Windows: This is expected for
node-pty(uses prebuilt binaries) - macOS/Linux: Ensure build tools for target architecture are installed
- Consider building on native architecture instead
Optimization History
Version 1.0 (Before Optimization)
- Total: 711 lines across 5 files
- Duplication: Rebuild logic in both
beforeBuildandafterPack
Version 2.0 (Current)
- Total: 487 lines across 5 files
- Savings: 224 lines (31% reduction)
- Changes:
- ✅ Deleted
release.sh(67 lines) - usenpm versioninstead - ✅ Created
rebuildNativeModules.js(219 lines) - unified utility - ✅ Simplified
build-with-builder.js: 321 → 116 lines - ✅ Simplified
beforeBuild.js: 95 → 38 lines - ✅ Simplified
afterPack.js: 181 → 67 lines
- ✅ Deleted
Contributing
When modifying build scripts:
- Test on all platforms before committing
- Update this documentation if behavior changes
- Maintain the unified rebuild utility - avoid duplicating logic
- Keep error messages clear - they help users troubleshoot
Related Files
/packages/desktop/electron-builder.yml- electron-builder configuration/forge.config.ts- Electron Forge configuration/.github/workflows/build-and-release.yml- CI/CD pipeline/package.json- Build scripts and dependencies