使用 haskell 堆栈在生产环境和沙箱环境之间切换

Switch between production and sandbox environment with haskell stack

我正在开发一个调用 Web 服务的 haskell 应用程序。我希望在使用 stack build 构建时,应用程序以真实生产服务器的 URL 为目标,但在使用 stack repl 进行调试时,应用程序以测试服务器的 URL 为目标.

我想这可以通过条件编译来实现,但是我如何配置堆栈以将 -DDEBUG=1 之类的选项传递给 GHCi 而不是传递给 GHC?

更一般地说,许多工具(Visual Studio、Xcode…)支持一个项目的多个构建配置。有堆栈或 cabal 等价物吗?

一种方法是在 运行 时检查 System.Environment.getProgName 是否为 ghc。这不一定是可靠的检查,因为在某些情况下可执行文件可能被称为其他名称。对于堆栈安装的可执行文件,它将是 ghc,但对于系统安装的 ghcs,它很可能是 ghc-8.0.1 或其他东西。所以,这种方法并不是那么可靠。

我想到了一个更好的方法,即添加一个 .ghci 文件,其中包含启动时 运行 的 ghci 命令。我没有对此进行测试,但我认为将 :set -DDEBUG=1 in .ghci 放在项目根目录中会起作用。还需要使用 chmod go-w .ghci.

调整其权限