2013-03-16 12 views
10

Próbuję zainstalować moją pierwszą aplikację Yesod na rusztowaniu. Po uruchomieniu cabal-dev install && yesod --dev devel nie powiedzie się z ExitFailure 1. Używam sqlite dla trwałych.Yesod ExitFailure 1 podczas instalowania aplikacji z rusztowaniem

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 

Starałem się postępować zgodnie z instrukcjami tutaj: http://www.yesodweb.com/book/scaffolding-and-the-site-template nie udało się znaleźć żadnych informacji na temat tego problemu. Jakieś wskazówki dotyczące tego, czego brakuje?

Odpowiedz

4

Komunikat o błędzie informuje, że brakuje instancji MonadLogger IO. Problem polega na tym, że zainstalowana wersja monad-logger jest zbyt nowa. monad-logger-0.2.4includes the instance potrzebujesz, monad-logger-0.3.0 i powyżej apparently don't.

Rozwiązanie: Dodaj && < 0.3.0 do linii monad-logger w pliku cabal i zrobić cabal install --only-dependencies ponownie.

(Jeśli nie ma monad-logger linia, dodasz jak , monad-logger < 0.3.0.

+0

Że zrobiłem to. Wielkie dzięki! –

7

Użyj jednej z funkcji runFooLoggingT od Control.Monad.Logger. W szczególności nie runNoLoggingT.

Prawdopodobnie jest to o wiele lepszy pomysł niż ustalające się do starej wersji biblioteki!

+0

Otrzymuję powiązany (myślę) błąd kompilacji podczas próby skompilowania przykładu uwierzytelniania wiadomości e-mail na [tej stronie] (http://www.yesodweb.com/book-1.1/authentication-and-authorization). Błąd kompilacji to "Brak instancji dla (Control.Monad.Logger.MonadLogger IO) wynikającej z użycia" runMigration ".Jeśli uważasz, że to by pomogło, czy mógłbyś podać wskazówki, gdzie wstawić runNoLoggingT w tym kodzie? Zgaduję, że gdzieś w głównej części u dołu strony, nie jestem pewien gdzie: – Tad

+0

Umieszczenie runNoLoggingT z przodu głównego zrobiło lewę.To jest główna kompilacja: 'główny – Tad

+0

Zabrakło czasu na poprzedni komentarz .... Umieszczenie runNoLoggingT na początku głównej strony w źródle, z którym się łączyłem, spowodowało, że musiałem dodać liftIO przed warpDebug. Wkleiłem tutaj poprawiony kod, aby inni mogli go zobaczyć, ale nie wiem jak wkleić kod na komentarz, dzięki Colinowi za wielką wskazówkę! – Tad

4

Nadal czuję się komfortowo z transformatorami, więc po odpowiedzi Colina, jest to bardzo szybki sposób całkowitego wyłączenia rejestrowania:

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

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

Zasadniczo reimplements instancję NoLoggingT dla MonadIO.

Jednakże, gdy już uzyskasz tę szybką korektę w swojej bazie kodów, powinieneś udać się na stronę Haskell Wiki, tak jak ja to teraz robię;)

0

FYI, przezwyciężył to owijając wartość podana do withSqliteConn jako argument z konstruktora NoLoggingT, co pozwoliło withSqliteConn znaleźć MonadLogger gdzieś w stosie, i odwinął zwrócony wynik z runNoLoggingT

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