From 8c652c165d0c7219a8a9bb56ed4a4c154b63a2b4 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sun, 30 Oct 2016 22:06:48 +0000 Subject: [PATCH] Update/fix windows install builder --- README.md | 22 +++++++++++--- main.js | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++-- makewin.js | 19 ------------ makewin32.js | 20 ++++++++++++ makewin64.js | 20 ++++++++++++ package.json | 19 +++++++----- 6 files changed, 152 insertions(+), 34 deletions(-) delete mode 100644 makewin.js create mode 100755 makewin32.js create mode 100755 makewin64.js diff --git a/README.md b/README.md index ab052a4..65260d3 100644 --- a/README.md +++ b/README.md @@ -32,14 +32,14 @@ If you want to distribute executables of this project, the easiest way is to use ``` sudo npm install -g electron-packager -# build for OS X 64 bits -electron-packager . Node-RED --icon=nodered.icns --platform=darwin --arch=x64 +# build for OSX 64 bits +electron-packager . Node-RED --icon=nodered.icns --platform=darwin --arch=x64 --out=build --overwrite # build for Windows 64 bits -electron-packager . Node-RED --icon=nodered.icns --platform=win32 --arch=x64 +electron-packager . Node-RED --icon=nodered.icns --platform=win32 --arch=x64 --out=build --asar=true --overwrite --win32metadata.CompanyName='IBM Corp.' --win32metadata.ProductName='Node-RED Electron' # build for Linux 64 bits -electron-packager . Node-RED --icon=nodered.icns --platform=linux --arch=x64 +electron-packager . Node-RED --icon=nodered.icns --platform=linux --arch=x64 --out=build --overwrite ``` Learn more about Electron and its API in the [documentation](http://electron.atom.io/docs/latest). @@ -47,6 +47,8 @@ Learn more about Electron and its API in the [documentation](http://electron.ato ### To package as a dmg +`npm run build:osx` + look at `https://github.com/LinusU/node-appdmg` sudo npm install -g appdmg @@ -56,13 +58,23 @@ look at `https://github.com/LinusU/node-appdmg` ### To package as a deb +`npm run build:linux` or `npm run build:linux32` - for Intel Linux + look at `https://github.com/jordansissel/fpm` fpm -s dir -t deb -f -n node-red-electron -v 0.15.2 -m your-email@example.com -a i386 Node-RED-linux-ia32/ fpm -s dir -t deb -f -n node-red-electron -v 0.15.2 -m your-email@example.com -a x86_64 Node-RED-linux-x64/ -#### License [CC0 (Public Domain)](LICENSE.md) +### To package as an exe + +`npm run build:win32` - to build for 32-bit Windows. + +`npm run build:win64` - to build for 64-bit Windows. + +**Note**: This project was built to run on Mac OSX - To build for windows on other platforms you may need to use other tools. + +## License [CC0 (Public Domain)](LICENSE.md) ## See also - **Stand-alone Starter Project** - https://github.com/dceejay/node-red-project-starter diff --git a/main.js b/main.js index ba2ad57..4000d53 100755 --- a/main.js +++ b/main.js @@ -1,6 +1,7 @@ 'use strict'; +const os = require('os'); const electron = require('electron'); // Module to control application life. const app = electron.app; @@ -11,6 +12,12 @@ const url = "http://localhost:8000/ui"; const {Menu, MenuItem} = electron; +// this should be placed at top of main.js to handle setup events quickly +if (handleSquirrelEvent()) { + // squirrel event handled and app will exit in 1000ms, so don't do anything else + return; +} + var http = require('http'); var express = require("express"); var RED = require("node-red"); @@ -24,12 +31,25 @@ var red_app = express(); // Create a server var server = http.createServer(red_app); +// If on Windows move the userdir away from the asar bundle. +var userdir = __dirname; +if (os.platform() === "win32") { + const fs = require('fs'); + userdir = os.homedir() + '\\.node-red'; + if (!fs.existsSync(userdir)) { + fs.mkdirSync(userdir); + } + if (!fs.existsSync(userdir+"\\flows.json")) { + fs.writeFileSync(userdir+"\\flows.json", fs.readFileSync(__dirname+"\\flows.json")); + } +} + // Create the settings object - see default settings.js file for other options var settings = { verbose: true, httpAdminRoot:"/admin", httpNodeRoot: "/", - userDir: __dirname, + userDir: userdir, flowFile: "flows.json", functionGlobalContext: { } // enables global context }; @@ -43,7 +63,6 @@ red_app.use(settings.httpAdminRoot,RED.httpAdmin); // Serve the http nodes UI from /api red_app.use(settings.httpNodeRoot,RED.httpNode); - // Create the Application's main menu var template = [{ label: "Application", @@ -141,3 +160,66 @@ RED.start().then(function() { mainWindow.loadURL(url); }); }); + +// All this Squirrel stuff is for the Windows installer +function handleSquirrelEvent() { + if (process.argv.length === 1) { + return false; + } + + const ChildProcess = require('child_process'); + const path = require('path'); + + const appFolder = path.resolve(process.execPath, '..'); + const rootAtomFolder = path.resolve(appFolder, '..'); + const updateDotExe = path.resolve(path.join(rootAtomFolder, 'Update.exe')); + const exeName = path.basename(process.execPath); + + const spawn = function(command, args) { + let spawnedProcess, error; + + try { + spawnedProcess = ChildProcess.spawn(command, args, {detached: true}); + } catch (error) {} + + return spawnedProcess; + }; + + const spawnUpdate = function(args) { + return spawn(updateDotExe, args); + }; + + const squirrelEvent = process.argv[1]; + switch (squirrelEvent) { + case '--squirrel-install': + case '--squirrel-updated': + // Optionally do things such as: + // - Add your .exe to the PATH + // - Write to the registry for things like file associations and + // explorer context menus + + // Install desktop and start menu shortcuts + spawnUpdate(['--createShortcut', exeName]); + + setTimeout(app.quit, 1000); + return true; + + case '--squirrel-uninstall': + // Undo anything you did in the --squirrel-install and + // --squirrel-updated handlers + + // Remove desktop and start menu shortcuts + spawnUpdate(['--removeShortcut', exeName]); + + setTimeout(app.quit, 1000); + return true; + + case '--squirrel-obsolete': + // This is called on the outgoing version of your app before + // we update to the new version - it's the opposite of + // --squirrel-updated + + app.quit(); + return true; + } +}; diff --git a/makewin.js b/makewin.js deleted file mode 100644 index 2642b9d..0000000 --- a/makewin.js +++ /dev/null @@ -1,19 +0,0 @@ -var electronInstaller = require('electron-winstaller'); - -// resultPromise = electronInstaller.createWindowsInstaller({ -// appDirectory: 'dist/Node-RED-win32-ia32', -// outputDirectory: 'dist/installer32', -// authors: 'IBM Corp.', -// exe: 'Node-RED.exe' -// }); -// -// resultPromise.then(() => console.log("It worked!"), (e) => console.log(`No dice ia32: ${e.message}`)); - -resultPromise = electronInstaller.createWindowsInstaller({ - appDirectory: 'dist/Node-RED-win32-x64', - outputDirectory: 'dist/win', - authors: 'IBM Corp.', - exe: 'Node-RED.exe' -}); - -resultPromise.then(() => console.log("It worked!"), (e) => console.log(`No dice x64: ${e.message}`)); diff --git a/makewin32.js b/makewin32.js new file mode 100755 index 0000000..2bcf78b --- /dev/null +++ b/makewin32.js @@ -0,0 +1,20 @@ +#! /usr/bin/env node +var electronInstaller = require('electron-winstaller'); +var fs = require('fs'); + +if (fs.existsSync('build/Node-RED-win32-ia32')) { + console.log("Building setup app for Windows 32bit"); + resultPromise = electronInstaller.createWindowsInstaller({ + appDirectory: 'build/Node-RED-win32-ia32', + outputDirectory: 'dist', + authors: 'IBM Corp.', + exe: 'Node-RED.exe', + setupExe: 'Node-RED-ia32-setup.exe', + setupIcon: 'nodered.ico', + skipUpdateIcon: true + }); + resultPromise.then( + () => console.log("32bit build completed."), + (e) => console.log(`32bit build failed: ${e.message}`) + ); +} diff --git a/makewin64.js b/makewin64.js new file mode 100755 index 0000000..fc1346e --- /dev/null +++ b/makewin64.js @@ -0,0 +1,20 @@ +#! /usr/bin/env node +var electronInstaller = require('electron-winstaller'); +var fs = require('fs'); + +if (fs.existsSync('build/Node-RED-win32-x64')) { + console.log("Building setup app for Windows 64bit"); + resultPromise = electronInstaller.createWindowsInstaller({ + appDirectory: 'build/Node-RED-win32-x64', + outputDirectory: 'dist', + authors: 'IBM Corp.', + exe: 'Node-RED.exe', + setupExe: 'Node-RED-x64-setup.exe', + setupIcon: 'nodered.ico', + skipUpdateIcon: true + }); + resultPromise.then( + () => console.log("64bit build completed."), + (e) => console.log(`64bit build failed: ${e.message}`) + ); +} diff --git a/package.json b/package.json index 673e903..a90205d 100644 --- a/package.json +++ b/package.json @@ -7,18 +7,20 @@ "start": "electron main.js", "test": "echo \" Warning: no test specified \"", - "clean": "rm -rf ./dist ./build && mkdir -p ./dist && ./node_modules/.bin/electron-rebuild", + "clean": "rm -rf ./build && mkdir -p ./dist && ./node_modules/.bin/electron-rebuild", - "pack": "npm run clean && electron-packager . Node-RED --icon=nodered.icns --all --out=build", - "pack:osx": "electron-packager . Node-RED --icon=nodered.icns --platform=darwin --arch=x64 --out=build", - "pack:win": "electron-packager . Node-RED --icon=nodered.icns --platform=win32 --arch=x64 --out=build", - "pack:win32": "electron-packager . Node-RED --icon=nodered.icns --platform=win32 --arch=ia32 --out=build", - "pack:linux": "electron-packager . Node-RED --icon=nodered.icns --platform=linux --arch=x64 --out=build", - "pack:linux32": "electron-packager . Node-RED --icon=nodered.icns --platform=linux --arch=ia32 --out=build", - "pack:armv7l": "electron-packager . Node-RED --icon=nodered.icns --platform=linux --arch=armv7l --out=build", + "pack": "npm run clean && electron-packager . Node-RED --icon=nodered.icns --all --out=build --overwrite", + "pack:osx": "electron-packager . Node-RED --icon=nodered.icns --platform=darwin --arch=x64 --out=build --overwrite", + "pack:win64": "electron-packager . Node-RED --icon=nodered.icns --platform=win32 --arch=x64 --out=build --asar=true --overwrite --win32metadata.CompanyName='IBM Corp.' --win32metadata.ProductName='Node-RED Electron'", + "pack:win32": "electron-packager . Node-RED --icon=nodered.icns --platform=win32 --arch=ia32 --out=build --asar=true --overwrite --win32metadata.CompanyName='IBM Corp.' --win32metadata.ProductName='Node-RED Electron'", + "pack:linux": "electron-packager . Node-RED --icon=nodered.icns --platform=linux --arch=x64 --out=build --overwrite", + "pack:linux32": "electron-packager . Node-RED --icon=nodered.icns --platform=linux --arch=ia32 --out=build --overwrite", + "pack:armv7l": "electron-packager . Node-RED --icon=nodered.icns --platform=linux --arch=armv7l --out=build --overwrite", "build": "npm run build:osx && npm run build:linux && npm run build:linux32", "build:osx": "npm run pack && appdmg appdmg.json dist/Node-RED.dmg", + "build:win64": "npm run pack:win64 && ./makewin64.js && rm -f dist/RELEASES dist/*nupkg ", + "build:win32": "npm run pack:win32 && ./makewin32.js && rm -f dist/RELEASES dist/*nupkg", "build:linux32": "npm run pack:linux32 && fpm -s dir -t deb -f -n node-red-electron -v 0.15.2 -m conway@uk.ibm.com -a i386 -p dist build/Node-RED-linux-ia32/", "build:linux": "npm run pack:linux && fpm -s dir -t deb -f -n node-red-electron -v 0.15.2 -m conway@uk.ibm.com -a x86_64 -p dist build/Node-RED-linux-x64/", "build:armv7l": "npm run pack:armv7l && fpm -s dir -t deb -f -n node-red-electron -v 0.15.2 -m conway@uk.ibm.com -a armv7l -p dist build/Node-RED-linux-armv7l/" @@ -55,6 +57,7 @@ "devDependencies": { "electron": "^1.4.4", "electron-rebuild": "*", + "electron-squirrel-startup": "*", "electron-winstaller": "*" } }