#haskell #yesod #haskell-stack
#haskell #yesod #haskell-stack
Вопрос:
Немного предыстории, которая приводит к вопросу, который у меня есть.
Я изучаю Yesod и читаю книгу Yesod. В разделе «Основы» книги были даны инструкции о том, как получить базовое приложение Yesod. В инструкциях в основном говорится поместить это в файл:
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import Yesod
data HelloWorld = HelloWorld
mkYesod "HelloWorld" [parseRoutes|
/ HomeR GET
|]
instance Yesod HelloWorld
getHomeR :: Handler Html
getHomeR = defaultLayout [whamlet|Hello World!|]
main :: IO ()
main = warp 3000 HelloWorld
и запустите его с runhaskell helloworld.hs
помощью или stack runghc helloworld.hs
. Я сделал именно это, и это не сработало. Я получаю сообщение об yesod
ошибке не может быть найдено. По-видимому, есть шаг, который я должен был выполнить до этого, который не упоминается в разделе basic . Я нашел этот шаг в руководстве по быстрому запуску здесь https://www.yesodweb.com/page/quickstart
И инструкция там в основном гласит
- установить стек
- Создайте новый сайт с каркасом: stack new my-project yesodweb / sqlite amp;amp; cd my-project
- Установите инструмент командной строки yesod: stack install yesod-bin —install-ghc
- Библиотеки сборки: сборка стека
- Запустите сервер разработки: stack exec — yesod devel
- Просмотрите свой сайт Yesod по адресу http://localhost:3000/
Я следил за всем этим, и, похоже, это работает, но теперь вернемся к запуску helloworld.hs
файла в разделе basic. Я понимаю выше, что команда stack install yesod-bin --install-ghc
устанавливает yesod
. Поэтому я подумал, что это решит проблему Yesod
not found . Я вернулся в каталог, где у меня был helloworld.hs
файл, и запустил stack runghc helloworld.hs
, но это не сработало.
Это сработало только тогда, когда я перешел helloworld.hs
в my-project
проект, который я создал, следуя руководству по быстрому запуску. Итак, теперь мой вопрос заключается в том, что именно делает команда stack runghc helloworld.hs
и почему команда работает только тогда, когда у меня есть helloworld.hs
файл в проекте стека?
Ответ №1:
Подумайте о проектах стека, таких как пакеты узлов или python virtualenvs: у них есть свои собственные зависимости, которые отделены от того, что вы установили в своей системе. runhaskell
(который не проходит через stack) будет использовать ваши глобальные зависимости, но вы не yesod
установили глобально, поэтому он пожаловался, что он не был найден. Если вы stack install yesod-bin
находитесь внутри проекта stack, он установит его только для этого проекта stack, поэтому вы можете использовать зависимости только в том случае, если вы находитесь внутри этого проекта. Для глобальных установок рассмотрите возможность использования cabal
(обратите внимание, что cabal ужасен в управлении пакетами и выдает ошибку в половине пакетов, которые вы пытаетесь установить, поэтому лучше просто придерживаться stack).
Комментарии:
1.
stack install
не устанавливает пакеты «в проект»