如何让Cabal完全离线构建?依赖已存在仍拉取代码问题
实现Cabal完全离线构建的解决方案
要让Cabal彻底停止拉取远程包或Git仓库,仅依赖本地缓存完成构建,你可以通过以下关键调整实现:
1. 启用Cabal离线模式
Cabal自带--offline参数,强制其完全使用本地缓存资源,禁止任何网络请求。将该参数添加到cabal build和cabal install命令中即可。
2. 确保本地缓存的完整性
你现有的Docker多阶段构建已经完成了依赖缓存的核心工作——复制了Cabal配置目录和dist-newstyle/src(包含source-repository-package指定的Git仓库源码),只需在最终构建阶段启用离线模式即可。
修改后的Dockerfile示例
FROM gitlab:5050/haskell as dependencycache WORKDIR /app COPY ./.dummyProject/ ./ COPY ./api/cabal.project ./ RUN cabal update RUN cabal run dummyProject FROM gitlab:5050/haskell WORKDIR /app COPY --from=dependencycache /root/.cabal/ /root/.cabal/ COPY --from=dependencycache /app/dist-newstyle/src/ /app/dist-newstyle/src/ COPY ./api/ . # 离线模式构建,仅使用本地缓存 RUN cabal build --offline api-server # 离线模式安装 RUN cabal install --offline api-server
关键说明
--offline参数会让Cabal跳过所有远程仓库的更新检查,直接使用本地已有的包索引、Hackage包和Git仓库源码。- 确保
dependencycache阶段使用的cabal.project和最终构建阶段的完全一致,包括source-repository-package的所有配置,这样Cabal才能准确找到本地缓存的对应源码。 - 若需要验证是否真的无网络请求,可添加
--verbose参数查看构建日志,确认没有出现拉取远程资源的记录。
内容的提问来源于stack exchange,提问作者Sudip Bhattarai
相关产品推荐
相关产品推荐

