postgresql - 无法在带有 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 的正确设置是什么?
提前致谢。
解决方案
我能够构建persistent-postgresql
具有:
- PostgreSQL通过安装
brew install postgresql
- GHC v8.10.7和cabal-install通过安装
brew install ghc cabal-install
- 通过安装堆栈
brew install haskell-stack
(以前我手动安装堆栈并将其升级到最新的 git 版本) - 将我的项目解析器切换到LTS-18.10以将编译器版本匹配到系统一 (8.10.7)
- 用于使用stack
stack 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 来工作。
推荐阅读
- javascript - 使用 chance.js 生成日期和时间
- android - Android Studio - Gradle 同步连接超时
- r - 在选项中添加圆形参数
- mongodb - MongoDB 不适用于 Catalina。不断报错
- python - 即使在中断后程序循环
- swift - 从服务器视频 url 创建的缩略图在滚动 tableview 时不断变化
- r - R:在矩阵中找到最小值
- python - 将数据从 Json 提取到 Id 位于 Key 中的表中
- javascript - cytoscape 的条件样式
- ansible - 使用 ansible-lint 处理全局角色目录