Открыть внешний файл с помощью Electron
У меня есть работающее приложение Electron и до сих пор отлично работает. Для контекста мне нужно запустить/открыть внешний файл, который представляет собой двоичный файл Go-lang, который будет выполнять некоторые фоновые задачи.
В основном это будет выступать в качестве бэкэнд и подвергать API, который будет использовать приложение Electron.
До сих пор это то, что я получаю:
-
Я попытался открыть файл с помощью "node way" с помощью child_process, но я не смог открыть файл примера txt, вероятно, из-за пути вопросы.
-
Электронный API раскрывает open-file, но в нем отсутствует документация/пример, и я не знаю, может ли это быть полезным.
Что это.
Как открыть внешний файл в Electron?
Ответы
Ответ 1
Есть пара API, на которых вы, возможно, захотите учиться и посмотреть, что вам поможет.
фс
Модуль fs
позволяет открывать файлы для чтения и записи напрямую.
var fs = require('fs');
fs.readFile(p, 'utf8', function (err, data) {
if (err) return console.log(err);
// data is the contents of the text file we just read
});
дорожка
Модуль path
позволяет вам строить и анализировать пути независимо от платформы.
var path = require('path');
var p = path.join(__dirname, '..', 'game.config');
ракушка
API shell
- это API-интерфейс только для электронов, который можно использовать для запуска файла по заданному пути, который будет использовать приложение по умолчанию для открытия файла.
const {shell} = require('electron');
// Open a local file in the default app
shell.openItem('c:\\example.txt');
// Open a URL in the default way
shell.openExternal('https://github.com');
child_process
Предполагая, что ваш двоичный файл golang является исполняемым, вы должны использовать child_process.spawn
для его вызова и связи с ним. Это узел API.
var path = require('path');
var spawn = require('child_process').spawn;
var child = spawn(path.join(__dirname, '..', 'mygoap.exe'), ['game.config', '--debug']);
// attach events, etc.
добавить
Если ваш двоичный файл golang не является исполняемым файлом, то вам нужно будет сделать нативную оболочку аддона.
Ответ 2
Электрон разрешает использование пакетов nodejs.
Другими словами, импортируйте пакеты node, как если бы вы были в node, например:
var fs = require('fs');
Чтобы запустить двоичный файл golang, вы можете использовать модуль child_process. Документация завершена.
Изменить. Вы должны решить различия путей. Событие open-file
- это событие на стороне клиента, вызванное окном. Не то, что вы хотите здесь.
Ответ 3
Я знаю, что это точно не соответствует вашей спецификации, но оно чисто отделяет ваше бинарное приложение golang и электронное приложение.
То, как я это сделал, состоит в том, чтобы выставить двоичный файл golang как веб-службу. Как этот
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
//TODO: put your call here instead of the Fprintf
fmt.Fprintf(w, "HI there from Go Web Svc. %s", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/api/someMethod", handler)
http.ListenAndServe(":8080", nil)
}
Затем от Electron просто сделайте ajax-вызовы веб-службе с помощью функции javascript. Подобно этому (вы можете использовать jQuery, но я нахожу, что этот чистый js отлично работает)
function get(url, responseType) {
return new Promise(function(resolve, reject) {
var request = new XMLHttpRequest();
request.open('GET', url);
request.responseType = responseType;
request.onload = function() {
if (request.status == 200) {
resolve(request.response);
} else {
reject(Error(request.statusText));
}
};
request.onerror = function() {
reject(Error("Network Error"));
};
request.send();
});
С помощью этого метода вы можете сделать что-то вроде
get('localhost/api/somemethod', 'text')
.then(function(x){
console.log(x);
}