electron 如何使用私有github仓库创建电子自动更新?

55ooxyrt  于 2023-08-01  发布在  Electron
关注(0)|答案(2)|浏览(234)

正在检测更新,但我无法将其下载到我的应用程序。我得到以下错误:
状态:可用更新
状态:自动更新程序出错。错误:无法下载“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"

hjzp0vay

hjzp0vay1#

对于任何寻找这个问题答案的人,我设法从我的私人Github存储库下载了更新,通过配置我的电子构建器选项:

win: {
   publish: [{
      private: true,
      provider: "github",
      releaseType: 'prerelease'
   }],
   target: 'nsis',
   icon: 'icons/icon.ico'
},

字符串
(It是在quasar.config.js中定义的,因为我使用的是Quasar框架,但它应该与package.json配置一起使用)
然后,在我的更新程序代码中,当我的应用程序在electron-main进程中以生产模式运行时,我用途:

autoUpdater.addAuthHeader(`token ${process.env.GH_TOKEN}`);


(我已经在我的机器上设置了GH_TOKEN作为环境变量,但无论如何,它都应该工作,您将env var传递给构建或执行过程)

0dxa2lsx

0dxa2lsx2#

import {autoUpdater} from 'electron-updater';   
 autoUpdater.setFeedURL({
          provider: 'github',
          owner: 'your_username',
          repo: 'your_repo_name',
          private: true,
          token: process.env.GH_TOKEN, // provide your github access token, with repo:access
        });

字符串
有关拉取更新的参考,请查看此存储库:https://github.com/iffy/electron-updater-example

相关问题