169 похожих чатов

Приложение angular. Пытаюсь настроить автообновление. Для теста разместил по пути

https://myservrurl.com/2.0.1/myapp.exe следующую версию приложения. Текущая, на которой тестирую автообновление - 2.0.0.

Долго читал доку и понял, что вот такой вариант должен вполне работать. Но собираю приложение, устанавливаю, запускаю приложение и... ничего не происходит. Если запустить просто ng build && electron . , то в консоли спустя 30 секунд (интервал, по которому запускается autoUpdater.checkForUpdates()) пишет There was a problem updating the application
Error: Can not find Squirrel at AutoUpdater.checkForUpdates

В чём проблема и куда копать?

const {app, BrowserWindow, autoUpdater, dialog} = require('electron');
const log = require('electron-log'); // Подключение модуля логирования


const server = 'https://myservrurl.com/';
const url = `${server}/2.0.1/`;

autoUpdater.setFeedURL({ url });

// интервал для регулярной проверки обновлений
setInterval(() => {
autoUpdater.checkForUpdates();
}, 30 * 1000); // Проверка каждые 30 секунд

autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
const dialogOpts = {
type: 'info',
buttons: ['Restart', 'Later'],
title: 'Application Update',
message: process.platform === 'win32' ? releaseNotes : releaseName,
detail:
'A new version has been downloaded. Restart the application to apply the updates.'
};

dialog.showMessageBox(dialogOpts).then((returnValue) => {
if (returnValue.response === 0) autoUpdater.quitAndInstall()
})
});

autoUpdater.on('error', (message) => {
console.error('There was a problem updating the application')
console.error(message)
});


// каталог для логов, где будут храниться журналы приложения
log.transports.file.file = 'logfile.log';
log.transports.file.format = '{h}:{i}:{s} {text}'; // формат логов

let appWindow;

app.commandLine.appendSwitch('disable-http-cache');

function createWindow() {
// log.info('Creating appWindow...');

appWindow = new BrowserWindow({
width: 1600,
height: 800,
// alwaysOnTop: true, // должно ли окно всегда оставаться поверх других окон.
frame: false, // Убирает стандартный фрейм с кнопками управления окном
});

// log.info('Loading dist/index.html...');
appWindow.loadFile('dist/index.html');

appWindow.on('closed', function () {
appWindow = null;
});

// Открываем окно в полноэкранном режиме
appWindow.setFullScreen(true);

// проверка, что приложение не запустилось и в открывшемся окне просто белый экран
if (appWindow) {
let reloaded = false;

appWindow.webContents.on('did-finish-load', () => {

if (reloaded) {
return;
}

appWindow.webContents.executeJavaScript(`
document.body.innerText.trim().length > 0
`).then(bodyLoaded => {
// если вдруг что-то пошло не так и программа в итоге
// не запустилась - то она перезапускется принудительно
if (!bodyLoaded) {
reloaded = true;
appWindow.loadFile('dist/index.html');
}
});
});
}
}

// Проверка на наличие другого экземпляра приложения
const gotTheLock = app.requestSingleInstanceLock();

if (!gotTheLock) {
// Если другой экземпляр приложения уже активен, то можно отобразить сообщение об ошибке
// dialog.showErrorBox('Ошибка', 'Приложение уже запущено.');
app.quit();
} else {
// Если текущий экземпляр является первым, создаётся окно приложения
app.on('second-instance', (event, commandLine, workingDirectory) => {
if (appWindow) {
// log.info('appWindow show');
appWindow.show();
}
});

app.whenReady().then(() => {
// log.info('createWindow');
createWindow();
});
}

4 ответов

70 просмотров

https://github.com/electron/electron/issues/4535

Nikolay Dimitriev- Автор вопроса
P X N C H X R
https://github.com/electron/electron/issues/4535

То есть, как я понял, нужно отказаться от nsis в пользу Sqirrel? У меня есть файл electron-builder.json, в котором используется nsis, но, честно говоря, пока не до конца ясно как изменить на Sqirrel и что конкретно для этого нужно cделать? { "appId": "com.example.app", "productName": "myapp", "directories": { "output": "./inst" }, "win": { "target": "nsis", "icon": "icon.ico", "publisherName": "CN=\"MyApp, Inc.\", O=\"MyApp, Inc.\"" }, "nsis": { "oneClick": false, "perMachine": true, "allowToChangeInstallationDirectory": true } }

Nikolay Dimitriev- Автор вопроса
Nikolay Dimitriev
То есть, как я понял, нужно отказаться от nsis в п...

Удалось настроить автообновление. В целом всё работает, новые версии устанавливаются, если разместить нужные файлы версии по пути https://myserverurl.ru/eleases/ , но если разместить в release более старую версию, чем уже установлена, то в логах пишется "warn: CheckForUpdateImpl: hwhat, local version is greater than remote version", не смотря на то, что у меня проставлено autoUpdater.allowDowngrade = true; Нужно ли что-то ещё, чтобы разрешать установку более старых версий? В документации явно описано, что это должно разрешать установку более старых версий: /** * Whether to allow version downgrade (when a user from the beta channel wants to go back to the stable channel). * * Taken in account only if channel differs (pre-release version component in terms of semantic versioning). * * @default false */ allowDowngrade: boolean; Вот код обновления в app.js: // Определение глобальных переменных для URL и интервала let updateURL = null; let updateInterval = null; let isDownloading = false; // Функция для установки URL и интервала для проверки обновлений function setUpdateURL() { // разрешаем установку более старых версий autoUpdater.allowDowngrade = true; // Устанавливаем URL для проверки обновлений const server = 'https://myserverurl.ru/'; updateURL = `${server}releases/`; // Устанавливаем интервал для регулярной проверки обновлений updateInterval = setInterval(() => { if (!isDownloading) { // Просто проверяем наличие обновлений, без дополнительных проверок autoUpdater.checkForUpdates(); } }, 30 * 1000); // Проверка каждые 30 секунд // Устанавливаем URL для autoUpdater autoUpdater.setFeedURL({ url: updateURL }); } // Обработка начала загрузки autoUpdater.on('update-downloading', () => { isDownloading = true; }); // Обработка завершения загрузки autoUpdater.on('update-downloaded', () => { isDownloading = false; });

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! procedure TForm1.FormCreate(Sender: TObject); type TStartEnd = record S: Byte; E: Byte; end; var a, b: TStartEnd; begin {1} a.S := 1; {2} a.E := 2; ...
Руслан Михайлович
10
Всем привет!) я тут новенький и пытаюсь освоить evolution методом тыка. У меня при переходе между папками файлов выскакивают вот такие уведомления Можете подсказать как их от...
Диман Samoed
10
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Какого хера? /Sources/App/Modules/User/Models/UserLinkApple.swift:21:20: warning: stored property '_id' of 'Sendable'-conforming class 'UserLinkApple' is mutable @ID(...
Alexander Sherbakov
14
Карта сайта