From 2df6a50f3f0159553cb06ddf9e87450408724ba7 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 31 Oct 2016 22:07:52 +0000 Subject: [PATCH] Much cleaner builds all round Add Node-RED menu inside app move built files to parallel directory --- README.md | 19 +++++++----- afterinst.sh | 1 + appdmg.json | 2 +- buildall | 14 +++++++++ main.js | 88 +++++++++++++++++++++++++++++++++++++++------------- makewin32.js | 4 +-- makewin64.js | 4 +-- package.json | 29 +++++++++-------- 8 files changed, 112 insertions(+), 49 deletions(-) create mode 100755 afterinst.sh create mode 100755 buildall diff --git a/README.md b/README.md index 65260d3..6b47232 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,13 @@ cd electron-node-red npm install && npm run clean && npm start ``` -## TL:DR +## TL:DR - building runtimes -Run `npm run pack` to create packages for all platforms -or `npm run build` to build a .dmg file for OSX, and deb files for linux (32 and 64bit). -or `npm run build:osx` to just build for OSX. +On OSX you can run `./buildall` to build binaries of "everything"... maybe... -Builds are created in the `build` directory. Runtimes are created in the `dist` directory. +Run `npm run pack` to create packages for all platforms - these are the files required to run, they are not binary installers. + +Builds are created in the `build` directory. Runtimes are created in the `../electron-bin` directory. ## Packaging your application @@ -58,13 +58,17 @@ 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 +`npm run build:linux64` or `npm run build:linux32` - for Intel Linux -look at `https://github.com/jordansissel/fpm` +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/ +Use **sudo dpkg -i ...*** to install the correct deb for your architecture. + +Use `Node-RED` command to run. Flows are stored in `~/.node-red`. + ### To package as an exe @@ -74,6 +78,7 @@ look at `https://github.com/jordansissel/fpm` **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 diff --git a/afterinst.sh b/afterinst.sh new file mode 100755 index 0000000..2652b72 --- /dev/null +++ b/afterinst.sh @@ -0,0 +1 @@ +ln -s /opt/node-red/Node-RED /usr/bin/Node-RED diff --git a/appdmg.json b/appdmg.json index 13e8e0a..53ee667 100644 --- a/appdmg.json +++ b/appdmg.json @@ -1,5 +1,5 @@ { - "title": "Node-RED installer", + "title": "Node-RED Electron installer", "icon": "nodered.icns", "background": "appbkg.png", "icon-size": 80, diff --git a/buildall b/buildall new file mode 100755 index 0000000..5883f3b --- /dev/null +++ b/buildall @@ -0,0 +1,14 @@ +npm i +rm -rf node_modules/node-red/node_modules/node-red-node-serialport node_modules/node-red/node_modules/node-red-node-feedparser node_modules/node-red/node_modules/node-red-node-email +./node_modules/.bin/electron-rebuild +npm run clean +npm run build:osx +rm -rf build/ +npm run build:linux32 +rm -rf build/ +npm run build:linux64 +rm -rf build/ +npm run build:win32 +rm -rf build/ ../electron-bin/*.nupkg ../electron-bin/RELEASES +npm run build:win64 +rm -rf build/ ../electron-bin/*.nu* ../electron-bin/RELEASES diff --git a/main.js b/main.js index 4000d53..340656e 100755 --- a/main.js +++ b/main.js @@ -1,22 +1,23 @@ 'use strict'; +// Some settings you can edit easily +// Start on the dashboard page +const url = "/ui"; +// url for the editor page +const urledit = "/admin"; +// tcp port to use +//const listenPort = "18880"; // fix it just because +const listenPort = parseInt(Math.random()*16383+49152) // or random ephemeral port + const os = require('os'); const electron = require('electron'); -// Module to control application life. const app = electron.app; -// Module to create native browser window. const BrowserWindow = electron.BrowserWindow; -// Start directly on the ui page -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; -} +// this should be placed at top of main.js to handle squirrel setup events quickly +if (handleSquirrelEvent()) { return; } var http = require('http'); var express = require("express"); @@ -31,18 +32,21 @@ 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") { +var userdir; +if (process.argv[1] && (process.argv[1] === "main.js")) { + userdir = __dirname; +} +else { // We set the user directory to be in the users home directory... const fs = require('fs'); - userdir = os.homedir() + '\\.node-red'; + 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")); + if (!fs.existsSync(userdir+"/flows.json")) { + fs.writeFileSync(userdir+"/flows.json", fs.readFileSync(__dirname+"/flows.json")); } } +console.log("Setting UserDir to ",userdir); // Create the settings object - see default settings.js file for other options var settings = { @@ -67,9 +71,9 @@ red_app.use(settings.httpNodeRoot,RED.httpNode); var template = [{ label: "Application", submenu: [ - { label: "About Application", selector: "orderFrontStandardAboutPanel:" }, + { role: 'about' }, { type: "separator" }, - { label: "Quit", accelerator: "Command+Q", click: function() { app.quit(); }} + { role: 'quit' } ]}, { label: "Edit", submenu: [ @@ -80,7 +84,45 @@ var template = [{ { label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:" }, { label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:" }, { label: "Select All", accelerator: "CmdOrCtrl+A", selector: "selectAll:" } - ]} + ]}, { + label: 'View', + submenu: [ + { label: 'Reload', + accelerator: 'CmdOrCtrl+R', + click (item, focusedWindow) { if (focusedWindow) focusedWindow.reload() } + }, + { label: 'Toggle Developer Tools', + accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I', + click (item, focusedWindow) { if (focusedWindow) focusedWindow.webContents.toggleDevTools() } + }, + { type: 'separator' }, + { role: 'resetzoom' }, + { role: 'zoomin' }, + { role: 'zoomout' }, + { type: 'separator' }, + { role: 'togglefullscreen' }, + { role: 'minimize' } + ] + }, { + label: 'Node-RED', + submenu: [ + { label: 'Editor', + accelerator: "Shift+CmdOrCtrl+E", + click () { mainWindow.loadURL("http://localhost:"+listenPort+urledit); } + }, + { label: 'Dashboard', + accelerator: "Shift+CmdOrCtrl+D", + click () { mainWindow.loadURL("http://localhost:"+listenPort+url); } + }, + { type: 'separator' }, + { label: 'Documentation', + click () { require('electron').shell.openExternal('http://nodered.org/docs') } + }, + { label: 'Google group', + click () { require('electron').shell.openExternal('https://groups.google.com/forum/#!forum/node-red') } + } + ] + } ]; // Keep a global reference of the window object, if you don't, the window will @@ -104,7 +146,7 @@ function createWindow () { var webContents = mainWindow.webContents; webContents.on('did-get-response-details', function(event, status, newURL, originalURL, httpResponseCode) { - if ((httpResponseCode == 404) && (newURL == url)) { + if ((httpResponseCode == 404) && (newURL == ("http://localhost:"+listenPort+url))) { setTimeout(webContents.reload, 200); } Menu.setApplicationMenu(Menu.buildFromTemplate(template)); @@ -151,16 +193,18 @@ app.on('activate', function () { // dock icon is clicked and there are no other windows open. if (mainWindow === null) { createWindow(); + mainWindow.loadURL("http://127.0.0.1:"+listenPort+url); } }); // Start the Node-RED runtime, then load the inital page RED.start().then(function() { - server.listen(8000,function() { - mainWindow.loadURL(url); + server.listen(listenPort,"127.0.0.1",function() { + mainWindow.loadURL("http://127.0.0.1:"+listenPort+url); }); }); +/////////////////////////////////////////////////////// // All this Squirrel stuff is for the Windows installer function handleSquirrelEvent() { if (process.argv.length === 1) { diff --git a/makewin32.js b/makewin32.js index 42472ef..b5f5db9 100755 --- a/makewin32.js +++ b/makewin32.js @@ -6,10 +6,10 @@ 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', + outputDirectory: '../electron-bin/', authors: 'IBM Corp.', exe: 'Node-RED.exe', - setupExe: 'Node-RED-ia32-setup.exe', + setupExe: 'Node-RED-Electron-ia32.exe', setupIcon: 'nodered.ico', loadingGif: 'loading.gif', skipUpdateIcon: true diff --git a/makewin64.js b/makewin64.js index ff1832f..ab2193d 100755 --- a/makewin64.js +++ b/makewin64.js @@ -6,10 +6,10 @@ 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', + outputDirectory: '../electron-bin/', authors: 'IBM Corp.', exe: 'Node-RED.exe', - setupExe: 'Node-RED-x64-setup.exe', + setupExe: 'Node-RED-Electron-x64.exe', setupIcon: 'nodered.ico', loadingGif: 'loading.gif', skipUpdateIcon: true diff --git a/package.json b/package.json index bbd7919..bcc4dbe 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,29 @@ { "name": "electron-node-red", - "version": "1.0.8", + "version": "0.15.2", "description": "Electron Node-RED application starter", "main": "main.js", "scripts": { "start": "electron main.js", "test": "echo \" Warning: no test specified \"", - "clean": "rm -rf ./build ./dist && mkdir -p ./dist && ./node_modules/.bin/electron-rebuild", + "clean": "rm -rf ./build ../electron-bin && mkdir -p ./build ../electron-bin", "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:linux32": "electron-packager . Node-RED --icon=nodered.icns --platform=linux --arch=ia32 --out=build --overwrite && cp afterinst.sh build/Node-RED-linux-ia32/", + "pack:linux64": "electron-packager . Node-RED --icon=nodered.icns --platform=linux --arch=x64 --out=build --overwrite && cp afterinst.sh build/Node-RED-linux-x64", "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", + "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:armv7l": "electron-packager . Node-RED --icon=nodered.icns --platform=linux --arch=armv7l --out=build --overwrite && cp afterinst.sh build/Node-RED-linux-armv7l", - "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/" + "build": "npm run clean && npm run build:osx && npm run build:linux64 && npm run build:linux32", + "build:osx": "npm run pack:osx && appdmg appdmg.json ../electron-bin/Node-RED-Electron_$npm_package_version.dmg", + "build:linux32": "npm run pack:linux32 && fpm -s dir -t deb -f -n node-red-electron -v $npm_package_version -m conway@uk.ibm.com -a i386 -p ../electron-bin -C build/Node-RED-linux-ia32 --prefix=/opt/node-red --after-install=afterinst.sh ./", + "build:linux64": "npm run pack:linux64 && fpm -s dir -t deb -f -n node-red-electron -v $npm_package_version -m conway@uk.ibm.com -a x86_64 -p ../electron-bin -C build/Node-RED-linux-x64 --prefix=/opt/node-red --after-install=afterinst.sh ./", + "build:win32": "npm run pack:win32 && ./makewin32.js", + "build:win64": "npm run pack:win64 && ./makewin64.js", + "build:armv7l": "npm run pack:armv7l && fpm -s dir -t deb -f -n node-red-electron -v $npm_package_version -m conway@uk.ibm.com -a armv7l -p ../electron-bin -C build/Node-RED-linux-armv7l --prefix=/opt/node-red --after-install=afterinst.sh ./" }, "repository": { "type": "git", @@ -41,8 +41,7 @@ }, "keywords": [ "electron", - "quick", - "start", + "quick start", "node-red" ], "contributors": [