electron包含二进制文件的一些实践

2,104 阅读2分钟

起因是我最近做的项目需要打包 ffmpegelectron 中,奈何因为想要支持 m1芯片,引入ffmpeg的方案需要调整

问题点

  1. ffmpeg引入的集中方案不支持基于armmac导致连安装抖麻烦
  2. 引入的路径调用问题
  3. 优化包大小

ffmpeg引入方案

因为ffmpeg-static作者也说了,不打算支持m1的,所以也没有可能通过直接ffmpeg-static或者类似几个库直接安装了,不过也有一定好处,就是,如果通过事先安装到本地node_modules的话,如果在一个平台打包其他平台的构建包,会造成打包缺失文件,所以有以下几个方案

  1. 让用户自己装ffmpeg - 不现实,得考虑用户水平
  2. 自己提供二进制文件

我采用的就是将二进制文件打进electron的方法,虽然无法升级ffmpeg的版本不过能保证多平台构建了,所以首先,得找到可以打进去的二进制文件

通过google, arm-mac以外的文件我们可以在ffbinaries.com/downloads 直接下载得到 arm的可以本地自行编译或者从www.osxexperts.net/下载得到

electron怎么获取正确的ffmpeg二进制呢?

我们参考一下其他ffmpeg库,在项目根目录,新建ffmpeg文件夹,然后按照platform-arch的命名规则,建立每个系统对应的文件夹将ffmpeg存在其中,引用的时候,可以通过

import os from 'os'
import path from 'path'
import fs from 'fs'

const platofrm = os.platform()
const arch = os.arch()
const basePath = path.join(__static, '..', 'ffmpeg')

const ffmpegPath = path.join(basePath, `${platofrm}-${arch}`, `ffmpeg${platofrm === 'win32' ? '.exe' : ''}`)

export default ffmpegPath

这样,来获取正确地址,这里因为我用了vue-cli-plugin-electron-builder有提供__static, 其他可用app.getPath('exe')来替代

打包的时候也需要将二进制文件打包进去,在electron-builder中添加

{
        "extraResources": ["./ffmpeg/${platform}-${arch}"]
}

即可,这样打包的时候会把二进制文件也打进去

记得之前建立文件夹的规则嘛?/${platform}-${arch}就是为了打包的时候只打对应平台的文件,减小包的体积

platformarch 请自行查阅nodejs.cn/api/os.html…

总结

方法总是人想出来的,只不过可以用"./ffmpeg/${platform}-${arch}"的办法来减小体积确实找了很久,文档上也没有提可以使用模版字符串,有点坑

这个方法问题就在于二进制文件要手动维护,仓库大小吃紧了