Bash Скрипты не выполняются из производственной сборки приложения Electron - PullRequest
0 голосов
/ 08 мая 2020

# UPDATE: index. js содержимое файла добавлено. У меня есть это электронное приложение, которое выполняет некоторые bash скрипты (*. sh) файлы для выполнения некоторой задачи.

Все работает абсолютно нормально в development environment, но когда building производственная сборка для deb установщика для платформы Ubuntu , все работает, например, открытие в приложении, другие NodeJS вещи, но bash скрипты не выполняются.

Постановка проблемы : Как выполнить shell scripts в производственной сборке электронного приложения для Linux (ОС Ubuntu). Получение этой ошибки

app / terminal_scripts / timer. sh Not Found

Ниже приводится подробное описание приложения.


** Настройка каталога проекта **:
ProjectName
|
app> css | изображения | js | оказывает | terminal_scripts
node_modules
package. json
package-lock. json

Где внутри каталога приложения у меня есть все CSS, изображения, js, HTML и сценарии терминала.

пакет. json:

{
  "name": "timer",
  "productName": "Timely",
  "version": "1.0.25",
  "description": "This desktop app shows you system clock",
  "main": "app/js/main/index.js",
  "scripts": {
    "start": "electron .",
    "test": "echo \"Error: no test specified\" && exit 1",
    "watch": "nodemon --exec 'electron .'",
    "dist": "electron-builder"
  },
  "homepage": ".",
  "keywords": [
    "Electron",
    "Desktop App"
  ],
  "author": "NotABot Ltd <contact@notabot.com>",
  "contributors": [
    {
      "name": "Not A Bot",
      "email": "nab@notabot.com"
    }
  ],
  "license": "ISC",
  "dependencies": {
    "desandro-matches-selector": "^2.0.2",
    "electron-context-menu": "^1.0.0",
    "electron-is": "^3.0.0",
    "fix-path": "^3.0.0",
    "isotope-layout": "^3.0.6",
    "jquery": "^3.5.0",
    "jquery-bridget": "^2.0.1"
  },
  "build": {
    "appId": "com.test.timely",
    "productName": "Timely",
    "linux": {
      "target": "deb",
      "category": "System"
    }
  },
  "devDependencies": {
    "electron": "^8.1.1", 
    "electron-builder": "^22.6.0"
  }
}

HTML:

<html>
  <head>
    <title>Timely</title>
  </head>
  <body>
    <button onclick="displayTime()">Display Time</button>
    <textarea rows="20" cols="90" id="command-output" disabled="true"></textarea>
   
    <script>
        const {app} = require('electron');
        function displayTime(){
            console.log("button clicked");
            let cmd = `bash app/terminal_scripts/timer.sh`;
            
            let completeMessage = 'This is the message';
            backgroundProcess(cmd, completeMessage);
        }

        function getCommandOutput() { return document.getElementById("command-output");  };
        function getStatus()      { return document.getElementById("status");  };


        function appendOutput(msg) { getCommandOutput().value += (msg+'\n'); };
        function setStatus(msg)    { getStatus().innerHTML = msg; };
        
        function backgroundProcess(cmd, completeMessage){
            const process = require('child_process');
            
            var child = process.execFile(cmd, [] , {shell: true} );
            appendOutput("Processing......");
            child.on('error', function(err) {
                appendOutput('stderr: '+err );
            });

            child.stdout.on('data', function (data) {
                appendOutput(data);
            });

            child.stderr.on('data', function (data) {
                appendOutput(data );
            });

            return new Promise((resolve, reject) => {
                child.on('close', function (code) {
                    console.log(`code is: ${code}`);
                    if (code == 0){
                        setStatus(completeMessage);
                        resolve(1);  
                    }
                    else{
                        setStatus('Exited with error code ' + code);
                        resolve(-1);
                    }
                });
            });
        }
    </script>

  </body>
</html>


Bash Скрипт :

#!/bin/bash
timer="$(date)"
echo "$timer" 

Для этого файла оболочки установлено разрешение 777



Информация о платформе :

  1. ОС: Ubuntu 18.04.4 LTS
  2. NodeJS: 13.6. 0
  3. NPM: 6.14.5
  4. Электрон: 8.1.1
  5. Электронный строитель: 22.6.0

индекс . js

const {app, BrowserWindow, Menu, Tray, ipcMain, MenuItem} = require('electron');
const path = require('path');
const contextMenu = require('electron-context-menu');

let splashWindow;


function createMainWindow(){
    mainWindow = new BrowserWindow({
        minHeight: 700,
        minWidth: 800,
        webPreferences: {
            nodeIntegration: true,
            webviewTag: true
        },
        show: false
    });
    //For dev only
    // mainWindow.webContents.openDevTools();
    mainWindow.loadFile('app/renderer/index.html');
    mainWindow.maximize();
}
app.on('ready', () =>{
    createMainWindow();
});

1 Ответ

0 голосов
/ 12 мая 2020

Я понял, как выполнять сценарии оболочки.

Исполняемый файл deb при установке создаст каталог Timely в /opt/Timely.

Там внутри Своевременно будет каталог resources, внутри которого существует файл с именем app.asar.

Итак, этот app.asar файл содержит все файлы (включая HTML, CSS, JS и файлы оболочки)

Итак, в index. html файл

Заменить

let cmd = bash app/terminal_scripts/timer.sh;

с

let cmd = /opt/Timely/resources/app.asar/app/terminal_scripts/timer.sh;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...