#haskell #haskell-stack
#хаскелл #хаскелл-стек
Вопрос:
В Haskell при использовании стека есть три места, где мы можем определить зависимости от package.yaml
файла; в разделе library
и executables
. В чем разница между определением зависимости в этих местах и когда я должен их использовать?
Ответ №1:
Допустим, вы хотите создать приложение с двумя интерфейсами: CLI и графическим интерфейсом, оба с использованием одной и той же логики. Очевидно, что ваш интерфейс командной строки не использует никаких графических библиотек, поэтому он не должен зависеть от них и наоборот. Ваш package.yaml
будет выглядеть примерно так.
name: my-app version: 0.1.0.0 # This are the dependencies all the components depends on. dependencies: - base gt;= 4.7 amp;amp; lt; 5 # This is the description of your "common logic" i.e. the library library: source-dirs: src # depends on whatever libraries of your choice dependencies: - bytestring - megaparsec - parser-combinators - transformers executables: # The executable name for the cli my-app-cli: # The main function is in cli.hs main: cli.hs source-dirs: app ghc-options: - -Wall - -Wextra - -threaded - -rtsopts - -with-rtsopts=-qg # It depends on you library, the base library (which remember is at the top of the file), and on whatever other libraries you use to build the cli, for example optparse-applicative dependencies: - my-app - optparse-applicative # The executable name for the GUI my-app-gui: # The main function is on gui.hs main: gui.hs source-dirs: app ghc-options: - -Wall - -Wextra - -threaded - -rtsopts - -with-rtsopts=-qg # Again, It depends on your library, the base, and a GUI library of your choice. Example monomer. dependencies: - my-app - monomer
Теперь при запуске stack build
он создаст два исполняемых файла, один с именем my-app-cli
и другой my-app-gui
, каждый со своими собственными зависимостями, но с общими. В идеале можно было бы запустить stack build my-app:my-app-cli
создание только одного из исполняемых файлов, но по какой-то причине stack
строится все (что, по-видимому, связано с некоторым cabal
поведением… не знаю, мне все равно)
Как уже было сказано, я не думаю, что это отличается от других языков программирования. Например, я склонен структурировать свой Python
код таким же образом. Общая библиотека со своими собственными requirements.txt
, а затем различными приложениями, каждое из которых имеет свои собственные requirement.txt
, в зависимости от того, будет ли приложение веб-сервером, моделью машинного обучения или чем-либо еще… это упрощает, например, создание кэшированного слоя в docker. Если мне нужно добавить некоторые зависимости на веб-сервер, они добавляются на веб-сервер requirements.txt
вместо библиотечного. Это, конечно, самоуверенно, но я хочу сказать, что это не специфично для Хаскелла.
Комментарии:
1. Спасибо за объяснение!