在x86_64机器上交叉编译Yesod应用至aarch64系统的问题咨询
解决x86_64机器交叉编译Yesod应用到aarch64并生成Keter包的方法
方案1:Docker交叉编译(最省心的方式)
直接用Docker多架构构建功能,在容器内完成aarch64架构的编译,不用折腾本地交叉编译工具链:
- 先确保你的Docker已开启buildx功能(首次执行
docker buildx create --use初始化) - 拉取aarch64架构的Ubuntu镜像,挂载本地Yesod项目目录进入容器:
docker run --rm -it -v /你的项目本地路径:/project arm64v8/ubuntu:latest - 在容器内安装依赖和工具:
apt update && apt install -y curl git gcc g++ libffi-dev libgmp-dev zlib1g-dev curl -sSL https://get.haskellstack.org/ | sh stack install yesod-bin keter - 进入项目目录生成适配aarch64的Keter包:
cd /project yesod keter
生成的.keter包会在/project/dist下,直接复制到本地再上传到目标服务器即可。
方案2:手动配置Stack交叉编译工具链
如果不想用Docker,可手动配置交叉编译环境:
- 在x86_64 Debian上安装aarch64交叉编译工具链:
apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu - 修改
stack.yaml,添加Docker交叉编译配置(避免直接下载aarch64版GHC):resolver: lts-20.x # 替换为你当前使用的resolver版本 docker: enable: true image: "fpco/stack-build:lts-20.x" # 镜像版本要和resolver对应 platforms: ["linux/aarch64"] - 用Stack编译项目并生成Keter包:
stack build --docker stack exec yesod keter
额外注意点
- 确保目标服务器的Keter版本和生成包时使用的版本兼容
- 生成Keter包前,确认项目的静态资源、配置文件都已正确纳入打包范围,避免部署后缺失文件
内容的提问来源于stack exchange,提问作者Shini
相关产品推荐
相关产品推荐

