2013-03-16 59 views
10

我試圖安裝我的第一個腳手架Yesod應用程序。當我運行cabal-dev install && yesod --dev devel它與ExitFailure 1失敗。我正在使用sqlite的持久性。Yesod ExitFailure 1安裝腳手架應用程序

Application.hs:49:44: 
No instance for (monad-logger-0.3.1:Control.Monad.Logger.MonadLogger 
        IO) 
    arising from a use of `runMigration' 
Possible fix: 
    add an instance declaration for 
    (monad-logger-0.3.1:Control.Monad.Logger.MonadLogger IO) 
In the second argument of `Database.Persist.Store.runPool', namely 
    `(runMigration migrateAll)' 
In a stmt of a 'do' block: 
    Database.Persist.Store.runPool dbconf (runMigration migrateAll) p 
In the expression: 
    do { manager <- newManager def; 
     s <- staticSite; 
     dbconf <- withYamlEnvironment 
        "config/sqlite.yml" (appEnv conf) Database.Persist.Store.loadConfig 
       >>= Database.Persist.Store.applyEnv; 
     p <- Database.Persist.Store.createPoolConfig 
       (dbconf :: PersistConfig); 
     .... } 
Failed to install testProject-0.0.0 
cabal.exe: Error: some packages failed to install: 
testProject-0.0.0 failed during the building phase. The exception was: 
ExitFailure 1 

我試圖按照這裏的說明:http://www.yesodweb.com/book/scaffolding-and-the-site-template 沒有設法找到有關這個問題的任何信息。任何線索,缺少什麼?

回答

4

錯誤消息表示MonadLogger IO實例丟失​​。問題是monad-logger的安裝版本太新了。 monad-logger-0.2.4includes the instance您需要,monad-logger-0.3.0及以上apparently don't

解決方案: 將&& < 0.3.0添加到您的cabal文件中的monad-logger行並再次執行cabal install --only-dependencies

(如果沒有monad-logger行中,添加一個像, monad-logger < 0.3.0

+0

返回的結果做到了。非常感謝! – 2013-03-16 13:22:00

7

使用來自Control.Monad.LoggerrunFooLoggingT功能之一。特別是有runNoLoggingT

這可能是比固定好得多主意你自己到舊版本的圖書館!

+0

在[本頁](http://www.yesodweb.com/book-1.1/authentication-and-authorization)上嘗試編譯電子郵件驗證示例時,出現了相關(我認爲)編譯錯誤。編譯錯誤是「沒有使用」runMigration「導致的(Control.Monad.Logger.MonadLogger IO)的實例。如果你認爲它會有幫助,你可以給出一些提示,說明在那個代碼中插入runNoLoggingT的位置嗎? m猜測主要在頁面底部,不知道在哪裏。 – Tad 2013-08-03 20:42:14

+0

把runNoLoggingT放在主要的前端做了竅門。下面是編譯的主要內容:'main – Tad 2013-08-03 21:34:37

+0

在以前的評論中超出時間....將runNoLoggingT放在我鏈接的源代碼的main的前面,我也需要在warpDebug之前添加一個liftIO,我將這裏的固定代碼粘貼給其他人看,但我不知道如何粘貼代碼發表評論感謝Colin提供的大提示! – Tad 2013-08-03 21:41:41

4

我仍然對變形金剛感到滿意,所以 遵循科林的回答,這是一種非常快速的方法來完全禁用記錄:

import Control.Monad.Logger (MonadLogger, monadLoggerLog) 
import Control.Applicative (pure) 

instance MonadLogger IO where 
    monadLoggerLog _ _ _ = pure $ pure() 

它基本上重新實現了NoLoggingT實例MonadIO。但是,一旦你在你的代碼庫中得到了這個快速修復,你應該立即前往位於Haskell Wiki的Monad Transformers頁面; )

0

僅供參考,我克服了這個通過包裝提供給withSqliteConn作爲參數與NoLoggingT構造,這使得withSqliteConn找到MonadLogger某處在堆棧中的價值,我解開與runNoLoggingT

mainWithExplicitConnection2:: IO() 
mainWithExplicitConnection2 = 
    runNoLoggingT $ withSqliteConn ":memory:" $ \conn -> 
     NoLoggingT $ flip runSqlPersistM conn $ runMigration migrateAll