open modal icon electronjs browserwindow electron

icon - modal window electron



Abrir archivo externo con Electron (3)

Tengo una aplicación electrónica en ejecución y está funcionando muy bien hasta ahora. Para el contexto, necesito ejecutar / abrir un archivo externo que es un binario Go-lang que hará algunas tareas en segundo plano. Básicamente, actuará como backend y expondrá una API que la aplicación Electron consumirá.

Hasta ahora esto es lo que entro:

  • Intenté abrir el archivo con la "forma de nodo" utilizando child_process pero he fallado al abrir el archivo txt de muestra probablemente debido a problemas de ruta.

  • Electron API expone un evento de open-file pero carece de documentación / ejemplo y no sé si podría ser útil.

Eso es. ¿Cómo abro un archivo externo en Electron?


Electron permite el uso de paquetes nodejs .

En otras palabras, importe los paquetes de nodo como si estuviera en un nodo, por ejemplo:

var fs = require(''fs'');

Para ejecutar el binario de golang, puede hacer uso del módulo child_process.spawn . La documentación es exhaustiva.

Editar : Tienes que resolver las diferencias de ruta. El evento de open-file es un evento del lado del cliente, activado por la ventana. No es lo que quieres aquí.


Es posible que desee estudiar un par de API y ver cuál le ayuda.

fs

El módulo fs permite abrir archivos para leer y escribir directamente.

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 });

camino

El módulo de path permite crear y analizar rutas de forma independiente de la plataforma.

var path = require(''path''); var p = path.join(__dirname, ''..'', ''game.config'');

cáscara

El shell api es un api solo electrónico que puede usar para ejecutar un archivo en una ruta determinada, que utilizará la aplicación predeterminada del sistema operativo para abrir el archivo.

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

Suponiendo que su binario Golang es un ejecutable, entonces usaría child_process.spawn para llamarlo y comunicarse con él. Este es un nodo api. Si su binario Golang no es un ejecutable, deberá crear un contenedor de complemento nativo .

var path = require(''path''); var spawn = require(''child_process'').spawn; var child = spawn(path.join(__dirname, ''..'', ''mygoap.exe''), [''game.config'', ''--debug'']); // attach events, etc.


Sé que esto no cumple exactamente con sus especificaciones, pero separa claramente su aplicación binaria y electrónica de Golang.

La forma en que lo he hecho es exponer el binario de golang como un servicio web. Me gusta esto

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) }

Luego, desde Electron solo realice llamadas ajax al servicio web con una función javascript. Así (puedes usar jQuery, pero creo que este js puro funciona bien)

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(); });

Con ese método podrías hacer algo como

get(''localhost/api/somemethod'', ''text'') .then(function(x){ console.log(x); }