Добавить пользовательский файл конфигурации при сборке со стеком Haskell - PullRequest
1 голос
/ 09 января 2020

Я сейчас учусь Haskell и в качестве упражнения запрограммировал простой RestAPI с Servant. Эта программа не использует базу данных, но пишет и читает из файлов.
Пути, по которым программа должна читать и записывать, в настоящее время задаются через пользовательский файл конфигурации, например, «myconfig.ini», и я читаю эту конфигурацию с помощью пакета config.ini .

Это работало очень хорошо при локальной разработке, так как я использовал stack ghci для запуска основного метода и, следовательно, программы. Завершив все основные функции c, я хотел попробовать развернуть его на сервере nginx.
Я просто скопировал исполняемый файл в папку nginx /http, как предложено здесь , и попытался выполнить ее, где столкнулся с проблемой. Файл конфигурации больше не находится в той же папке и поэтому больше не может быть прочитан.

Я привык к Java, где необходимые файлы обычно являются частью результирующего архива, например, файл .war. Можно ли добиться этого в Haskell? А если нет, то как лучше всего использовать файлы конфигурации?

1 Ответ

1 голос
/ 09 января 2020

Если вы хотите «упаковать» ваши файлы конфигурации в вашу программу, это достаточно просто; Шаблон Haskell имеет функцию runIO , которая позволяет выполнять произвольные действия (например, чтение и анализ файла конфигурации) во время компиляции; Это стало немного более доступным благодаря пакету file-embed . Таким образом, вы можете написать свое приложение в виде runAppWithConfig :: Configuration -> IO (), а затем иметь два двоичных файла, которые в основном просто main = readConfigFile >>= runAppWithConfig или main = runAppWithConfig embeddedConfig. Или вы можете сделать и то и другое, со встроенной конфигурацией по умолчанию, но также позволяющей переопределить параметры по умолчанию параметрами командной строки, а что нет.

Yesod использует подход, предусматривающий много конфигураций времени компиляции .

Конечно, в качестве альтернативы вы также можете go a Haskell независимый маршрут и на самом деле создать нечто похожее на .war, используя что-то вроде AppImage , что является своего рода смесью самораспаковывающийся архив и приложение.

Но на самом деле, как сделать настройку, не особо зависит от языка c, и существует множество подходов к go. Вы можете даже оставить свое приложение в том виде, в котором оно есть сейчас, и просто отправить нужную конфигурацию вместе с ним, а не просто копировать двоичный файл.

...