Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

electron-builder not working for production due to path

Tags:

everyone

I created a React app in order to build an electron app. I'm trying to use electron-builder to create the installers. I'm working on Ubuntu trying to generate a .deb.

I didn't use create-react-app, I used a boilerplate I already had, but I don't know if this is the problem.

I can make it work as long as I edit the index.html the webpack generates in the build folder. I have to change the path to main.css and build.js from /main.css and /build.js to ./main.css and ./build.js.

I read that I have to use the "homepage" property in package.json, but it's not working, seems to be ignored.

My folder structure is like:

package.json
src/
config/
main_electron_file.js
build/ #generated by webpack when I run the 'build:prd' command
public/ #empty

package.json

{
  "name": "frontend",
  "version": "1.0.0",
  "description": "",
  "main": "./main_electron_file.js",
  "scripts": {
    "dev": "./node_modules/.bin/webpack-dev-server --config ./config/webpack.config.dev.js --mode development --open --hot",
    "build:prd": "./node_modules/webpack/bin/webpack.js --mode production --config ./config/webpack.config.prd.js --env.NODE_ENV=production --progress",
    "electron": "electron .",
    "start": "npm run dev && npm run electron",
    "start:dev": "ELECTRON_START_URL=http://localhost:3000 electron .",
    "dist": "build"
  },
  "keywords": [],
  "author": {
    "name": "name",
    "email": "[email protected]"
  },
  "license": "ISC",
  "dependencies": {
  ...
  },
  "devDependencies": {
  ...
  },
  "homepage": "./",
  "build": {
    "appId": "com.myself.myapp",
    "linux": {
      "target": [
        "deb"
      ]
    }
  }
}

main_electron_file.js

// Modules to control application life and create native browser window
const { app, BrowserWindow } = require('electron');

const path = require('path');
const url = require('url');

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let mainWindow

function createWindow() {
  const startUrl = process.env.ELECTRON_START_URL || url.format({
    pathname: path.join(__dirname, 'build/index.html'),
    protocol: 'file:',
    slashes: true
  });

  // Create the browser window.
  mainWindow = new BrowserWindow({ width: 800, height: 600, resizeble: false });
  mainWindow.setResizable(false);

  // and load the index.html of the app.
  // win.loadURL('http://localhost:3000');
  mainWindow.loadURL(startUrl);

  // Open the DevTools.
  mainWindow.webContents.openDevTools()

  // Emitted when the window is closed.
  mainWindow.on('closed', function () {
    // Dereference the window object, usually you would store windows
    // in an array if your app supports multi windows, this is the time
    // when you should delete the corresponding element.
    mainWindow = null
  })
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', createWindow)

// Quit when all windows are closed.
app.on('window-all-closed', function () {
  // On OS X it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', function () {
  // On OS X it's common to re-create a window in the app when the
  // dock icon is clicked and there are no other windows open.
  if (mainWindow === null) {
    createWindow()
  }
})

// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.

By the way. I'm not building it. I'm running it pointing to the index.html in the dist, as I would do in production mode. So i'm running npm run build:prd and then npm run electron

ANy ideas how I could make this process automatic?

like image 313
Victor Ferreira Avatar asked Nov 22 '18 01:11

Victor Ferreira


People also ask

What is appId electron?

In simple terms, appId is a name that the client's computer is using to identify. This is particularly useful and you must've noticed it when you are trying to launch an app thar's already open, your OS would open the minimised version, rather than opening a new instance of the same app.

How does electron builder work?

electron-builder builds the Electron app for the current platform and current architecture as the default target. Linux: If you build on Windows or macOS, Snap and AppImage for x64 will be the output. Otherwise if you build on Linux, the output will be Snap and AppImage files for the current architecture.

How do I change my electron app name?

macOS: You can rename Electron. app to any name you want, and you also have to rename the CFBundleDisplayName , CFBundleIdentifier and CFBundleName fields in the following files: Electron. app/Contents/Info.


1 Answers

Please try adding this line in your index.html

<base href="./">

And your main.css and build.js directory should be set relative to your index.html in build folder

like image 124
carlokid Avatar answered Oct 12 '22 01:10

carlokid