如何用Stack编译独立Haskell源码文件?无需创建完整项目
嘿,完全懂你不想折腾完整项目配置的心情!其实Stack早就考虑到了这种需求——不用写.cabal或者stack.yaml,直接用它自带的命令就能搞定单个文件的编译,而且用的还是你通过Stack安装的GHC环境,不会和系统里的其他GHC版本冲突。
下面给你几种实用的方式:
1. 基础编译(无额外依赖)
如果你的辅助文件没有用到Stack默认环境之外的包,直接用stack ghc命令就行,语法和原生ghc几乎一样,只需要在前面加stack,并用--分隔Stack参数和GHC参数:
stack ghc -- your-helper-file.hs
执行完之后,当前目录会生成对应的可执行文件:Linux/macOS下是your-helper-file,Windows下是your-helper-file.exe,直接在Shell里运行./your-helper-file(Windows下直接输文件名)就行。
2. 编译带额外依赖的文件
要是你的文件用到了比如text、aeson这类第三方包,不用专门建项目,直接用--package参数指定依赖即可:
stack ghc --package text --package aeson -- your-helper-file.hs
Stack会自动下载、构建这些依赖,然后完成你的文件编译,全程不用手动配置任何项目文件。
3. 做成可直接运行的脚本(懒人福音)
如果你想更省事,甚至不想手动敲编译命令,可以给你的Haskell文件加上Shebang注释,让它变成可直接执行的脚本。比如在your-helper-file.hs的最开头加上:
#!/usr/bin/env stack -- stack script --resolver lts-20.10 --package text
这里的--resolver指定你要用的Stackage快照版本(换成你正在用的版本就行),--package列出你需要的依赖。然后给文件添加执行权限:
chmod +x your-helper-file.hs
之后你就可以像运行Shell脚本一样直接执行它:
./your-helper-file.hs
第一次运行时Stack会自动处理依赖和编译,后续运行如果文件没修改,会直接复用编译好的可执行文件,非常方便。
内容的提问来源于stack exchange,提问作者MathematicalOrchid

