【问题标题】:What exactly does stack runghc do?堆栈 runghc 到底是做什么的?
【发布时间】:2021-02-22 06:10:51
【问题描述】:

一些背景知识导致了我的问题。

我正在学习 Yesod,我正在阅读 Yesod 书。在Basics section of the book 中,给出了如何获取基本 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.hsstack runghc helloworld.hs 运行它。我确实做到了这一点,但没有奏效。我收到关于找不到yesod 的错误。显然,我应该在此之前运行一个步骤,这在基本部分中没有提到。我在此处的快速入门指南中找到了该步骤https://www.yesodweb.com/page/quickstart

里面的说明基本上是说

  • 安装堆栈
  • 创建一个新的脚手架站点:stack new my-project yesodweb/sqlite && cd my-project
  • 安装yesod命令行工具:stack install yesod-bin --install-ghc
  • 构建库:堆栈构建
  • 启动开发服务器:stack exec -- yesod devel
  • 在 http://localhost:3000/ 上查看您的 Yesod 站点

我遵循了所有这些,它似乎工作,但现在回到基本部分中运行helloworld.hs 文件。我在上面了解到命令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 文件时才有效?

【问题讨论】:

    标签: haskell yesod haskell-stack


    【解决方案1】:

    想想节点包或 python virtualenvs 之类的堆栈项目:它们有自己的依赖项,与您在系统上安装的任何内容分开。 runhaskell(不通过堆栈)将使用您的全局依赖项,但您没有全局安装yesod,因此它抱怨找不到它。如果您在堆栈项目中stack install yesod-bin,它将仅为 that 堆栈项目安装它,因此您只能在该项目中使用依赖项。对于全局安装,请考虑使用cabal(请注意,cabal 在包管理方面非常糟糕,并且会在您尝试安装的一半包上出错,因此最好坚持使用堆栈)。

    【讨论】:

    • stack install 不会将软件包“安装到项目中”
    猜你喜欢
    • 2013-09-06
    • 1970-01-01
    • 2015-08-06
    • 2013-09-02
    • 2014-01-02
    • 2013-10-10
    • 2017-05-08
    • 2022-01-20
    • 2012-10-17
    相关资源
    最近更新 更多