Делает ли построение модуля с помощью Stack глобальным? - PullRequest
2 голосов
/ 30 июня 2019

Я начал использовать стек Haskell и не очень разбираюсь в этом.

Я работаю над двумя проектами одновременно, оба из которых являются настройками GIT / Cabal / Stack.
Допустим, mig и che.
Теперь проблема в том, что один из этих проектов зависит от другого.
Я не уверен, возможно ли просто добавить mig к stack.yaml из che, даже после его построения с использованием stack build, поскольку GHCi (stack ghci) не разрешает import Mig.Example, выдавая ошибку.

Это даже действительная проблема? Что я должен делать? Может ли это работать?

1 Ответ

3 голосов
/ 30 июня 2019

В разделе документации Stack по многопакетным проектам есть немного об этом, но, к сожалению, он решает показать пример с использованием двух готовых пакетов, что приводит к путанице.

Общая идея состоит в том, чтобы поместить каталоги проектов mig и che в общий каталог проекта, а затем поместить в общий каталог один файл stack.yaml, в котором в качестве пакетов указаны mig и che. быть построенным (вместо обычного пакета "."). Зависимость в che.cabal от mig будет автоматически разрешена.

Вот полный, минимальный пример. Если вы запустите stack build в multi, он создаст che, затем mig и stack exec mig запустят программу.

Также обратите внимание, что если вы поместите два существующих каталога проекта Stack на место, я считаю, что вы должны удалить их локальные файлы stack.yaml и либо объединить содержимое вручную в один multi/stack.yaml, либо запустить stack init in multi для генерации свежих multi/stack.yaml из содержимого mig/mig.cabal и che/che.cabal. Должен быть только один stack.yaml для каждой коллекции проектов, создаваемых как единое целое.

мульти / stack.yaml

resolver: lts-13.26
packages:
- che
- mig

мульти / Che / che.cabal

name:                che
version:             0.1.0.0
build-type:          Simple
cabal-version:       >=1.10
library
  default-language:    Haskell2010
  exposed-modules:     Che
  build-depends:       base >= 4.7 && < 5

мульти / Che / Che.hs

module Che where
che :: IO ()
che = putStrLn "Viva la revolution"

мульти / МИГ / mig.cabal

name:                mig
version:             0.1.0.0
build-type:          Simple
cabal-version:       >=1.10
executable mig
  default-language:    Haskell2010
  main-is:             Main.hs
  build-depends:       base >= 4.7 && < 5
                     , che

мульти / МИГ / Main.hs

import Che
main :: IO ()
main = che >> che >> che

Обновление: разработка che самостоятельно

Обратите внимание, что даже если вы также работаете над самостоятельной разработкой / сборкой che, указанная выше установка multi будет рекомендованным способом настройки проекта mig. В частности, если вы хотите собрать che только без перестроения mig (например, если вы знаете, что mig будет сломан во время работы с che), вы можете использовать команду stack build che вместо stack build.

Если вы хотите продолжить разработку che, не вмешиваясь в версию che, используемую mig, то самое простое - сделать git clone новый репозиторий с рабочим каталогом и у вас может быть копия "bleeding edge" che (со своим отдельным отдельным пакетом stack.yaml), которую вы можете разрабатывать и создавать самостоятельно, и "стабильный" che, от которого зависит mig, который вы может git pull по мере необходимости. Будет хорошей идеей оставить stack.yaml вне Git, или назвать его stack.yaml.template или что-то еще и символическую ссылку или скопировать его в stack.yaml.

Если вы действительно хотите относиться к che так же, как Stack обрабатывает пакеты Stackage и имеет проект с одним пакетом для mig, который так или иначе зависит от глобального пакета che, то вы можете либо: (1) начать загрузку che в Stackage и обращаться с ним буквально, как с любым другим пакетом Stackage; или (2) добавьте extra_deps в файл stack.yaml для mig, который указывает на поддерживаемый глобальный источник пакета. Это может быть GitHub или другой веб-репозиторий ; это может быть «архив» (например, в формате .tar.gz, созданный с помощью git archive), хранящийся в локальной файловой системе; или даже Git-репозиторий в локальной файловой системе. Для этого последнего варианта абсолютные пути работают нормально, но я не думаю, что относительно пути поддерживаются напрямую. Это будет выглядеть примерно так:

# in mig's stack.yaml
extra-deps:
- git: /home/me/src/haskell/che
  commit: 8ab4bf759dd934fa31cfca324748af894ca0e224
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...