From 9d3c232924979ad5e391257708d0e124f6771302 Mon Sep 17 00:00:00 2001 From: mileswa1q22 Date: Mon, 27 Jul 2026 14:29:45 -0500 Subject: [PATCH] feat: add binary option for gelectron packager and implement ad-hoc signing for Mac apps --- crates/gelectron-app/src/main.rs | 2 ++ packager/bin/gelectron-packager.js | 29 +++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/crates/gelectron-app/src/main.rs b/crates/gelectron-app/src/main.rs index 8dc0622..47641a7 100644 --- a/crates/gelectron-app/src/main.rs +++ b/crates/gelectron-app/src/main.rs @@ -1,3 +1,5 @@ +#![windows_subsystem = "windows"] + use serde::{Deserialize, Serialize}; use std::cell::RefCell; use std::collections::HashMap; diff --git a/packager/bin/gelectron-packager.js b/packager/bin/gelectron-packager.js index d6081ec..04c2706 100755 --- a/packager/bin/gelectron-packager.js +++ b/packager/bin/gelectron-packager.js @@ -210,7 +210,13 @@ async function packageApp(opts) { // 1. Find gelectron binary log(' Locating gelectron binary...'); - let gelectronBin = findGelectronFromAncestors(appDir); + let gelectronBin; + if (opts.binary) { + gelectronBin = path.resolve(opts.binary); + if (!fs.existsSync(gelectronBin)) die(`Binary not found: ${gelectronBin}`); + } else { + gelectronBin = findGelectronFromAncestors(appDir); + } if (!gelectronBin) die('gelectron binary not found. Run: cargo build --release'); log(` Found: ${path.basename(gelectronBin)}`); @@ -292,6 +298,15 @@ exec "$DIR/gelectron-bin" "$@" // Generate Info.plist fs.writeFileSync(path.join(contentsDir, 'Info.plist'), generateInfoPlist(name, version, exeName)); + // Ad-hoc sign so the app runs on other Macs + log(' Signing app...'); + try { + execSync(`codesign --force --deep --sign - "${appBundle}"`, { stdio: 'pipe' }); + log(' Signed (ad-hoc)'); + } catch (e) { + log(' Warning: codesign failed (app may be blocked on other Macs)'); + } + log(` Created: ${appBundle}`); } @@ -321,7 +336,15 @@ async function packageWindows(appDir, outDir, name, version, gelectronBin, nodeD log(' Copying app source...'); copyDirSync(appDir, path.join(outDir, 'app'), ['node_modules', '.gelectron-cache', '.git', 'target']); - // Generate launcher batch + // Generate VBScript launcher (no terminal window) + const vbs = `Set WshShell = CreateObject("WScript.Shell") +WshShell.CurrentDirectory = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName) +WshShell.Environment("Process")("PATH") = WshShell.CurrentDirectory & ";" & WshShell.Environment("Process")("PATH") +WshShell.Run """" & WshShell.CurrentDirectory & "\\${exeName}.exe""", 1, False +`; + fs.writeFileSync(path.join(outDir, `${exeName}.vbs`), vbs); + + // Also keep a .bat for convenience const bat = `@echo off set DIR=%~dp0 set PATH=%DIR%;%PATH% @@ -388,6 +411,7 @@ for (let i = 0; i < args.length; i++) { case '--out': case '-o': opts.out = args[++i]; break; case '--platform': case '-p': opts.platform = args[++i]; break; case '--arch': case '-a': opts.arch = args[++i]; break; + case '--binary': case '-b': opts.binary = args[++i]; break; case '--help': case '-h': console.log(` gelectron-packager — Package Gelectron apps for distribution @@ -401,6 +425,7 @@ for (let i = 0; i < args.length; i++) { --out, -o Output directory (default: --) --platform, -p Target platform: darwin, win32, linux (default: current) --arch, -a Target arch: x64, arm64 (default: current) + --binary, -b Path to gelectron binary (for cross-compiled builds) --help, -h Show this help `); process.exit(0);