Yesod ExitFailure 1安装脚手架应用程序时

时间:2013-03-16 10:35:10

标签: haskell yesod

我正在尝试安装我的第一个脚手架Yesod应用程序。当我运行cabal-dev install && yesod --dev devel时,它以ExitFailure 1失败。我使用sqlite来执行持久性。

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 个答案:

答案 0 :(得分:7)

使用Control.Monad.Logger中的runFooLoggingT个功能之一。特别是runNoLoggingT

这可能比将自己固定在旧版本的库中要好得多!

答案 1 :(得分:4)

错误消息显示MonadLogger IO实例丢失。问题是monad-logger的已安装版本太新了。您需要monad-logger-0.2.4 includes the instancemonad-logger-0.3.0apparently don't以上。

解决方案: 将&& < 0.3.0添加到您的cabal文件中的monad-logger行,然后再次cabal install --only-dependencies

(如果没有monad-logger行,请添加, monad-logger < 0.3.0之类的内容。

答案 2 :(得分:4)

我仍然对变压器感到满意,所以 按照Colin的回答,这是一种完全禁用日志记录的快速方法:

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

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

它基本上重新实现了NoLoggingT的{​​{1}}实例。

但是,一旦你在代码库上得到这个快速修复,你应该前往Haskell Wiki的Monad Transformers页面,就像我现在正在做的那样; )

答案 3 :(得分:0)

仅供参考,我通过将提供给withSqliteConn的值作为NoLoggingT构造函数的参数包装来克服这一点,这允许withSqliteConn在堆栈中的某处找到MonadLogger,并且我用runNoLoggingT

打开了返回的结果
mainWithExplicitConnection2:: IO ()
mainWithExplicitConnection2 =
    runNoLoggingT $ withSqliteConn ":memory:" $ \conn ->
        NoLoggingT $ flip runSqlPersistM conn $ runMigration migrateAll