Haskell Stack在Nixos上无法构建postgresql-libpq

5
在我的项目的cabal文件中添加postgresql-libpq后,stack build失败并显示以下内容:
Configuring postgresql-libpq-0.9.1.1...
setup: The program 'pg_config' is required but it could not be found.

我使用Nixos系统,pg_config已经安装并添加到了PATH路径中:

$ whereis pg_config
pg_config: /nix/store/5bc6hzqkyw8dpi91sqznd3ik42mllwyz-system-path/bin/pg_config

我正在使用1.0.2版本的stack,即使在不稳定通道上运行 nixos-rebuild switch --upgrade 命令,它似乎仍然无法更新。这是我的错误还是其他原因导致的?


我不熟悉Stack+Nix集成,但是stack exec whereis pg_config能找到pg_config的位置吗? - Michael Snoyman
@MichaelSnoyman 我得到了“在路径上找不到名为whereis的可执行文件”的错误信息。打印出来的路径目录并没有包含我的系统路径,而大多数程序都应该在其中找到(包括whereispg_config)。 - Marcelo Zabani
1
看起来你已经在配置中启用了nix,但是还没有指定必要的包。我不是nix用户,所以无法提供进一步建议,但是此文档似乎涵盖了该主题:https://docs.haskellstack.org/en/stable/nix_integration/#the-nix-shell - Michael Snoyman
我尝试将一些软件包添加到nix部分,但没有成功,但使用来自PATH的内容无法帮助实现可重复构建是有道理的。我会在适当的渠道进一步研究它。感谢您的关注。 - Marcelo Zabani
2个回答

5

我在nixos上使用stack时遇到了这个问题,在我的stack.yaml文件的 nix 块被更改为以下内容后成功解决了这个问题。

nix:
  pure: true
  enable: true
  packages: [ postgresql ]

1
我曾经遇到过同样的问题,阅读 Michael Snoyman 提供的 docs 文档帮助了我。你需要将以下内容添加到你的 stack.yaml 文件中:
nix:
  enable: true
  pure: false

我正在构建一个不属于我的软件包,所以我没有编辑项目特定的配置文件,而是将这些行添加到了我的全局配置文件~/.stack/config.yaml中。另外,你也可以使用命令行选项:
stack --nix --no-nix-pure build
与“非纯”构建相反,你应该能够在nix-shell中指定所有系统依赖项以确保可重现性,但我没有尝试过。

2
这很奇怪...设置 pure: false 对我没有任何帮助...最后我把 postgresql 放在软件包列表中才让它工作了... - Marcelo Zabani
@MarceloZabani 我遇到了与这个问题类似的情况。你添加 'postgresql' 到哪个软件包列表才能使它正常工作? - mherzl
1
@mherzl 抱歉之前没有回复你。我猜你已经找到了吧! - Marcelo Zabani
没问题,@MarceloZabani。是的,我按照答案描述的方式让它工作了! - mherzl
pure: false 非常重要,如果您构建的应用程序需要访问环境。在我的情况下,使用默认堆栈构建的应用程序 pure: true 无法访问环境变量 DBUS_SESSION_BUS_ADDRESS,而该变量是 fdo-notify 所需的。相反,使用 cabal build 可以正常工作。TR;DL:pure: false 让我再次使用了 stack。非常感谢提示;-) - palik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接