我正在编写一些一次性的Haskell脚本来解决Project Euler的一些问题.我真的不想编译它们,因为我经常要做的改变很多,但在少数情况下我发现我的堆栈空间已经用完了.
说明runhaskell以下语法应该增加堆栈空间的文档:
runhaskell +RTS -K5M -RTS Script.hs
Run Code Online (Sandbox Code Playgroud)
这永远不会有效(在我试过的任何排列中).堆栈大小始终为8,388,608.这令人抓狂,我在Google上找不到多少帮助.
有什么建议?我究竟做错了什么?
我正在研究练习Haskell轨道的"罗马数字"任务,并按照他们的指示安装堆栈.我正在使用Fedora 24盒子.
只要我从基地使用Haskell模块,我就没有问题.现在我正在尝试导入Data.Map模块.使用ghci命令行可以正常工作:
$ ghci
GHCi, version 7.8.4: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> import Data.Map
Prelude Data.Map>
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用以下命令从我的src文件中导入它时:
import qualified Data.Map as M (foldlWithKey, fromList)
Run Code Online (Sandbox Code Playgroud)
我尝试运行测试时遇到问题:
$ stack test
roman-numerals-0.0.0: build (lib + test)
Preprocessing library roman-numerals-0.0.0...
[2 of 2] Compiling Roman (...)
(...) /roman-numerals/src/Roman.hs:3:1: error:
Failed to load interface for ‘Data.Map’
It is a member of …Run Code Online (Sandbox Code Playgroud) 据我所知,Stack至少在这个提交周围支持了hpack的package.yaml配置文件,但是关于它和文件之间的差异的文档并不多.stack.yaml
我发现谈论它的少数几个链接之一是这个文档,它说:
package.yaml是hpack支持的文件格式.它在cabal上添加了一些细节.例如,hpack具有YAML语法支持,并将自动生成exposed-modules列表.但是,它只是cabal包文件的前端.
因此,它似乎package.yaml提供了*.cabal文件配置能力的超集,就像stack.yaml文件一样.
接下来,让我们看看我们的stack.yaml文件,它提供了我们的项目级设置.
... 后来说这package.yaml是用于存储依赖项:
要告诉堆栈使用
text,您需要将其添加到您的package.yaml文件中 - 特别是在您的依赖项部分...
有这个相关的问题,但遗憾的是没有澄清两个文件之间的区别.
我一直在使用package.yaml我所有项目的配置,从不使用stack.yaml.
那么,堆栈package.yaml和stack.yaml文件之间的关系是什么?如果/当他们的职责重叠时,哪个更好的做法使用?
如何防止堆栈为每个新项目下载 GHC?
每次我使用 stack 创建一个新项目然后构建或执行代码时,stack 都会为我安装一个新的 GHC。这不仅是等待这么长时间下载一个巨大的图像(在GFW后面,xKib/s)很无聊,而且对于我可怜的128G SSD Macbook Pro来说也是一场空间灾难。我怎样才能解决这个问题?
$ stack exec blah
Preparing to install GHC to an isolated location.
This will not interfere with any system-level installation.
ghc-8.4.4: 15.98 KiB / 220.05 MiB ( 0.01%) downloaded...^C
Run Code Online (Sandbox Code Playgroud) 在运行以下代码块时,
$ cd /Library/Developer/CommandLineTools/Packages/
$ open macOS_SDK_headers_for_macOS_10.14.pkg
Run Code Online (Sandbox Code Playgroud)
安装人员警告
此软件包与此版本的 macOS 不兼容,可能无法安装。
当我选择“无论如何安装”时,它失败了。
我怎么可能让它工作?
一些可能相关的环境版本:
OS: macOS 10.14.5
xcodebuild -version: Xcode 11.2.1
gcc --version: gcc (Homebrew GCC 9.2.0_1) 9.2.0
更大的背景:我正在按照https://docs.haskellstack.org/en/stable/install_and_upgrade/ 上的说明设置 haskellstack
在跑步时$ stack setup我遇到了
配置:错误:在“~/.stack/programs/x86_64-osx/ghc-8.6.5.temp/ghc-8.6.5”中:
配置:错误:C 编译器无法创建可执行文件
有关详细信息,请参阅“config.log”
运行时收到 ExitFailure 77
根据说明的注释部分,我跑了
$ xcode-select --install
Run Code Online (Sandbox Code Playgroud)
它说
xcode-select: 错误:命令行工具已经安装,使用“软件更新”安装更新
然后(按照相同的说明)我跑了
$ cd /Library/Developer/CommandLineTools/Packages/
$ open macOS_SDK_headers_for_macOS_10.14.pkg
Run Code Online (Sandbox Code Playgroud) 使用 本地构建我的 Haskell 项目时stack build,仅重新编译更改的源文件。不幸的是,我无法让 Stack 在 GitHub Actions 上表现得像这样。请问有什么建议吗?
例子
我用Lib.hsand创建了一个简单的例子Fib.hs,我什至检查缓存的 .stack-work 文件夹是否在构建之间更新,但它总是编译两个文件,即使只更改一个文件。
这是示例:
Lib.hs和Fib.hs+ 依赖项):https : //github.com/MarekSuchanek/stack-test/runs/542163994Lib.hs更改,同时构建Lib.hs和Fib.hs):https : //github.com/MarekSuchanek/stack-test/runs/542174351我可以从日志(详细堆栈)中观察到缓存中的某些内容正在更新,但我完全不清楚是什么以及为什么。它正确地发现只有Lib.hs被改变了:“ stack-test-0.1.0.0: unregistering (local file changes: src/Lib.hs)”所以我不明白为什么所有的都被编译了。我注意到,在2Fib.hi没有更新,.stack-work但其他人(Fib.o,Fib.dyn_hi,和Fib.dyn_o)是。
笔记
当没有更改源文件时, ~/.stack 缓存是可以的,也可以不构建。当然,这是一个虚拟示例,但我们有不同的项目,其中包含更多源文件,可以显着加快构建速度。当更改非源文件(例如 README 文件)时,不会按预期构建任何内容。
我加入了一个项目。代码库对我来说是新的。我对在代码库中使用的模块感兴趣,它是从依赖项导入的。该模块未在项目中定义。
是否有一种自动/简单的方法来确定哪个库提供了我感兴趣的模块?
许多依赖项是专有的,hoogle 无法帮助我解决这个问题。
我正在构建一个Haskell程序,该程序使用命令行参数解析器使用option-applicative库.由于我使用堆栈来构建和测试我的项目,我想使用stack exec执行我的程序传递命令行参数,就像
stack exec myprogram-exe -i myfile.txt
Run Code Online (Sandbox Code Playgroud)
但是当我尝试执行时,Stack给了我以下消息:
Usage: stack exec CMD [-- ARGS (e.g. stack ghc -- X.hs -o x)] ([--plain] |
([--ghc-package-path] | [--no-ghc-package-path])
([--stack-exe] | [--no-stack-exe]) [--package ARG])
Run Code Online (Sandbox Code Playgroud)
有没有办法可以将命令行参数传递给使用Stack执行的程序?
我想在全局安装一些Haskell库,例如hindent我的编辑器的Haskell集成使用它.建议的方法是什么?
我认为这stack install hindent是正确的方法.但是,我想更新我的包,发现没有办法做到这一点.根据我发现的GitHub问题报告,
stack涉及管理项目的本地构建沙箱.它不打算成为全球包经理.
似乎有一些解决方法,比如在我想要安装的软件包上维护一个带有人为依赖性的虚拟项目.这听起来像一个可怕的黑客,我一直无法找到任何关于应该采取什么方法的官方文件.
使用我的系统软件包管理器(Homebrew)安装Haskell软件包不是一个选项,因为它们没有打包.
我本来会打开一个针对Stack的问题报告,但是贡献指南要求我在haskell-stack标签下提出问题.
我有一个非常特殊的依赖情况,我想将其打包到单个 Stack/Cabal 包中:我需要构建并运行我的程序以获取代码生成器的输入,该代码生成器生成需要链接到的输出。 .. 我的程序。
好的,更具体地说,这里是手动步骤:
stack build 安装所有依赖项,并构建所有非 Verilator 使用的可执行文件。stack exec phase1运行第一个阶段,其中生成一个 Verilog 文件和一个 Clash.manifest文件。.manifest使用步骤 2 中的文件,并生成 C++ 代码和Makefile可用于驱动 Verilator 的代码。Makefile步骤 3 中生成的:
MakefileMakefile,它生成一个二进制库stack build --flag phase2构建第二个可执行文件。此可执行文件包含.hsc处理步骤 2 中生成的头文件的文件,并链接到步骤 4/2 中生成的 C++ 库。我想自动化这个,这样我就可以运行,stack build而这一切都在幕后发生。我从哪里开始?!
为了说明整个过程,这里是一个独立的模型:
package.yamlname: clashilator-model
version: 0
category: acme
dependencies:
- base
- directory
source-dirs: …Run Code Online (Sandbox Code Playgroud)