10

我正在尝试安装我的第一个脚手架 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

4 回答 4

7

使用Control.Monad.LoggerrunFooLoggingT中的功能之一。特别是有.runNoLoggingT

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

于 2013-06-02T19:20:21.100 回答
4

错误消息表明该MonadLogger IO实例丢失。问题是安装的版本monad-logger太新了。包括你需要monad-logger-0.2.4 的实例monad-logger-0.3.0,上面显然没有

解决方案:添加&& < 0.3.0monad-logger您的 cabal 文件中的行并cabal install --only-dependencies再次执行。

(如果没有monad-logger行,添加一个喜欢, monad-logger < 0.3.0.

于 2013-03-16T10:56:24.763 回答
4

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

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

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

它基本上重新实现NoLoggingTMonadIO.

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

于 2014-02-20T15:36:51.953 回答
0

withSqliteConn仅供参考,我通过将提供给作为参数的值与构造函数包装起来克服了这个问题NoLoggingT,它允许在堆栈withSqliteConn中找到某个位置,然后我用MonadLoggerrunNoLoggingT

mainWithExplicitConnection2:: IO ()
mainWithExplicitConnection2 =
    runNoLoggingT $ withSqliteConn ":memory:" $ \conn ->
        NoLoggingT $ flip runSqlPersistM conn $ runMigration migrateAll
于 2015-08-25T14:06:58.363 回答