Как получить исходный путь портативного приложения Electron?

У меня есть Portable Electron App (в комплекте: electronic-builder + asar, портативная сборка) в Windows. Я пытаюсь получить путь к приложению, но он возвращает путь в папке user \ temp, а не в фактическом файле .exe.

Есть ли способ получить исходный путь к app.exe?

Я пробовал следующее:

  • app.getAppPath ()
  • __dirname
  • require.main.filename
  • путь к корневому каталогу приложения
  • и несколько узловых модулей

Путь, который я получаю из своих тестов:

C: \ Users \ xxx \ AppData \ Local \ Temp \ xxxxxx.tmp \ app

фактический путь .exe (откуда запущено приложение и что мне нужно):

C: \ Users \ XXX \ Documents \ test \ dist

Я только начинаю с Electron.


person LycaKnight    schedule 19.09.2017    source источник
comment
Я собрал некоторые данные о путях для Windows и Mac - см. Здесь github. com / BananaAcid / Simple-Electron-Kiosk / blob / master /   -  person BananaAcid    schedule 03.08.2018


Ответы (7)


Я нашел решение: используйте переменную среды (созданную Electron-Builder)

process.env.PORTABLE_EXECUTABLE_DIR

чтобы показать реальный путь к App.exe. Работает только в комплекте с Electron-Builder

person LycaKnight    schedule 09.10.2017
comment
Я сейчас на Mac, где он пуст ... пробовал в режиме разработки и после сборки: / - person Can Rau; 10.10.2017
comment
в окнах это, кажется, работает ... так что, возможно, объединение этого для окон и другого ответа (который не работает должным образом в Windows) для Mac и, возможно, Linux, который мне все еще нужно исследовать, так что кто получает награду? - person Can Rau; 10.10.2017
comment
Из любопытства, устанавливается ли вообще эта переменная среды непереносимой сборкой приложения? В противном случае это был бы хороший способ, чтобы приложение могло определить, было ли оно переносимым. - person cbartondock; 13.05.2020
comment
Не работает в некоторых окнах. - person Peter; 03.03.2021

Из основного процесса:

// If not already defined...
const { app } = require ('electron');
const path = require ('path');

let execPath;

execPath = path.dirname (app.getPath ('exe'));
// or
execPath = path.dirname (process.execPath);

Из процесса рендеринга:

// If not already defined...
const { remote } = require ('electron');
const path = require ('path');

let execPath;

execPath = path.dirname (remote.app.getPath ('exe'));
// or
execPath = path.dirname (remote.process.execPath);
person Community    schedule 04.10.2017
comment
на Mac он возвращает ../build/mac/APPName.app/Contents/MacOS, что нам не нужно ... мы могли бы String.replace или String.split получить только часть ...builld/mac, тогда было бы неплохо программно узнать имена приложений каждой сборки, потому что Windows и Linux имеют версию числа (возможно, я просто построю его из package.json), я проверю, дает ли он то же самое в Windows и Linux :-) - person Can Rau; 05.10.2017
comment
может быть комбинация вашего решения и решения LycaKnight .. но тогда кто получает награду? - person Can Rau; 10.10.2017
comment
Для меня он вернул /Applications/Weaver.app/Contents/MacOS, а требуемый путь был /Applications/Weaver.app/Contents/MacOS/Weaver, где имя моего приложения было Weaver. Мои тесты требовали пути, и теперь тест запускает экземпляр Electron (Weaver) - person Mathieu Brouwers; 06.06.2018

У меня было много проблем с этим, и я, наконец, смог решить проблему, заменив __dirname на '.', См. Рабочий пример ниже:

const path = require('path')
const myAppPath = path.resolve('.', 'myapp.exe');
person Antonin GAVREL    schedule 19.02.2020
comment
Мне потребовались часы, чтобы найти это решение. Спасибо - person Abdurrahman; 18.01.2021

Похоже, PORTABLE_EXECUTABLE_FILE работает только в определенных конфигурациях Electron-Builder; В частности, он не будет работать в приложениях, развернутых как переносной каталог.

В таких случаях путь к корневому каталогу приложения будет получен следующим образом:

const path = require('path')
import { app } from 'electron'

let rootDir = app.getAppPath()
let last = path.basename(rootDir)
if (last == 'app.asar') {
    rootDir = Path.dirname(app.getPath('exe'))
}
person DanyAlejandro    schedule 30.06.2020

Ни один из приведенных выше ответов не помог мне в Windows 10.

process.env.PORTABLE_EXECUTABLE_DIR возвращает путь к каталогу Temp.

Я заставил его работать, используя:

process.env.INIT_CWD
person David J.    schedule 30.11.2018

process.env.PORTABLE_EXECUTABLE_FILE

даст вам полный путь к файлу.

person ramaralo    schedule 25.03.2019
comment
в моем проекте PORTABLE_EXECUTABLE_FILE не определен в сборке DEV. Не знаю почему - person Josef Biehler; 26.03.2019
comment
Должен быть. Вам нужно создать файл .exe, а затем выполнить его, чтобы эта переменная была определена. - person ramaralo; 27.03.2019

Поскольку ни один из вышеперечисленных методов не сработал, и я не хочу использовать для этого внешнюю библиотеку, я попробовал следующее:

        if (!fs.existsSync("../images")) {
            fs.mkdirSync("./../images");            
        }
        return path.resolve("./../images/") + "/";

Вы можете использовать любой каталог, который должен существовать на верхнем уровне или где-либо еще. В моем случае я знаю, что на один уровень выше в каталоге должен быть каталог с именем «images».

Это решение работало в моем случае для сборки DEV и prod (упаковано).

Есть ли недостатки при использовании этого подхода?

person Josef Biehler    schedule 26.03.2019
comment
Тот факт, что вы создаете каталог вне своего приложения? Откуда вы знаете, что у вас есть на это разрешение? - person cbartondock; 12.05.2020