Reputation: 701
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?
Upvotes: 10
Views: 830
Reputation: 9815
FYI, I overcame this by wrapping the value provided to withSqliteConn
as argument with the NoLoggingT
constructor, which allowed withSqliteConn
to find MonadLogger
somewhere in the stack, and I unwrapped the returned result with runNoLoggingT
mainWithExplicitConnection2:: IO ()
mainWithExplicitConnection2 =
runNoLoggingT $ withSqliteConn ":memory:" $ \conn ->
NoLoggingT $ flip runSqlPersistM conn $ runMigration migrateAll
Upvotes: 0
Reputation: 63
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 ; )
Upvotes: 4
Reputation: 4451
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!
Upvotes: 7
Reputation: 8225
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
.
Upvotes: 4