Electron Differential updater 会产生大量更改块,即使是在进行最小更改时也是如此。难道我做错了什么?
Electron Differential updater produces large amounts of changed blocks even when minimal changes were done. Am I doing something wrong?
我正在做一个基于 Electron 的项目。我们已经通过 electron-builder(使用 nsis-web,以及 mac 的单独差异更新程序分支)设置了差异更新,并期望它产生小的更新下载。
我们现在意识到我们应用程序的差异更新(当 packaged/zipped,应用程序总计约 100mb)往往徘徊在约 20-40mb 的下载量,约有约 1000 次更改块,即使在我们只更改源代码中的字符串中的 1 个字符的情况下。随着我们用户群的增长,并且我们预见到需要快速部署更新,这可能会很快增加我们的服务器账单。我们期待一个相当低的增量下载,希望 <=1mb 用于微小的变化,例如单个字符,而不是接近整个应用程序大小的一半。
我们基于 Electron React Boilerplate 构建了我们的应用程序,它使用 webpack 打包源代码。
我们目前正在混淆我们的 webpack 包,尽管这种行为也被跟踪到在添加混淆之前发生,所以将排除它作为原因。
我不清楚 blocks/file 增量的 7z 方法是否意味着文件中的单个更改会影响其所有块,如果是这样,将其分解将意味着块未受影响的文件本身将不受影响。 (我还在努力
我们目前有许多模块被导入到我们的项目中用于各种用途,这些模块被打包到最终的 webpack 包中。我正在讨论尝试将模块保留在 webpack 包之外,但 Electron's Performance page 似乎提倡将所有代码捆绑在一起以避免调用昂贵的 require()
调用。我仍在尝试思考并尝试通过实验来理解行为。
有没有办法获得更小的差异下载,或者这是实际预期的增量大小?
如果是前者,是否有一些可能的原因导致我们做错了?
是否对差异更新程序有特别的了解,可以更好地理解如何处理它?
编辑:尝试了一个测试,我只更改了应用程序版本,但差异更新程序仍然记录了这一点:
[2021-10-14 18:29:34.046] [info] File has 2092 changed blocks
[2021-10-14 18:29:34.058] [info] Full: 95,995.56 KB, To download: 42,767.89 KB (45%)
编辑:此解决方案并未完全解决 mac 的问题。似乎即使 mac 包的版本发生变化,本机组件也会被修改,导致它们生成大量更改块。
原回答如下:
简而言之:为软件包禁用 Asar。
我发现了一些问题,主要是 electron-builder 中的差异更新器使用 7zip 来制作差异文件,根据我对它的理解,7zip 生成了文件结构的内部表示.
考虑到这一点,事实证明,禁用 Electron 中标准和推荐的 ASAR 文件意味着所有源文件不再在其中合并,从而允许 7zip 单独跟踪它们。这意味着任何更改的文件似乎只会影响块图中它的块。 ASAR 文件是一个单一的文件,因此一旦 7 压缩后,源中的任何更改都会修改 ASAR 文件的大部分块。
此外,这似乎确实意味着 Electron 包中更细粒度的文件结构会导致差异自动更新程序的增量更小。
这就是差异更新的问题。它使用压缩块来更新带宽使用率较低的应用程序。这就是为什么需要像 https://github.com/electron-delta/electron-delta 这样真正的增量更新器。它是使用二进制差异构建的,并且能够通过下载增量来更新应用程序。
我正在做一个基于 Electron 的项目。我们已经通过 electron-builder(使用 nsis-web,以及 mac 的单独差异更新程序分支)设置了差异更新,并期望它产生小的更新下载。
我们现在意识到我们应用程序的差异更新(当 packaged/zipped,应用程序总计约 100mb)往往徘徊在约 20-40mb 的下载量,约有约 1000 次更改块,即使在我们只更改源代码中的字符串中的 1 个字符的情况下。随着我们用户群的增长,并且我们预见到需要快速部署更新,这可能会很快增加我们的服务器账单。我们期待一个相当低的增量下载,希望 <=1mb 用于微小的变化,例如单个字符,而不是接近整个应用程序大小的一半。
我们基于 Electron React Boilerplate 构建了我们的应用程序,它使用 webpack 打包源代码。
我们目前正在混淆我们的 webpack 包,尽管这种行为也被跟踪到在添加混淆之前发生,所以将排除它作为原因。
我不清楚 blocks/file 增量的 7z 方法是否意味着文件中的单个更改会影响其所有块,如果是这样,将其分解将意味着块未受影响的文件本身将不受影响。 (我还在努力
我们目前有许多模块被导入到我们的项目中用于各种用途,这些模块被打包到最终的 webpack 包中。我正在讨论尝试将模块保留在 webpack 包之外,但 Electron's Performance page 似乎提倡将所有代码捆绑在一起以避免调用昂贵的 require()
调用。我仍在尝试思考并尝试通过实验来理解行为。
有没有办法获得更小的差异下载,或者这是实际预期的增量大小?
如果是前者,是否有一些可能的原因导致我们做错了?
是否对差异更新程序有特别的了解,可以更好地理解如何处理它?
编辑:尝试了一个测试,我只更改了应用程序版本,但差异更新程序仍然记录了这一点:
[2021-10-14 18:29:34.046] [info] File has 2092 changed blocks
[2021-10-14 18:29:34.058] [info] Full: 95,995.56 KB, To download: 42,767.89 KB (45%)
编辑:此解决方案并未完全解决 mac 的问题。似乎即使 mac 包的版本发生变化,本机组件也会被修改,导致它们生成大量更改块。
原回答如下:
简而言之:为软件包禁用 Asar。
我发现了一些问题,主要是 electron-builder 中的差异更新器使用 7zip 来制作差异文件,根据我对它的理解,7zip 生成了文件结构的内部表示.
考虑到这一点,事实证明,禁用 Electron 中标准和推荐的 ASAR 文件意味着所有源文件不再在其中合并,从而允许 7zip 单独跟踪它们。这意味着任何更改的文件似乎只会影响块图中它的块。 ASAR 文件是一个单一的文件,因此一旦 7 压缩后,源中的任何更改都会修改 ASAR 文件的大部分块。
此外,这似乎确实意味着 Electron 包中更细粒度的文件结构会导致差异自动更新程序的增量更小。
这就是差异更新的问题。它使用压缩块来更新带宽使用率较低的应用程序。这就是为什么需要像 https://github.com/electron-delta/electron-delta 这样真正的增量更新器。它是使用二进制差异构建的,并且能够通过下载增量来更新应用程序。