我们在 Electron 应用程序中使用
ffmpeg-static
,并通过 electron-forge
和底层 electron/universal
创建通用 mac 构建。 但最终的应用程序中仅存在arm64 ffmpeg二进制文件。我已经确认可以使用 ffmpeg-static
或 arm64
(x86
,然后用 npm rebuild --arch=x64 -f ffmpeg-static
确认)手动重建 file node_modules/ffmpeg-static/ffmpeg
模块,并创建/下载正确的二进制文件。但在运行通用构建时,似乎只有 os.arch()
受到尊重,在本例中是 M1 机器。
似乎
electron-forge
没有将正确的 arch
传递给依赖项。 如果通用构建过程中有钩子,或者设置了一些环境变量,我可以根据拱门手动重建这个 ffmpeg
模块。例如,ffmpeg-static
确实读取了process.env.npm_config_arch
,所以如果我能够在x64和arm64构建之间设置它(或electron/universal
),该模块将构建正确的ffmpeg二进制文件。
我尝试使用
electron-forge
中的钩子来尝试基于 arch
进行切换,但该值始终是 universal
。 此外,在单独的 Intel 和 M1 机器上构建应用程序会生成适当的 ffmpeg
二进制文件。
在我们的例子中,
ffmpeg-static
如何收到正确的arch
?
您在 Electron 通用构建中提到的
ffmpeg-static
问题源于以下事实:在创建通用二进制文件时,electron-forge
和 electron/universal
不会为每个架构自动重建或配置像 ffmpeg-static
这样的本机模块。通用构建将 x86_64 和 arm64 二进制文件组合成一个可执行文件,但似乎您的本机模块 (ffmpeg-static
) 仅针对一种架构(可能是构建机器的架构)构建。
为了确保
ffmpeg-static
包含两种架构的二进制文件,您需要执行几个步骤来手动处理特定于架构的构建并将它们集成到您的通用构建过程中。
ffmpeg-static
您需要为两种架构(x86_64 和 arm64)重建
ffmpeg-static
。您可以使用 npm 脚本自动执行此操作或手动运行重建命令。
npm rebuild ffmpeg-static --arch=x64
npm rebuild ffmpeg-static --arch=arm64
您需要一个脚本来管理两种架构的
ffmpeg-static
二进制文件。创建一个脚本来处理这个问题,如下:
#!/bin/bash
# Define paths for architecture-specific binaries
ARCHS=("x64" "arm64")
BUILD_DIR="node_modules/ffmpeg-static"
for ARCH in "${ARCHS[@]}"; do
npm rebuild ffmpeg-static --arch=$ARCH
done
# Ensure both binaries are copied or merged correctly into the final build directory
# Assuming a typical build setup, you may need to copy binaries to a specific location
# Example for copying binaries to a specific directory
mkdir -p ${BUILD_DIR}/x64
mkdir -p ${BUILD_DIR}/arm64
cp -r node_modules/ffmpeg-static/ffmpeg ${BUILD_DIR}/x64/ffmpeg
cp -r node_modules/ffmpeg-static/ffmpeg ${BUILD_DIR}/arm64/ffmpeg
package.json
脚本在构建 Electron 应用程序之前,确保您的
package.json
有一个脚本来运行上述 shell 脚本。比如:
"scripts": {
"prebuild": "./path-to-your-script.sh",
"build": "electron-forge make"
}
当您运行通用构建时,请确保两个特定于体系结构的二进制文件都正确包含在最终的应用程序包中。您可能需要验证生成的包以确保它包含两个版本的
ffmpeg
二进制文件。
关键步骤是为两种架构重建
ffmpeg-static
,管理这些二进制文件,并确保通用构建过程包含这两种二进制文件。您可能需要尝试复制和管理二进制文件,但基本方法是确保您的 Electron 应用程序的打包过程包含适用于两种架构的正确二进制文件。