I'm trying to install my first scaffolded Yesod app. When I run cabal-dev install && yesod --dev devel
it fails with ExitFailure 1. I'm using sqlite for persistent.
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
I've tried to follow the instructions here: http://www.yesodweb.com/book/scaffolding-and-the-site-template Haven't managed to find any information regarding this problem. Any clues as to what's missing?
Use one of the runFooLoggingT
functions from Control.Monad.Logger. In particular there's runNoLoggingT
.
This is probably a much, much better idea than fixing yourself to an old version of the library!
The error message says that the MonadLogger IO
instance is missing. The problem is that the installed version of monad-logger
is too new. monad-logger-0.2.4
includes the instance you need, monad-logger-0.3.0
and above apparently don't.
The solution:
Add && < 0.3.0
to the monad-logger
line in your cabal file and do cabal install --only-dependencies
again.
(If there is no monad-logger
line, add one like , monad-logger < 0.3.0
.
I'm still getting comfortable with transformers, so following Colin's answer, this is a very quick way to disable logging completely:
import Control.Monad.Logger (MonadLogger, monadLoggerLog)
import Control.Applicative (pure)
instance MonadLogger IO where
monadLoggerLog _ _ _ = pure $ pure ()
It basically reimplements the NoLoggingT
instance for MonadIO
.
However, once you get this quick fix on your codebase, you should head to the Monad Transformers page at the Haskell Wiki as I'm doing right now ; )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With