首页 > 解决方案 > 无法在带有 M1 芯片的 Mac 上使用“persistent-postgresql”构建 Haskell 项目

问题描述

我正在尝试通过 GHC 9.0.1 构建我的 Yesod Web 应用程序stack

resolver: nightly-2021-09-02

我的应用程序使用 PostgreSQL 数据库。我的代码中有自定义持久字段,通过derivePersistField. 构建失败并显示以下错误消息:

<command line>: dlopen(/Users/arthurfayzrakhmanov/.stack/snapshots/x86_64-osx/b9ed0f8360016ada5efeb53015219761394cfd2d563da5d48a402d192c951f0a/9.0.1/lib/x86_64-osx-ghc-9.0.1/libHSpostgresql-libpq-0.9.4.3-4UpE2VczKgl8p7NC0fd3Q8-ghc9.0.1.dylib, 5): Symbol not found: _PQclear
  Referenced from: /Users/arthurfayzrakhmanov/.stack/snapshots/x86_64-osx/b9ed0f8360016ada5efeb53015219761394cfd2d563da5d48a402d192c951f0a/9.0.1/lib/x86_64-osx-ghc-9.0.1/libHSpostgresql-libpq-0.9.4.3-4UpE2VczKgl8p7NC0fd3Q8-ghc9.0.1.dylib
  Expected in: flat namespace       
 in /Users/arthurfayzrakhmanov/.stack/snapshots/x86_64-osx/b9ed0f8360016ada5efeb53015219761394cfd2d563da5d48a402d192c951f0a/9.0.1/lib/x86_64-osx-ghc-9.0.1/libHSpostgresql-libpq-0.9.4.3-4UpE2VczKgl8p7NC0fd3Q8-ghc9.0.1.dylib

我通过brew.

persistent在带有 M1 芯片的 Mac 上使用 PostgreSQL 的正确设置是什么?

提前致谢。

标签: postgresqlmacoshaskell

解决方案


我能够构建persistent-postgresql具有:

  • PostgreSQL通过安装brew install postgresql
  • GHC v8.10.7cabal-install通过安装brew install ghc cabal-install
  • 通过安装堆栈brew install haskell-stack
    (以前我手动安装堆栈并将其升级到最新的 git 版本)
  • 将我的项目解析器切换到LTS-18.10以将编译器版本匹配到系统一 (8.10.7)
  • 用于使用stackstack build --system-ghc构建我的项目。
  • cabal build

这种方法有一些缺点:

  • brewed stack无法安装任何 GHC 并坚持使用系统编译器

    > stack setup
    我不知道如何安装 GHC for (OSX,AArch64),请手动安装

  • brew install ghc@9没有建议从源代码构建它,这是不受支持的,它确实失败了:

    ==>
    从 /Users/arthurfayzrakhmanov/Library/Logs/Homebrew/ghc@9/04.make 制作最后 15 行:
    adc %eax, %eax
    ^
    tmp-add_n.s:179:6: 错误:无效的操作数
    adc % eax, %eax
    ^
    make[4]: *** [add_n.lo] 错误 1
    ​​make[3]: *** [all-recursive] 错误 1
    ​​make[2]: *** [all] 错误 2
    make[ 1]: *** [libraries/ghc-bignum/gmp/gmp.h] 错误 2

    <... 剪切 ....>

    make: *** [全部] 错误 2

    不要将此问题报告给 Homebrew/brew 或 Homebrew/core!

一般来说,由于cabal-install 3+和 nix 风格的商店,不需要堆栈构建工具。但是,在我的实际用例中,Yesod 开发需要堆栈(依赖于堆栈)。yesod devel


一些学分

最初,Branimir Maksimovic在 Haskell Cafe 回复我,并建议使用cabal而不是stack,并通过 homebrew 安装 GHC 和 cabal。

这确实有效,但是我的真实用例需要stack。我认为酿造的堆栈也可以工作。事实上,这并不完全正确,因为 stack 使用系统 GHC 来工作。


推荐阅读