引子
随着 ARM 架构的流行,越来越多的开发者尝试将他们的应用迁移到 ARM64 平台。在这个过程中,了解项目中所用到的 NPM 依赖项是否兼容 ARM64 架构是十分关键的。本文将介绍如何检查 NPM 依赖项在 ARM64 架构上的兼容性。
由于我的机器都是x86架构的,那需求就变成了,需要能过在在x86机器中,通过buildx进入arm64架构的镜像中,提取 package.json 中的所有依赖项,检查每个依赖项在 arm64 架构下的兼容性。
解法
我通过以下脚本在 x86 机器上使用 buildx 构建 arm64 镜像并提取 package.json 中的所有依赖项。然后,该脚本将尝试在 arm64 架构的 Node.js 镜像中安装每个依赖项,并在遇到错误时报告可能的兼容性问题。
首先,请确保您已经启用了 Docker 的实验功能并设置了默认的 buildx 构建器,如下所示:
export DOCKER_CLI_EXPERIMENTAL=enabled
docker buildx create --name mybuilder
docker buildx use mybuilder
接下来,我们进入前端项目,对应npm依赖描述文件 package.json 所在的目录,将以下脚本保存为 check_arm64_compatibility.sh:
#!/bin/bash
# Set platform to arm64
PLATFORM="linux/arm64"
# Function to check compatibility for a single dependency
check_compatibility() {
DEP=$1
VERSION=$2
PLATFORM=$3
echo "Checking compatibility for $DEP@$VERSION on $PLATFORM..."
docker run --rm --platform $PLATFORM node:latest sh -c "npm install -g $DEP@$VERSION" || \
echo "Error: $DEP@$VERSION might not be compatible with $PLATFORM architecture"
}
# Export the function so that xargs can use it
export -f check_compatibility
# Get the list of dependencies and devDependencies from package.json
DEPS=$(jq -r '.dependencies + .devDependencies | to_entries | map("\(.key)|\(.value)")[]' package.json)
# Run the compatibility check in parallel using 20 processes
echo "$DEPS" | xargs -I {} -P 10 bash -c 'IFS="|" read -ra DEP_INFO <<< "$1"; check_compatibility "${DEP_INFO[0]}" "${DEP_INFO[1]}" "$2"' _ {} "$PLATFORM"
为了方便快速执行,我这边开了10个进程,可以适当的加大您的Docker cpu资源限制。
命令方式执行:
chmod +x check_arm64_compatibility.sh
./check_arm64_compatibility.sh
总结
检查 NPM 依赖项在 ARM64 架构上的兼容性是迁移应用的重要一步,同样的,借助buildx,我们可以检验、构建、运行多平台镜像。我们介绍了两种方法:一种是在 ARM64 架构的 Docker 容器中尝试安装依赖项,另一种是通过buildx进入一个node.js on ARM的镜像,在镜像中检测。第一种方法更可靠,但可能较慢,而且要依赖特定的机器环境。第二种方法速度较快,比较吃本地资源。