正在检测更新,但我无法将其下载到我的应用程序。我得到以下错误:
状态:可用更新
状态:自动更新程序出错。错误:无法下载“https://api.github.com/repos/[username]/[repo-name]/releases/assets/15151663“,状态404:未找到。
这个问题只出现在私有的github仓库中,而不是公共的!!
我试过安装自动更新到一个干净的电子react-boilerplate,它与私人github存储库工作得非常好。所以我有点不知所措。
我做了一些研究,似乎app-update.yml应该包含github令牌(electron-builder应该生成它),但我的app-update.yml(位于release/win-unpacked/resources)不包含令牌。
它只包含以下信息:
owner: [username]
repo: [repo-name]
provider: github
updaterCacheDirName: [appname]
字符串
我如何生成它?
其他评论指出,我应该有一个单独的release-only存储库,我这样做了,但它仍然不工作。
Electron Autoupdater with Private GitHub Repository?的
其他人说降级版本可以解决这个问题,但我也看到人们说这不能解决这个问题,降级并不是一个好的选择。
我添加gh-token的步骤:
我在package.json中设置了我的github信息(该令牌被忽略)
"publish": {
"provider": "github",
"owner": "[username]",
"repo": "[repo-name]",
"token": "[gh-token]",
"private": true
}
"repository": {
"type": "git",
"url": "https://github.com/[username]/[repo-name].git"
},
型
所以我也把它添加到我的main.js中以防万一。
autoUpdater.setFeedURL({
provider: 'github',
repo: '[repo-name]',
owner: '[username]',
private: true,
token: '[gh-token]'
});
process.env.GH_TOKEN = "[gh-token]";
型
当我删除setFeedURL时,我得到了与下面问题中完全相同的错误:https://github.com/electron-userland/electron-builder/issues/2641的
latest.yml(在github发布的附带installer.exe installer.exe.blockmap和installer.msi中生成的文件)
version: [version-number]
files:
- url: [app-name.exe]
sha512: [string]
size: [file-size]
path: [app-name.exe]
sha512: [string]
releaseDate: [release-date]
型
我使用的版本:
"electron": "^3.0.10",
"electron-builder": "^20.38.4",
"electron-updater": "^4.0.0",
型
完整的main.js
import { app, BrowserWindow, ipcMain, dialog } from 'electron';
import { autoUpdater } from 'electron-updater';
import log from 'electron-log';
import MenuBuilder from './menu';
export default class AppUpdater {
constructor() {
log.transports.file.level = 'info';
autoUpdater.logger = log;
autoUpdater.checkForUpdatesAndNotify();
}
}
let mainWindow = null;
autoUpdater.setFeedURL({
provider: 'github',
repo: '[repo-name]',
owner: '[username]',
private: true,
token: '[gh-token]'
});
process.env.GH_TOKEN = "[gh-token]";
if (process.env.NODE_ENV === 'production') {
const sourceMapSupport = require('source-map-support');
sourceMapSupport.install();
}
if (
process.env.NODE_ENV === 'development' ||
process.env.DEBUG_PROD === 'true'
) {
require('electron-debug')();
}
const installExtensions = async () => {
const installer = require('electron-devtools-installer');
const forceDownload = !!process.env.UPGRADE_EXTENSIONS;
const extensions = ['REACT_DEVELOPER_TOOLS', 'REDUX_DEVTOOLS'];
return Promise.all(
extensions.map(name => installer.default(installer[name], forceDownload))
).catch(console.log);
};
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
const sendStatusToWindow = (text) => {
log.info(text);
if(mainWindow){
mainWindow.webContents.send('message', text);
}
}
autoUpdater.on('checking-for-update', () => {
sendStatusToWindow('Checking for update...');
});
autoUpdater.on('update-available', (info) => {
sendStatusToWindow('Update available.');
dialog.showMessageBox({
message: 'update available !!'
});
});
autoUpdater.on('update-not-available', (info) => {
sendStatusToWindow('Update not available.');
});
autoUpdater.on('error', (err) => {
sendStatusToWindow('Error in auto-updater. ' + err);
});
autoUpdater.on('download-progress', (progressObj) => {
let log_message = "Download speed: " + progressObj.bytesPerSecond;
log_message = log_message + ' - Downloaded ' + progressObj.percent + '%';
log_message = log_message + ' (' + progressObj.transferred + "/" + progressObj.total + ')';
sendStatusToWindow(log_message);
})
autoUpdater.on('update-downloaded', (info) => {
sendStatusToWindow('Update downloaded');
dialog.showMessageBox({
message: 'Update downloaded, restarting app..'
});
autoUpdater.quitAndInstall();
});
app.on('ready', async () => {
autoUpdater.checkForUpdatesAndNotify();
if (
process.env.NODE_ENV === 'development' ||
process.env.DEBUG_PROD === 'true'
) {
await installExtensions();
}
mainWindow = new BrowserWindow({
show: false,
width: 1024,
height: 728
});
mainWindow.webContents.openDevTools();
mainWindow.loadURL(`file://${__dirname}/app.html`);
mainWindow.webContents.on('did-finish-load', () => {
if (!mainWindow) {
throw new Error('"mainWindow" is not defined');
}
if (process.env.START_MINIMIZED) {
mainWindow.minimize();
} else {
mainWindow.show();
mainWindow.focus();
}
});
mainWindow.on('closed', () => {
mainWindow = null;
});
const menuBuilder = new MenuBuilder(mainWindow);
menuBuilder.buildMenu();
new AppUpdater();
});
型
我使用以下方法打包我的应用:
"package": "yarn build && electron-builder build --publish never"
型
然后我使用以下命令将其发布到github releases:
"gh-publish": "electron-builder --x64 -p always"
型
2条答案
按热度按时间hjzp0vay1#
对于任何寻找这个问题答案的人,我设法从我的私人Github存储库下载了更新,通过配置我的电子构建器选项:
字符串
(It是在quasar.config.js中定义的,因为我使用的是Quasar框架,但它应该与package.json配置一起使用)
然后,在我的更新程序代码中,当我的应用程序在electron-main进程中以生产模式运行时,我用途:
型
(我已经在我的机器上设置了GH_TOKEN作为环境变量,但无论如何,它都应该工作,您将env var传递给构建或执行过程)
0dxa2lsx2#
字符串
有关拉取更新的参考,请查看此存储库:https://github.com/iffy/electron-updater-example