我正在Haskell中构建一个日志文件解析器.我正在使用堆栈来构建它.运行stack build命令很愉快,我的项目编译.stack test但是,运行会产生以下错误:
parser-test: executable not found
Run Code Online (Sandbox Code Playgroud)
我在错误消息上方看到以下警告,但我不知道如何避免它引用的重定向.
Warning: output was redirected with -o, but no output will be generated because there is no Main module.
Run Code Online (Sandbox Code Playgroud)
我还没有编写任何测试,所以测试文件是由它创建的stack new.我的cabal文件如下所示:
...
category: Executable
build-type: Simple
-- extra-source-files:
cabal-version: >=1.10
library
hs-source-dirs: src
exposed-modules: LogParser
build-depends: base >= 4.7 && < 5
, attoparsec
, bytestring
, old-locale
, time
default-language: Haskell2010
executable parser-exe
hs-source-dirs: app
main-is: Main.hs
ghc-options: -threaded -rtsopts -with-rtsopts=-N
build-depends: base
, …Run Code Online (Sandbox Code Playgroud) 当我运行a stack test或a时stack test <package>:<test-suite>,输出看起来像:
package: configure (lib + exe + test)
package: build (lib + exe + test)
package: copy/register
package: test (suite: tests)
Run Code Online (Sandbox Code Playgroud)
它最终基本上编译了我的所有更改两次:一次用于exe或lib,第二次用于测试.
我想要的是这样的命令stack test --test-only会产生类似的东西:
package: configure (test)
package: build (test)
package: copy/register
package: test (suite: tests)
Run Code Online (Sandbox Code Playgroud)
我已经查看了可用的命令行标志和堆栈文档.我还试图谷歌搜索,看看有没有人谈过类似的东西.
所以我的问题是:
1,什么是编译和运行目前最好的方法只有测试?我最好的猜测是尝试将测试放在一个单独的cabal包中.
2.有没有理由说堆栈不能或不能这样做?
我是Haskell和Stack的新手.在创建一个新项目时stack new,应该使用哪个文件签入git(或任何其他VCS)?整个目录?
我们的学校计算机安装了Stack,但由于用户目录的空间非常有限,因此很难使用.我想知道是否有办法拥有一个系统范围的.stack文件夹,而不是在用户目录中.
如果我找到了解决方案,我可以将它传达给我们的IT人员 - 他们历来对用户请求非常有帮助.
我有一个基于堆栈的项目,它依赖于几个 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) 我正在尝试让 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 …
我正在尝试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.22是2020-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
我想通过 U 盘在我的工作计算机和笔记本电脑之间移动 Haskell 项目。我正在使用堆栈构建系统。我的笔记本电脑经常远离互联网,有时当我最初插入 USB 时,所以如果我只是复制项目,我将丢失 GHC 工具链和笔记本电脑上的所有库。我希望能够插入笔记本电脑并工作,即使没有连接。
我见过的各种解决方案告诉我使用某些堆栈标志并复制 ~/.stack目录,但我从未成功获得成功的构建 - 这似乎是一种相当脆弱的方法。我也很欣赏一些自动化,最好是一些版本支持。
Nix 会帮助解决这种情况吗?Nix 的 Docker 集成功能怎么样?(我对 Nix 的了解很少,也没有 Docker 经验,但我愿意了解它是否对我有帮助。)我想保留使用基于笔记本电脑的工具的能力,例如 VS Code。
我已经用 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 应用程序构建为二进制发行版?或者,也许我列出的工具之一实际上可以满足我的需求,而我只是以错误的方式使用它?
范围的一些限制:
我正在使用 Haddock(带堆栈)为我正在开发的软件套件生成文档。我想生成 Haddock 文档的 2 个变体;一种通常(例如,vanilla stack haddock),一种具有完全暴露的模块(例如,stack haddock --haddock-arguments "--show-all")。但是,我发现我需要stack clean在黑线鳕生成之间运行,否则我运行的第二个命令不会生成任何东西。我们想尽量避免这种情况stack clean(这导致需要重新编译整个软件套件)。
预期步骤(不起作用):
stack haddockstack haddock --haddock-arguments "--show-all"上述步骤的问题在于,第二个步骤stack haddock将默认使用已经构建的 haddock 文档,而忽略"--show-all"更改。我们可以通过添加一个stack clean中间运行来解决这个问题:
工作步骤:
stack haddockstack cleanstack haddock --haddock-arguments "--show-all"但是,添加此stack clean步骤会导致对第 4 步的整个软件套件进行额外的重新编译。无论如何,我是否可以绕过需要此步骤?我已经尝试$(stack path --local-install-root)/doc在第二个文档生成之前手动删除该文件夹,但是如果没有完全清理,这不起作用。
我的堆栈版本是Version 2.7.3, Git revision 7927a3aec32e2b2e5e4fb5be76d0d50eddcc197f x86_64 hpack-0.34.4.