Skip to content

其他知识

asar

electron 在编译时会将依赖包打包到 dist/Contents/Resources/app.asar 文件中

我们可以使用 asar 命令查看,首先安装 asar 命令

npm install asar -g

查看 asar 压缩包的内容

asar list dist/mac-arm64/houdunren-video.app/Contents/Resources/app.asar

解压 asar 内的所有文件到 hd 目录

asar extract dist/mac-arm64/houdunren-video.app/Contents/Resources/app.asar hd

特点

  • Asar 解决windows 长路径问题(windows 中路径过长,会读取文件失败)
  • 使用 require 速度更快
  • 使用 asar 内的文件与普通目录方式一样
  • Asar 是只读的,不能修改里面的文件内容
  • 不能直接使用 asar 内包的文件路径,比如使用 @ffmpeg-installer/ffmpeg

问题

不能使用 asar 内包的文件路径,请看下面的代码(来源于我录制的视频教程 视频压缩软件开发

import ffmpegPath from '@ffmpeg-installer/ffmpeg'
import ffprobePath from '@ffprobe-installer/ffprobe'
import ffmpeg from 'fluent-ffmpeg'
...
ffmpeg.setFfmpegPath(ffmpegPath.path)
ffmpeg.setFfprobePath(ffprobePath.path)
// ffmpeg 路径
dialog.showErrorBox('', ffmpegPath.path)

软件编译后 ffmpegPath.path 会得到路径

dist/mac-arm64/houdunren-video.app/Contents/Resources/app.asar/node_modules/@ffmpeg-installer/darwin-arm64/ffmpeg

这个路径是存放在 asar 包内的,所以下面的代码不能使用

ffmpeg.setFfmpegPath(ffmpegPath.path)

解决

上面的问题怎么解决呢?有几种办法

方法一

编译后 electron 会自动将路径文件提取到 dist/mac-arm64/houdunren-video.app/Contents/Resources/app.asar.unpacked ,所以我们可以执行一下替换操作。

ffmpeg.setFfmpegPath(ffmpegPath.path.replace('app.asar', 'app.asar.unpacked'))

方法二

我们不将 ffmpegPath.path 放到 asar 包内了,而是单独放到指定的文件夹里,所以修改 electron-builder.yml 文件

首先修改 files 配置段,将 @ffmpeg-installer@ffprobe-installer 不放在 app.asar

files:
  - '!**/.vscode/*'
  - '!src/*'
  - '!node_modules/@ffmpeg-installer'
  - '!node_modules/@ffprobe-installer'

然后 extraResources 配置段,将 @ffmpeg-installer@ffprobe-installer 放在 dist/mac-arm64/houdunren-video.app/Contents/Resources 目录中。不用担心,项目中当使用到 @ffmpeg-installer 时,会自动使用 Contents/Resources 目录,而不再使用 app.asar

extraResources:
  - 'node_modules/@ffmpeg-installer'
  - 'node_modules/@ffprobe-installer'

如果包在 app.asarContents/Resources/node_modules 都存在时,app.asar 的优先级更高,所以需要在 files 配置段中把包排除掉