В файле пакета стека в чем разница между зависимостями библиотеки и исполняемых файлов?

#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. Спасибо за объяснение!