标签: haskell-stack

使用postgresql-simple创建数据库连接时的GHCI Segfault

尝试使用postgresql-simple在GHCI中创建数据库连接时,我得到GHCI段错误.

我使用的是GHC 8.0.1,OSX 10.11.16.我没有系统GHC,只有堆栈安装的系统.

如果我在我的项目中执行以下操作,则会出现以下错误:

$ stack ghci
Loaded GHCi configuration from /private/var/folders/wb/vvtxjd7n2qz02f571yjyr9j40000gs/T/ghci62972/ghci-script
gchi> :set -XOverloadedStrings
gchi> import Database.PostgreSQL.Simple
gchi> let connstr = "host=localhost port=5432 user=myusername password=mypass dbname=local"
gchi> conn <- connectPostgreSQL connstr
zsh: segmentation fault  stack ghci
Run Code Online (Sandbox Code Playgroud)

我认为它可能值得查看它提到的文件,所以这里有以下内容:

> cat /private/var/folders/wb/vvtxjd7n2qz02f571yjyr9j40000gs/T/ghci62972/ghci-script
:load "/Users/erewok/projects/haskell/simpleservantblog/app/Main.hs" "Api" "Api.Post" "Api.User" "Config" "Html.Home" "Models.Author" "Models.Post"
:module + Api Api.Post Api.User Config Html.Home Models.Author Models.Post
Run Code Online (Sandbox Code Playgroud)

它是从项目加载的所有模块的列表(编译并运行正常).


这是从启动ghci到seg故障的所有内容的完整输出:

$ stack ghci
The following GHC options are incompatible with GHCi and have not been passed …
Run Code Online (Sandbox Code Playgroud)

haskell ghci haskell-stack

6
推荐指数
1
解决办法
191
查看次数

如何在 *.cabal 中自动填充“exposed-modules or other-modules”

有点烦人的是,我不断收到此警告(对于某些 20 个左右的模块,会污染构建输出,否则我会在不滚动的情况下看到诸如实际的 ghc 警告等):

“以下模块应添加到proj-name.cabal 中的暴露模块或其他模块

和:

  • 一个新创建的(通过stack new proj-name simple)项目,
  • .cabal设置为仅包含一个executable proj-name(no library),
  • 然后我在从非堆栈/cabal 项目stack new ..复制src文件/子目录之后。

这里假设的工作流程是什么,我是否认真地手动保持这些模块列表.cabal与我的模块文件同步?

此线程中,有人建议“现代答案是 Stack(和 hpack)”,但我真的希望单独使用 stack 就足够了,或者可以设置为。如果我要为构建设置另一个(堆栈之后的第三个,因此隐式 cabal)工具,不妨回去构建调用 ghc 的脚本。

所以问题是:整体非常灵活、强大和强大的堆栈如何也能帮助克服这种阴谋集团的可憎之物?=)

cabal haskell-stack

6
推荐指数
0
解决办法
1863
查看次数

如何使用 Haskell Stack 包管理器使用 Hackage 和 Stackage 的清华镜像

我正在使用 Haskell Stack 包管理器的 2.1.1 版。

清华大学在中国防火墙后面提供了一个 Hackage 镜像,如https://mirrors.tuna.tsinghua.edu.cn/help/hackage/ 所述

但是,当我按照这些说明进行操作时,添加

package-indices:
  - name: Tsinghua
    download-prefix: http://mirrors.tuna.tsinghua.edu.cn/hackage/package/
    http: http://mirrors.tuna.tsinghua.edu.cn/hackage/00-index.tar.gz
    hackage-security:
        keyids:
        - 0a5c7ea47cd1b15f01f5f51a33adda7e655bc0f0b0615baa8e271f4c3351e21d
        - 1ea9ba32c526d1cc91ab5e5bd364ec5e9e8cb67179a471872f6e26f0ae773d42
        - 280b10153a522681163658cb49f632cde3f38d768b736ddbc901d99a1a772833
        - 2a96b1889dc221c17296fcc2bb34b908ca9734376f0f361660200935916ef201
        - 2c6c3627bd6c982990239487f1abd02e08a02e6cf16edb105a8012d444d870c3
        - 51f0161b906011b52c6613376b1ae937670da69322113a246a09f807c62f6921
        - 772e9f4c7db33d251d5c6e357199c819e569d130857dc225549b40845ff0890d
        - aa315286e6ad281ad61182235533c41e806e5a787e0b6d1e7eef3f09d137d2e9
        - fe331502606802feac15e514d9b9ea83fee8b6ffef71335479a2e68d84adc6b0
        key-threshold: 3 # number of keys required

        # ignore expiration date, see https://github.com/commercialhaskell/stack/pull/4614
        ignore-expiry: yes
