使用 Haskell Stack 构建时添加自定义配置文件

Add custom config file when building with Haskell Stack

我目前正在学习 Haskell 并且作为练习使用 Servant 编写了一个简单的 RestAPI。该程序不使用数据库,而是写入和读取文件。
程序应该读取和写入的路径当前是通过自定义配置文件给出的,例如"myconfig.ini" 我用 config.ini 包阅读了这个配置。

这在本地开发时效果很好,因为我使用了 stack ghci 到 运行 主要方法,因此也使用了程序。完成所有基本功能后,我想尝试将其部署在 nginx 服务器上。
我只是像建议的那样将可执行文件复制到 nginx 的 /http 文件夹 here 并尝试执行它,我 运行 进入我的问题。配置文件不在同一个文件夹中,因此无法再读取。

我习惯于 Java 必要的文件通常是生成的存档的一部分,例如一个 .war 文件。有可能在 Haskell 中实现吗?如果没有,关于配置文件的最佳做法是什么?

如果你想把你的配置文件和你的程序“打包”起来,这很容易做到;模板 Haskell 有 runIO function that lets you execute arbitrary things (such as reading and parsing a configuration file) at compile time; This is made slightly more accessible by the file-embed 包。这样,您可以将应用程序编写成类似于 runAppWithConfig :: Configuration -> IO () 的形式,然后拥有两个基本上只是 main = readConfigFile >>= runAppWithConfigmain = runAppWithConfig embeddedConfig 的二进制文件。或者您可以同时执行这两种操作,嵌入默认配置,但也允许使用命令行参数覆盖默认选项等等。

Yesod 大量使用编译时配置的方法。

当然,您也可以走 Haskell 独立路线,实际上确实通过使用 AppImage 之类的东西来创建类似于 .war 的东西,这是一种混合自解压存档和应用程序。

但实际上,如何进行配置并不是特定于语言的,并且有很多方法可以进行配置。你甚至可以让你的应用程序保持原样,只随它一起提供你想要的配置,而不是仅仅复制二进制文件。