2013-03-16 34 views
10

Tôi đang cố gắng cài đặt ứng dụng Yesod giàn giáo đầu tiên của mình. Khi tôi chạy cabal-dev install && yesod --dev devel nó không thành công với ExitFailure 1. Tôi đang sử dụng sqlite cho liên tục.Yesod ExitFailure 1 khi cài đặt ứng dụng giàn giáo

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 

Tôi đã thử làm theo hướng dẫn ở đây: http://www.yesodweb.com/book/scaffolding-and-the-site-template đã không được quản lý để tìm thấy bất kỳ thông tin liên quan đến vấn đề này. Bất kỳ manh mối nào về những gì còn thiếu?

Trả lời

4

Thông báo lỗi cho biết trường hợp MonadLogger IO bị thiếu. Vấn đề là phiên bản đã cài đặt của monad-logger quá mới. monad-logger-0.2.4includes the instance bạn cần, monad-logger-0.3.0 và cao hơn apparently don't.

Giải pháp: Thêm && < 0.3.0 vào dòng monad-logger trong tệp cabal của bạn và thực hiện lại cabal install --only-dependencies.

(Nếu không có dòng monad-logger, thêm một mặt hàng như , monad-logger < 0.3.0.

+0

Đó đã làm nó. Cảm ơn rất nhiều! –

7

Sử dụng một trong những runFooLoggingT chức năng từ Control.Monad.Logger. Đặc biệt có runNoLoggingT.

Đây có lẽ là một nhiều, ý tưởng tốt hơn nhiều so với sửa chữa cho mình một phiên bản cũ của thư viện!

+0

Tôi nhận được lỗi biên dịch liên quan (tôi nghĩ) khi cố gắng biên dịch ví dụ xác thực email trên [trang này] (http://www.yesodweb.com/book-1.1/authentication-and-authorization). Lỗi biên dịch là "Không có cá thể nào cho (Control.Monad.Logger.MonadLogger IO) phát sinh từ việc sử dụng' runMigration '. Nếu bạn nghĩ nó sẽ giúp ích, bạn có thể đưa ra một số gợi ý về nơi chèn runNoLoggingT vào mã đó không? m đoán rằng đi đâu đó trong chính ở dưới cùng của trang, không chắc chắn nơi – Tad

+0

Đưa runNoLoggingT ở phía trước của chính đã làm các trick.Đây là chính mà biên dịch: 'chính – Tad

+0

Ran ra khỏi thời gian trên bình luận trước .... Đặt runNoLoggingT ở phía trước của chính trong nguồn mà tôi liên kết đến đã làm các trick.Tôi cũng cần thiết để thêm một liftIO trước khi warpDebug.Tôi muốn dán mã cố định ở đây cho những người khác để xem, nhưng tôi không biết làm thế nào để dán mã Cảm ơn Colin vì gợi ý lớn! – Tad

4

Tôi vẫn cảm thấy thoải mái với máy biến áp, vì vậy theo sau câu trả lời của Colin, đây là cách rất nhanh để tắt ghi nhật ký hoàn toàn:

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

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

Về cơ bản hãy tái tạo ví dụ NoLoggingT cho MonadIO.

Tuy nhiên, khi bạn nhận được bản sửa lỗi nhanh này trên codebase của mình, bạn nên truy cập trang Monad Transformers tại Haskell Wiki như tôi đang làm ngay bây giờ;)

0

FYI, tôi đã vượt qua điều này bằng cách gói giá trị cung cấp cho withSqliteConn như tranh cãi với các NoLoggingT constructor, cho phép withSqliteConn để tìm MonadLogger đâu đó trong ngăn xếp, tôi tháo kết quả trả về với runNoLoggingT

mainWithExplicitConnection2:: IO() 
mainWithExplicitConnection2 = 
    runNoLoggingT $ withSqliteConn ":memory:" $ \conn -> 
     NoLoggingT $ flip runSqlPersistM conn $ runMigration migrateAll 
Các vấn đề liên quan