我用Electron构建了一个应用程序,并使用Electron-Builder创建了一个Squirrel windows安装程序和更新程序.这一切都很好,但我在调试我的应用程序的生产版本时遇到问题.
console.log
使用生产版本时,是否在磁盘上的某处写入了日志?如果是这样,我在哪里可以找到它们?或者在编译可执行文件时是否全部删除了?我的应用必须有某种日志文件吗?
我发现了SquirrelSetupLog,C:\Users\Tieme\AppData\Local\MyApp\SquirrelSetupLog
但这还不足以调试我的生产问题.
刚遇到电子日志.如果常规控制台日志确实没有写入磁盘某处,那可能会有效.
我正在尝试为电子应用程序创建 Windows 安装程序。
首先,应用程序使用电子打包器进行打包。
exec(`npx electron-packager ./ "My App Name" --platform=win32 --out=${packagedLocation}`);
Run Code Online (Sandbox Code Playgroud)
然后使用 electro-winstaller 创建应用程序的安装程序。
try {
await electronInstaller.createWindowsInstaller({
appDirectory: packagedLocation,
outputDirectory: installerLocation,
authors: 'Author',
exe: 'myapp.exe'
});
} catch (e) {
console.log(`Failure: ${e.message}`);
}
Run Code Online (Sandbox Code Playgroud)
当运行创建安装程序的代码时,exe 和 msi 安装程序都未正确创建。创建的Setup.exe只有大约200 KB。尝试运行 exe 会生成一个对话框,其中显示:This is a dummy update.exe. If you are seeing this, your build did not correctly replace the IDR_UPDATE_ZIP resource. Command Line: '--install .'
。Squirrel 或构建脚本的日志中没有给出任何错误。
通过测试,我发现如果我打包的应用程序的大小太大,就会发生这种情况。我的应用程序包含大约 3 GB 的资源。我需要将这些资源作为安装程序的一部分包含在内,而不是根据需要下载,因为该应用程序旨在无需访问互联网即可运行。这些资源的大小已经优化,我无法从我的应用程序中删除任何资源。
出于测试目的,如果我随机删除其中一些资源,直到打包应用程序的大小小于 1 GB,则 Electron-winstaller 将正确创建安装程序,不会出现任何问题。似乎不是任何特定资源导致了该错误。
有什么方法可以在不阻止创建安装程序的情况下将这些资源包含在我的应用程序中?
更新 …
我已经将以下代码段添加到我的package.json
:
"build": {
"fileAssociations": [
{
"ext": "asdf",
"name": "ASDF File",
"role": "Editor"
}
]
}
Run Code Online (Sandbox Code Playgroud)
但是生成的安装程序不会将我的应用程序分配给asdf
扩展程序。(在 Windows 10 上测试)
我也查了一下,如何编辑setupEvents.js
文件。它包含以下部分:
case '--squirrel-updated':
// Optionally do things such as:
// - Add your .exe to the PATH
// - Write to the registry for things like file associations and
// explorer context menus
Run Code Online (Sandbox Code Playgroud)
但是我找不到一个例子,如何归档注册表写入部分。
javascript installation file-association electron squirrel.windows
我有一个基于 git electron 的应用程序。(适用于窗户)
我需要这个应用程序可以在 U 盘上便携,并且我希望这个应用程序具有自动更新功能。
Grunt-electron-installer 使用squirrel.windows作为更新机制。Squirrel 使用 SHGetFolderPath 函数和 CSIDL_LOCAL_APPDATA 来决定安装路径,通常是C:\Users\Username\AppData\Local\$pkgName。
我的问题是;
任何帮助将非常感激。谢谢
我正在创建一个 Electron 应用程序,并使用电子 winstaller 来构建使用 squirrel.windows 的安装程序。在其中一个示例代码片段中包含以下部分:
const squirrelEvent = process.argv[1];
switch (squirrelEvent) {
case '--squirrel-install':
case '--squirrel-updated':
// Optionally do things such as:
// - Add your .exe to the PATH
// - Write to the registry for things like file associations and
// explorer context menus
// Install desktop and start menu shortcuts
spawnUpdate(['--createShortcut', exeName]);
setTimeout(app.quit, 1000);
return true;
case '--squirrel-uninstall':
// Undo anything you did in the --squirrel-install and
// --squirrel-updated handlers
// Remove desktop and start …
Run Code Online (Sandbox Code Playgroud) 我正在使用 Electron 构建一个适用于 Windows 的应用程序。为了打包和分发它,我使用electro-builder。Electron-builder 依赖于许多软件包,并且为了自动更新,它使用Squirrel-windows。
我已经在 Windows 上与自动更新作斗争了 3 天,最后我想出了一个可行的解决方案,似乎没有任何问题。
我不会详细介绍我尝试过但失败的事情。相反,我将在这里发布我提出的解决方案。
我与你们分享它,看看你们是否可以向我指出任何会使我的系统失败的缺陷,或者,如果它确实是一个可靠的解决方案,可以帮助那些像我一样苦苦挣扎的人。由于后一个原因,我发布了一些不必要的代码,希望对其他人有所帮助。
逻辑如下:
fullupdate
不存在(稍后会澄清),我们连接在线服务器并通过发送当前应用程序版本来检查是否有更新;json
包含 url 的字符串,我们可以.exe
从中下载electron-builder
. 注意:不是.nupkg
(未提供服务器代码:-)
)。fullupdate
当前保存我们的应用程序的本地文件夹的子文件夹中。这应该是“安全的”,因为electron-builder
将应用程序保存在当前用户文件夹中AppData
,因此我们不应该遇到权限问题。update
在文件夹内创建一个新文件fullupdate
,以确保下载已成功完成。我们也可以重命名该文件,但我更喜欢这种方式。fullupdate
存在,我们检查文件是否update
存在。如果不存在,则下载未完成,因此我们删除该文件夹fullupdate
并再次调用远程服务器重新开始。update
存在,我们将启动.exe
已下载的文件,并返回 true。这将阻止应用程序打开主窗口。很酷的是,更新程序将删除保存的应用程序的整个旧版本AppData
(同时保留本地用户数据)并将其替换为新版本。通过这种方式,我们也将删除该文件夹fullupdate
。现在的代码:
// we want to run this only on windows
var handleStartupEvent = function() …
Run Code Online (Sandbox Code Playgroud) 最近我在我的一个程序中实现了Squirrel.Windows 。它对于基本功能来说效果很好。
问题是主要方法都是内部的,我们无法使用扩展方法或执行我们自己的实现。另外,Squirrel 项目有太多未解决的问题,所以我认为这不是一个很好的项目。
是否有任何库具有类似的功能,但同时给我更多的控制权并让我使用已经实现的代码?
需要能够使用 WPF。
干杯
我一直在使用Squirrel.Windows成功部署WPF一段时间了.我让我的机器重新成像,RELEAESES
文件Releases
夹中的文件是从头开始重新创建的,因为我完全在我的文件中排除了这个文件夹.gitignore
.这似乎打破了我重新映像之前创建的版本上的用户的自动更新功能.
我可以在RELEASES
文件中设置什么来强制旧版本引入更新版本而不重新创建所有nuget包吗?
这是我RELEASES
文件的相关部分.该版本的用户2.0.6121.16815
不会自动迁移到底部的较新版本.
这是我的更新程序代码app.xaml.cs
.不确定它是否相关,因为它在技术上运行良好.
Task.Run(async () =>
{
using (var mgr = new UpdateManager(updatePath, packageName))
{
var updates = await mgr.CheckForUpdate();
if (updates.ReleasesToApply.Any())
{
try
{
var lastVersion = updates.ReleasesToApply.OrderBy(x => x.Version).Last();
await mgr.DownloadReleases(updates.ReleasesToApply);
await mgr.ApplyReleases(updates);
try
{
latestExe = Path.Combine(mgr.RootAppDirectory, string.Concat("app-", lastVersion.Version), "App.exe");
log.Debug("Latest exe:" + latestExe);
mgr.CreateShortcutsForExecutable(latestExe, DefaultLocations, false);
}
catch(Exception ex)
{
log.Error("error creating shortcuts for executable",ex);
}
restart = true;
}
catch(Exception …
Run Code Online (Sandbox Code Playgroud) 有没有办法设置一个进度条,用于在Electron下载应用程序的新更新?我正在使用Squirrel为Windows开发应用程序electron-simple-updater
,我的问题是更新程序只在它开始下载更新和完成时发出事件.我的更新有点大(约80MB),对于ISP较慢的用户,它有点sux :(
我有一个electronic.js应用程序,在其中卸载应用程序时,我试图清除该应用程序的本地存储。该应用程序的安装程序/卸载程序取决于Squirrel.Windows。我已经在事件上使用electron.session尝试了以下代码--squirrel-uninstall
,但这不起作用
try {
// clear storage data on uninstall
const defaultSession = session.defaultSession;
defaultSession.clearStorageData();
defaultSession.clearCache()
} catch (e) {
console.log(e);
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激。
squirrel.windows ×10
electron ×8
javascript ×3
node.js ×3
wpf ×2
.net ×1
auto-update ×1
c# ×1
clickonce ×1
installation ×1
logging ×1
windows ×1