Что именно делает stack runghc?

#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 не устанавливает пакеты «в проект»