我正在关注堆栈指南,我得到了一个新的项目设置(耶!).
它生成了以下文件布局:
.
??? app
? ??? Main.hs
??? .gitignore
??? LICENSE
??? helloworld.cabal
??? Setup.hs
??? src
? ??? Lib.hs
??? stack.yaml
??? test
??? Spec.hs
Run Code Online (Sandbox Code Playgroud)
根据指南中的" helloworld中的文件 "部分:
app/Main.hs,src/Lib.hs和test/Spec.hs文件都是构成项目实际功能的Haskell源文件(我们在此不再赘述).
我真的希望他们暂时停留在那一秒钟,因为我不知道它之间的区别app/Main.hs和src/Lib.hs应该是什么.我应该把哪个代码放在哪里?
在哪些方面我应该划分之间的代码app/,src/,app/Main.hs和src/Lib.hs?
如果我只是编写应用程序或只是编写库,我是否需要这两个文件/目录?
我决定从 Haskell 开始,但遇到了一个陌生的生态系统。我已经写下了我目前的结论的短版和长版(现在我意识到我遇到的问题可能是暂时的,将来不会适用,并意识到下面的文字可能不适合 SO)。
我现在特别想知道的是
简短版本:
如果这是您第一次接触 Haskell,并且想要安装 Haskell(ghccup、ghc、cabal-install、stack)和一个由 Visual Studio Code、Haskell 语言服务器插件和 HIE 组成的开发环境。确保stack new按照(https://docs.haskellstack.org/en/stable/README/#start-your-new-project)和您正在安装的 HIE 都解析为由安装的相同版本的 GHC ghcup.
长版:
嗨哈斯克勒!
我正在分享我对 Haskell 的尝试,希望能将其他人从一两个新手错误中拯救出来。像我问过 google 的所有明智的人一样how to install haskell,这使我进入了以下页面https://www.haskell.org/platform/(我使用的是 macOS 10.13.6)。我已经按照建议下载了 ghcup,然后又安装了 ghc 8.6.5 和 cabal-install 3.0.0.0。两者都是 ghcup 推荐的版本。我能够ghcup list,ghcup list -t all一切看起来都很好。
stack是下一个推荐的。这个过程很简单,在堆栈完成它需要做的一切之后,我stack --version告诉我我有
Version 2.1.3, Git revision 0fa51b9925decd937e4a993ad90cb686f88fa282 (7739 commits) x86_64 hpack-0.31.2 …
我参与了一个涉及大量C位和FFI的Haskell项目.所以我发现自己经常运行并重新运行命令
$ stack build
$ stack build --force-dirty
$ stack clean
$ rm ./.stack-work
Run Code Online (Sandbox Code Playgroud)
反复进行,以便将C位正确链接到Haskell位.换句话说,有时事情在运行时才起作用stack build,有时它们不起作用(在这种情况下,我被迫一遍又一遍地循环上述命令,直到我的项目正确构建).
这意味着我没有正确理解在组装Haskell位之前stack(通过ghc)如何组装C位.所以这里有一个问题可以帮助我开始清理我的困惑:
运行stack clean和删除目录内容之间是否有任何值得注意的区别.stack-work?是否有.stack-work必要删除目录作为一个很好的预防措施,以确保您实际运行干净的构建?
从这里通过安装脚本重新安装Haskell Stack时:
wget -qO- https://get.haskellstack.org/ | sh
Run Code Online (Sandbox Code Playgroud)
其次是:
stack setup
Run Code Online (Sandbox Code Playgroud)
你将得到一个$HOME/.stack/1.5 GB大小的目录(从120多MB下载).如果你运行:
stack update
Run Code Online (Sandbox Code Playgroud)
大小增加到2.5 GB.
我习惯于Java,它通常被认为是大/大(几乎涵盖所有内容并且已经弃用了后向兼容性的替代方案),但作为比较:包括JDK,独立JDK和JDK源的IDE可能大约为1.5 GB的大小.
另一方面,Haskell是一种"小美"语言(从我所听到和读过的,这可能主要是指语法和语义,但仍然),是大/大,对我来说似乎很奇怪.
.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.2.2/lib/ghc-8.2.2(1.3 GB)和.stack/indices/Hackage(980 MB).我假设第一个是安装包(和相关的stack setup),后者是Hackage包存档(和相关stack update)的一些索引?这些可以减少(如上所述3或在线获取所需的Hackage信息)?我在 Windows 上尝试使用测试框架编译 Haskell 测试时遇到错误。
\n使用 Stack 创建一个新库:
\n$ stack new repro simple-library\nRun Code Online (Sandbox Code Playgroud)\n然后导航到该repro目录并repro.cabal通过添加test-framework以下内容来编辑文件build-depends:
library\n hs-source-dirs: src\n exposed-modules: Lib\n build-depends: base >= 4.7 && < 5,\n test-framework\n default-language: Haskell2010\nRun Code Online (Sandbox Code Playgroud)\n现在尝试编译该库:
\n$ stack build\nRun Code Online (Sandbox Code Playgroud)\n代码编译通过
\n编译失败并显示以下错误消息:
\n$ stack build\nWARNING: Ignoring mintty\'s bounds on Win32 (>=2.13.1); using Win32-2.6.2.1.\nReason: trusting snapshot over cabal file dependency information.\nmintty > configure\nmintty …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用堆栈在ghci中加载我的测试套件并让它加载QuickCheck和hspec依赖项.
我怎样才能做到这一点?
我正在使用franklinchen模板.
https://github.com/commercialhaskell/stack-templates/blob/master/franklinchen.hsfiles
我试过
堆栈ghci spec
stack ghci test-suite
stack ghci --main-is spec
我修改了测试套件规范以定位main-is:LibSpec.hs文件
test-suite spec
default-language: Haskell2010
ghc-options: -Wall
type: exitcode-stdio-1.0
hs-source-dirs: test
main-is: LibSpec.hs
build-depends: base
, chapterexercises
, hspec
, QuickCheck
Run Code Online (Sandbox Code Playgroud) 我是一个很新的堆栈,想知道是否git commit或.gitignore该文件.
这两种选择的含义是什么?
我经常安装一个依赖于外部库的软件包,并设法将这些外部库移动到其他位置,以便编译后的程序以加载程序错误退出.
在这些情况下,我只想要堆栈来重建已经安装的软件包,但我不知道这是怎么回事.stack install --force-dirty似乎没有用,因为它只是尝试在当前工作目录中重建项目.
最近的例子:
我想看看是否regex-pcre需要在Windows系统上不存在C库,所以我点击了stack install regex-pcre.这很好,但后来我意识到我在此之前mingw-w64-x86_64-pcre通过stacks 安装了pacman.我再次删除它pacman -R并尝试stack install regex-pcre再次运行,但没有重建它.由于--force-dirty上述原因,也没有添加工作.
有没有办法在GHCI中使用Stack加载包并玩它?
因此,当ghci加载时,我们可以导入模块并查看它的类型签名等.
我在尝试安装软件包时遇到堆栈错误.
Run from outside a project, using implicit global project config
Using resolver: lts-8.0 from implicit global project's config file: /home/chuck/.stack/global-project/stack.yaml
Invalid package ID: "array-0.5.1.1 base-4.9.1.0 binary-0.8.3.0 bytestring-0.10.8.1"
Run Code Online (Sandbox Code Playgroud)
stack --version工作原理:
Version 0.1.10.0 x86_64
Run Code Online (Sandbox Code Playgroud)
和堆栈设置返回:
Run from outside a project, using implicit global project config
Using resolver: lts-8.0 from implicit global project's config file: /home/chuck/.stack/global-project/stack.yaml
stack will use a locally installed GHC
For more information on paths, see 'stack path' and 'stack exec env'
To use this GHC and packages outside …Run Code Online (Sandbox Code Playgroud)