Run Code Online (Sandbox Code Playgroud)

到~/.stack/config.yml,然后当我stack run在我的项目目录中运行时,我看到:

惊天动地文件信息没有发现aeson-1.4.2.0@sha256:8166752a9669597db375343df19805069595fed9c613f98504e418849f40fe18,7007,更新所选的镜像 http://mirrors.tuna.tsinghua.edu.cn/hackage/package/下载根未能进行反序列化/root.json:格式不正确:(第 1 行,第 1 列):意外的“<”需要空格或 JSON 值

它还有一个 Stackage 镜子;我尝试通过添加resolver: https://mirrors.tuna.tsinghua.edu.cn/stackage/lts-haskell/lts-13.25.yamlstack.yaml我的项目来更改 Stackage 解析器,但失败了:

从 …

haskell haskell-stack great-firewall-of-china

6
推荐指数
1
解决办法
921
查看次数

如何提供 C 库以在 NixOS 上堆栈?

我有一个基于堆栈的项目,它依赖于几个 C 库。其中一个 C 库 zlib 可从原生 NixOS 包中获得,我可以将其放入 stack.yaml 的 nix 部分:

nix:
  enable: true
  packages:
    - "zlib"
Run Code Online (Sandbox Code Playgroud)

另一个不是nixpkgs 的一部分。堆栈文档建议使用 中的nix部分的替代方法stack.yaml是“编写 shell.nix”而无需详细说明。

于是写了一篇,坚持以zlib为例:

{ pkgs ? import <nixpkgs> { } }:
  pkgs.mkShell {
    buildInputs = [
      pkgs.pkgconfig
      pkgs.zlib
      pkgs.stack
    ];
  }
Run Code Online (Sandbox Code Playgroud)

这为我提供了 zlib 的工作 pkg-config:

[nix-shell:~/Work/PrivateStorage/PaymentServer]$ pkg-config --modversion zlib
1.2.11
Run Code Online (Sandbox Code Playgroud)

但是,似乎并没有让堆栈能够找到库:

[nix-shell:~/Work/PrivateStorage/PaymentServer]$ stack build
zlib-0.6.2: configure
Progress 1/7

--  While building package zlib-0.6.2 using:
      /home/exarkun/.stack/setup-exe-cache/x86_64-linux-nix/Cabal-simple_mPHDZzAJ_2.4.0.1_ghc-8.6.5 --builddir=.stack-work/dist/x86_64-linux-nix/Cabal-2.4.0.1 configure --with-ghc=/nix/store/zfpm9bai9gj8vs09s2i2gkhvgsjkx13z-ghc-8.6.5/bin/ghc --with-ghc-pkg=/nix/store/zfpm9bai9gj8vs09s2i2gkhvgsjkx13z-ghc-8.6.5/bin/ghc-pkg --user --package-db=clear --package-db=global --package-db=/home/exarkun/.stack/snapshots/x86_64-linux-nix/lts-14.1/8.6.5/pkgdb …
Run Code Online (Sandbox Code Playgroud)

haskell compiler-errors pkg-config nixos haskell-stack

6
推荐指数
1
解决办法
745
查看次数

在Haskell中使用分析运行堆栈

我尝试跑步

$ stack build --profile && stack run myexec --rts-options -p
Run Code Online (Sandbox Code Playgroud)

但是我明白了

... 
Registering library for mylibrary-0.1.0.1..
Completed 2 action(s).      
myexec: the flag -p requires the program to be built with -prof
...
Run Code Online (Sandbox Code Playgroud)

我知道我可以跑步

$ .stack-work/dist/x86_64-linux/Cabal-2.4.0.1/build/myexe/myexe +RTS -p
Run Code Online (Sandbox Code Playgroud)

但是那有什么意义stack run呢?我不想知道cabal的版本和体系结构等(所有这些都发生在makefile中)。

haskell haskell-stack

6
推荐指数
1
解决办法
69
查看次数

intero 错误:错误类型参数 stringp nil

我正在尝试让 intero运行。安装后,从现有堆栈项目中打开 Haskell 文件会导致:

