- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 Angular 应用程序,它已使用 electron-builder 转换为桌面应用程序。现在,我正在尝试在其中实现自动更新功能。我不希望 electron-builder 将更改发布到 github 存储库。 (注意:整个应用程序位于私有(private) github 存储库中。)我想手动将必要的 .dmg、.zip、.yml 文件上传到发布标签,我希望自动更新程序能够获取这些文件。我怎样才能做到这一点?
目前,我有源代码 .zip 和 .tar.gz 作为我的发布标签的一部分。每当我尝试在应用程序准备就绪时调用 autoUpdater.checkForUpdates()
时,我都会收到以下错误消息:
Error: ENOENT, dev-app-update.yml not found in /Users/userX/project-web/build/node_modules/electron/dist/Electron.app/Contents/Resources/default_app.asar
at notFoundError (ELECTRON_ASAR.js:108:19)
at fs.readFile (ELECTRON_ASAR.js:536:16)
at go$readFile (/Users/userX/project-web/build/node_modules/graceful-fs/graceful-fs.js:85:14)
at readFile (/Users/userX/project-web/build/node_modules/graceful-fs/graceful-fs.js:82:12)
at readFile (/Users/userX/project-web/build/node_modules/universalify/index.js:5:67)
From previous event:
at /Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:460:27
at Generator.next (<anonymous>)
From previous event:
at MacUpdater.loadUpdateConfig (/Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:456:33)
at Lazy.AppUpdater.configOnDisk (/Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:142:43)
at Lazy.get value [as value] (/Users/userX/project-web/build/node_modules/lazy-val/src/main.ts:18:23)
at /Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:340:46
at Generator.next (<anonymous>)
at runCallback (timers.js:696:18)
at tryOnImmediate (timers.js:667:5)
at processImmediate (timers.js:649:5)
From previous event:
at MacUpdater.getUpdateInfoAndProvider (/Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:336:43)
at /Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:363:31
at Generator.next (<anonymous>)
From previous event:
at MacUpdater.doCheckForUpdates (/Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:360:34)
at MacUpdater.checkForUpdates (/Users/userX/project-web/build/node_modules/electron-updater/src/AppUpdater.ts:220:35)
at Timeout.check [as _onTimeout] (/Users/userX/project-web/desktop/src/updater.ts:15:17)
at ontimeout (timers.js:427:11)
at tryOnTimeout (timers.js:289:5)
at listOnTimeout (timers.js:252:5)
at Timer.processTimers (timers.js:212:10)
这是我的代码:
更新器.ts
import { autoUpdater } from 'electron-updater';
import { dialog, BrowserWindow, ipcMain } from 'electron';
const log = require('electron-log');
let downloadProgress: number;
log.transports.file.level = "debug";
autoUpdater.logger = log;
autoUpdater.autoDownload = false;
export function check() {
autoUpdater.checkForUpdates();
autoUpdater.on('checking-for-update', () => {
dialog.showMessageBox({
type: 'info',
title: 'Update Available',
message: 'A new version of app is available. Do you want to update now?',
buttons: ['Update', 'No']
}, (index) => {
if (index) {
return;
} else {
autoUpdater.downloadUpdate();
let proWin = new BrowserWindow({
width: 350,
height: 35,
useContentSize: true,
autoHideMenuBar: true,
maximizable: false,
fullscreen: false,
fullscreenable: false,
resizable: false,
title: 'Downloading Update'
});
proWin.loadURL(`file://$(__dirname)/progress`);
proWin.on('closed', () => {
proWin = null;
});
ipcMain.on('download-progress-request', (e) => {
e.returnValue = downloadProgress;
});
autoUpdater.on('download-progress', (d) => {
downloadProgress = d.percent;
autoUpdater.logger.info(downloadProgress);
});
autoUpdater.on('update-downloaded', () => {
if (progressWindow) progressWindow.close();
dialog.showMessageBox({
type: 'info',
title: 'Update Ready',
message: 'A new version of app is ready. Quit and Install now?',
buttons: ['Yes', 'Later']
}, (index) => {
if (!index) {
autoUpdater.quitAndInstall();
}
});
});
}
});
});
}当应用准备就绪时,从 main.ts 调用 updater.ts 中的 check()
方法,如下所示:
app.on('ready', async () => {
mainWinProcess() // handles all the browser window ops.
createTray();
setTimeout(updater.check, 2000);
});
package.json如下:
{
"name": "project-web",
"productName": "Project Web X",
"version": "1.0.0",
"author": "applecool",
"description": "A func app",
"main": "./main.js",
"dependencies": {
"electron-log": "2.2.17",
"electron-updater": "4.0.4",
"path": "0.12.7",
"url": "0.11.0",
"fs-extra": "7.0.1",
"decompress-zip": "0.3.1"
},
"scripts": {
"mac": "NODE_ENV=production ./node_modules/gulp/bin/gulp.js --gulpfile ./ops/gulpfile.js mac",
"mac-dev": "NODE_ENV=development ./node_modules/gulp/bin/gulp.js --gulpfile ./ops/gulpfile.js mac-dev",
"start": "NODE_ENV=development ./node_modules/.bin/electron index.js --debug --enable-logging",
"start-mac-setup-dev": "build --mac --config electron-builder-dev.yml",
"start-mac-setup": "build --mac"
},
"devDependencies": {
"@types/node": "^10.12.9",
"electron": "3.0.10",
"electron-builder": "20.36.2",
"electron-is-dev": "1.0.1",
"electron-reload": "1.3.0",
"gulp": "4.0.0",
"icon-gen": "2.0.0",
"jimp": "0.5.6",
"os": "0.1.1",
"zip-folder": "1.0.0",
"devtron": "1.4.0"
},
"build": {
"appId": "com.projectweb.x"
}
}
谁能给我指明正确的方向。我正在尝试在开发环境中执行此操作。
谢谢。
最佳答案
如果你想测试,只需启动一个本地服务器,然后将你的文件(dmg、zip、yml、json)放在那里(假设它在 localhost:3000 上)。然后,调用 API .setFeedURL
( document here )。
例如:autoUpdater.setFeedURL("http://localhost:3000/latest-mac.json")
并调用 autoUpdater.checkForUpdates()
。
来自 electron-builder 文档的注释:
Note that in order to develop/test UI/UX of updating without packaging the application you need to have a file named dev-app-update.yml in the root of your project, which matches your publish setting from electron-builder config (but in yaml format). But it is not recommended, better to test auto-update for installed application (especially on Windows). Minio is recommended as a local server for testing updates.
关于angular - 如何使用 Electron 更新程序自动更新 Electron 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53508839/
我查看了网站上的一些问题,但还没有完全弄清楚我做错了什么。我有一些这样的代码: var mongoose = require('mongoose'), db = mongoose.connect('m
基本上,根据 this bl.ocks,我试图在开始新序列之前让所有 block 都变为 0。我认为我需要的是以下顺序: 更新为0 退出到0 更新随机数 输入新号码 我尝试通过添加以下代码块来遵循上述
我试图通过使用随机数在循环中设置 JSlider 位置来模拟“赛马”的投注结果。我的问题是,当然,我无法在线程执行时更新 GUI,因此我的 JSlider 似乎没有在竞赛,它们从头到尾都在运行。我尝试
该功能非常简单: 变量:$table是正在更新的表$fields 是表中的字段,$values 从帖子生成并放入 $values 数组中而$where是表的索引字段的id值$indxfldnm 是索引
让我们想象一个环境:有一个数据库客户端和一个数据库服务器。数据库客户端可以是 Java 程序或其他程序等;数据库服务器可以是mysql、oracle等。 需求是在数据库服务器上的一个表中插入大量记录。
在我当前的应用程序中,我正在制作一个菜单结构,它可以递归地创建自己的子菜单。然而,由于这个原因,我发现很难也允许某种重新排序方法。大多数应用程序可能只是通过“排序”列进行排序,但是在这种情况下,尽管这
Provisioning Profile 有 key , key 链依赖于它。我想知道 key 什么时候会改变。 Key will change after renew Provisioning Pr
截至目前,我在\server\publications.js 中有我的 MongoDB“选择”,例如: Meteor.publish("jobLocations", function () { r
我读到 UI 应该始终在主线程上更新。但是,当谈到实现这些更新的首选方法时,我有点困惑。 我有各种函数可以执行一些条件检查,然后使用结果来确定如何更新 UI。我的问题是整个函数应该在主线程上运行吗?应
我在代理后面,我无法构建 Docker 镜像。 我试过 FROM ubuntu , FROM centos和 FROM alpine ,但是 apt-get update/yum update/apk
我构建了一个 Java 应用程序,它向外部授权客户端公开网络服务。 Web 服务使用带有证书身份验证的 WS-security。基本上我们充当自定义证书颁发机构 - 我们在我们的服务器上维护一个 ja
因此,我有时会在上传新版本时使用 app_offline.htm 使应用程序离线。 但是,当我上传较大的 dll 时,我收到黄色错误屏幕,指出无法加载 dll。 这似乎与我对 app_offline.
我刚刚下载了 VS Apache Cordova Tools Update 5,但遇到了 Node 和 NPM 的问题。我使用默认的空白 cordova 项目进行测试。 版本 如果我在 VS 项目中对
所以我有一个使用传单库实例化的 map 对象。 map 实例在单独的模板中创建并以这种方式路由:- var app = angular.module('myApp', ['ui', 'ngResour
我使用较早的 Java 6 u 3 获得的帧速率是新版本的两倍。很奇怪。谁能解释一下? 在 Core 2 Duo 1.83ghz 上,集成视频(仅使用一个内核)- 1500(较旧的 java)与 70
我正在使用 angular 1.2 ng-repeat 创建的 div 也包含 ng-click 点击时 ng-click 更新 $scope $scope 中的变化反射(reflect)在使用 $a
这些方法有什么区别 public final void moveCamera(CameraUpdate更新)和public final void animateCamera (CameraUpdate
我尝试了另一篇文章中某人评论中关于如何将树更改为列表的建议。但是,我在某处(或某物)有未声明的变量,所以我列表中的值是 [_G667, _G673, _G679],而不是 [5, 2, 6],这是正确
实现以下场景的最佳方法是什么? 我需要从java应用程序调用/查询包含数百万条记录的数据库表。然后,对于表中的每条记录,我的应用程序应该调用第三方 API 并获取状态字段作为响应。然后我的应用程序应该
只是在编写一些与 java 图形相关的代码,这是我今天的讲座中的非常简单的示例。不管怎样,互联网似乎说更新不会被系统触发器调用,例如调整框架大小等。在这个例子中,更新是由这样的触发器调用的(因此当我只
我是一名优秀的程序员,十分优秀!