Appearance
其他知识
asar
electron 在编译时会将依赖包打包到 dist/Contents/Resources/app.asar 文件中
我们可以使用 asar 命令查看,首先安装 asar 命令
npm install asar -g
查看 asar 压缩包的内容
asar list dist/mac-arm64/banmashou-video.app/Contents/Resources/app.asar
解压 asar 内的所有文件到 hj 目录
asar extract dist/mac-arm64/banmashou-video.app/Contents/Resources/app.asar hj
特点
- 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/banmashou-video.app/Contents/Resources/app.asar/node_modules/@ffmpeg-installer/darwin-arm64/ffmpeg
这个路径是存放在 asar 包内的,所以下面的代码不能使用
ffmpeg.setFfmpegPath(ffmpegPath.path)
解决
上面的问题怎么解决呢?有几种办法
方法一
编译后 electron 会自动将路径文件提取到 dist/mac-arm64/banmashou-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/banmashou-video.app/Contents/Resources 目录中。不用担心,项目中当使用到 @ffmpeg-installer 时,会自动使用 Contents/Resources 目录,而不再使用 app.asar。
extraResources:
- 'node_modules/@ffmpeg-installer'
- 'node_modules/@ffprobe-installer'
如果包在 app.asar 和 Contents/Resources/node_modules 都存在时,app.asar 的优先级更高,所以需要在 files 配置段中把包排除掉