2017-10-20 203 views
1

我正在使用Yesod构建一个简单的应用程序,并且我很难引入外部文件。这里是我的代码:hamletFile,luciusFile,julius文件变量不在范围内

{-# LANGUAGE OverloadedStrings  #-} 
{-# LANGUAGE QuasiQuotes   #-} 
{-# LANGUAGE TemplateHaskell  #-} 
{-# LANGUAGE TypeFamilies   #-} 
import   Yesod 

data GomokuServer = GomokuServer 

mkYesod "GomokuServer" [parseRoutes| 
/HomeR GET 
|] 

instance Yesod GomokuServer 

getHomeR :: Handler Html 
getHomeR = defaultLayout $ do 
     $(hamletFile "./src/templates/home.hamlet") 
     $(luciusFile "./src/templates/home.lucius") 

main :: IO() 
main = warp 3000 GomokuServer 

它的伟大工程,当我用quasiquotes,或者如果我whamletFile取代hamletFile,但否则将无法编译,因为它无法找到hamletFileluciusFile。我使用的是Yesod版本1.4,我认为这些方法是通过核心Yesod包导入的。他们不是?

回答

2

为什么不使用whamletFile?大多数时候你想要一个小部件。

看来hamletFile未被再次出口。

λ import Yesod 
λ :t hamletFile 

<interactive>:1:1: error: 
    • Variable not in scope: hamletFile 
    • Perhaps you meant ‘whamletFile’ (imported from Yesod) 

如果你真的需要它,你可以把它从Text.Hamlet

FWIW的Yesod scaffolding定义一个函数

widgetFile :: String -> Q Exp 
widgetFile = (if appReloadTemplates compileTimeAppSettings 
       then widgetFileReload 
       else widgetFileNoReload) 
       widgetFileSettings 

然后我就用这个处处像$(Settings.widgetFile "homepage")在默认情况下在小村庄,白斑狗鱼带来的,而卡修斯文件“主页”。你可以看到更多的信息在Overriding-widgetFile on the Yesod wiki

+0

我可以使用'whamletFile'导入外部'.lucius'文件吗?我只是觉得它只能使用'.hamlet'文件。我最终使用Text.Hamlet导入。 –

+0

你不能使用'whamletFile'来导入lucius文件,但是你可以使用'widgetFile'函数来导入所有3个hamlet,lucius和cassius文件。 – Ben

+0

但'widgetFile'不包含在核心yesod库中,对吧?我必须将yesod-scaffold添加到我的依赖列表中,这似乎是一种矫枉过正,考虑到这是我将使用的唯一功能。 –