Debugger entered--Lisp error: (wrong-type-argument stringp nil)
  signal(wrong-type-argument (stringp nil))
  flycheck-buffer()
  flycheck-buffer-automatically()
  flycheck-perform-deferred-syntax-check()
  set-window-buffer(#<window 1 on Lib.hs> #<buffer Lib.hs>)
  window--display-buffer(#<buffer Lib.hs> #<window 1 on Lib.hs> reuse ((inhibit-same-window)))
  display-buffer-same-window(#<buffer Lib.hs> ((inhibit-same-window)))
  display-buffer(#<buffer Lib.hs> (display-buffer-same-window (inhibit-same-window)))
  pop-to-buffer(#<buffer Lib.hs> (display-buffer-same-window (inhibit-same-window)) nil)
  pop-to-buffer-same-window(#<buffer Lib.hs>)
  find-file("~/test/src/Lib.hs" t)
  funcall-interactively(find-file "~/test/src/Lib.hs" t)
  call-interactively(find-file nil nil)
  command-execute(find-file)
Run Code Online (Sandbox Code Playgroud)

当我flycheck-buffer在同一个缓冲区中运行时,即使源代码中有错误,也没有任何反应。

这是我的.emacs文件的内容:

(setq debug-on-error t)

(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
(package-initialize)
(package-refresh-contents)

(package-install 'intero)
(add-hook 'haskell-mode-hook 'intero-mode)
Run Code Online (Sandbox Code Playgroud)

由于我在 Mac …

emacs haskell haskell-stack intero

6
推荐指数
1
解决办法
800
查看次数

ghc-pkg:无法打开数据库进行修改:hLock:参数无效

我正在尝试behead.hs从 Ubuntu 20.04 (WSL1) 上的 pandoc 教程编译脚本。我可以使用
stack exec -- ghc behead.hsor成功编译它,
stack --resolver lts-16.25 exec -- ghc behead.hs
但是使用pandoc-types-1.20并且我需要pandoc-types-1.22所以我尝试
stack --resolver nightly-2020-12-07 exec -- ghc behead.hs
(最早的夜间功能pandoc-types-1.222020-09-20,失败并出现与下面相同的错误)

这产生:

Preparing to install GHC (tinfo6) to an isolated location.
This will not interfere with any system-level installation.
Already downloaded.
ghc-pkg: Couldn't open database /home/me/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.2/lib/ghc-8.10.2/package.conf.d for modification: {handle: /home/me/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.2/lib/ghc-8.10.2/package.conf.d/package.cache.lock}: hLock: invalid argument (Invalid argument)
make[1]: *** [ghc.mk:973: install_packages] Error 1
make: …
Run Code Online (Sandbox Code Playgroud)

haskell pandoc ghc-pkg haskell-stack windows-subsystem-for-linux

6
推荐指数
1
解决办法
988
查看次数

如何将使用堆栈管理的 Haskell 项目复制到另一台设备进行开发?

我想通过 U 盘在我的工作计算机和笔记本电脑之间移动 Haskell 项目。我正在使用堆栈构建系统。我的笔记本电脑经常远离互联网,有时当我最初插入 USB 时,所以如果我只是复制项目,我将丢失 GHC 工具链和笔记本电脑上的所有库。我希望能够插入笔记本电脑并工作,即使没有连接。

我见过的各种解决方案告诉我使用某些堆栈标志并复制 ~/.stack目录,但我从未成功获得成功的构建 - 这似乎是一种相当脆弱的方法。我也很欣赏一些自动化,最好是一些版本支持。

Nix 会帮助解决这种情况吗?Nix 的 Docker 集成功能怎么样?(我对 Nix 的了解很少,也没有 Docker 经验,但我愿意了解它是否对我有帮助。)我想保留使用基于笔记本电脑的工具的能力,例如 VS Code。

haskell docker nix haskell-stack

6
推荐指数
0
解决办法
101
查看次数

如何使用 cabal(工具)或堆栈创建应用程序的二进制分发版

我已经用 Haskell 编写了一个应用程序,它开始对用户有点用处了。然而,我的应用程序并不是针对技术娴熟的人,更不用说 Haskell 开发人员了,所以从源代码构建我的应用程序并不是我真正可以期望他们做的事情。

因此,为了让我的用户可以使用我的应用程序,我想自己构建应用程序,将其可执行文件、数据文件、依赖项、依赖项的数据文件、所需的许可信息和其他所需的文件放入一个存档中,然后将该存档放在一个网站。现在,用户可以下载该存档,解压缩它并拥有运行我的应用程序所需的一切。

我上面描述的过程似乎是向我分发应用程序二进制文件的一种相当常见的方式。但是,我无法弄清楚要使用哪些工具或如何配置它们以将我的应用程序构建到上述二进制分发版中。

Cabal(图书馆)似乎具有所需的功能。通常的Setup.hs脚本(没有 cabal(工具)或堆栈作为包装器)支持诸如--prefix和 之类的选项,--enable-relocatable它允许您将包安装到给定的前缀并以这样的方式编译它们,以确保如果前缀(作为一个整体)被移动到其他地方。

但是使用 rawSetup.hs的缺点是它不处理自动安装依赖项。而且由于许多大小合适的 Haskell 应用程序将有数百个依赖项(或至少我的),手动配置和构建它们中的每一个并不是真正可行的。

安装依赖项问题的明显解决方案是使用包装器工具,例如 cabal(工具)或堆栈,因为它们是专门用于处理大型依赖项树的问题。但是,它们似乎都有问题阻止我将应用程序构建为二进制分发版:

  • stack build没有选项--prefixor--enable-relocatable而总是安装到.stack-workand ~/.stack

  • cabal v2-*有选项--prefix--enable-relocatable但似乎完全忽略它们,而是始终安装到dist-newstyle~/.cabal

  • cabal v1-*对于非常简单的情况,似乎可以做我想做的事情。然而,对于更复杂的情况,它会产生模糊的构建失败,其中 GHC 抱怨没有从依赖项中找到模块,而 cabal 抱怨部分安装的包。但即使将这些故障放在一边,对新工作流使用旧命令一般来说似乎也不是一个好主意。

那么,由于我似乎对这些工具不太走运,我可以使用哪些其他工具将 Haskell 应用程序构建为二进制发行版?或者,也许我列出的工具之一实际上可以满足我的需求,而我只是以错误的方式使用它?

范围的一些限制:

  • 现在我最感兴趣的是 Windows 的构建,但其他平台的解决方案也会很有趣。
  • 当我谈论依赖项时,我主要指的是 Haskell 依赖项(即 Cabal 包)。还捆绑外部 C 依赖项的解决方案会很有趣,但这不是一个严格的要求。

haskell cabal cabal-install haskell-stack cabal-new

6
推荐指数
1
解决办法
82
查看次数

我可以在不重新编译的情况下生成“完全公开”和“正常”版本的 Haddock 文档吗?

我正在使用 Haddock(带堆栈)为我正在开发的软件套件生成文档。我想生成 Haddock 文档的 2 个变体;一种通常(例如,vanilla stack haddock),一种具有完全暴露的模块(例如,stack haddock --haddock-arguments "--show-all")。但是,我发现我需要stack clean在黑线鳕生成之间运行,否则我运行的第二个命令不会生成任何东西。我们想尽量避免这种情况stack clean(这导致需要重新编译整个软件套件)。

预期步骤(不起作用):

  1. stack haddock
  2. ... 将文档复制到我们的本地文件夹以供公开发布 ...
  3. stack haddock --haddock-arguments "--show-all"
  4. ... 将完全公开的文档复制到我们的本地文件夹以供公开发布 ...

上述步骤的问题在于,第二个步骤stack haddock将默认使用已经构建的 haddock 文档,而忽略"--show-all"更改。我们可以通过添加一个stack clean中间运行来解决这个问题:

工作步骤:

  1. stack haddock
  2. ... 将文档复制到我们的本地文件夹以供公开发布 ...
  3. stack clean
  4. stack haddock --haddock-arguments "--show-all"
  5. ... 将完全公开的文档复制到我们的本地文件夹以供公开发布 ...

但是,添加此stack clean步骤会导致对第 4 步的整个软件套件进行额外的重新编译。无论如何,我是否可以绕过需要此步骤?我已经尝试$(stack path --local-install-root)/doc在第二个文档生成之前手动删除该文件夹,但是如果没有完全清理,这不起作用。

我的堆栈版本是Version 2.7.3, Git revision 7927a3aec32e2b2e5e4fb5be76d0d50eddcc197f x86_64 hpack-0.34.4.

haskell haddock haskell-stack

6
推荐指数
0
解决办法
60
查看次数