如何诊断“也许你需要在构建中添加xxx - 取决于你的.cabal文件”,当它已经在cabal文件中时?

问题描述 投票:1回答:1

我认为唯一有趣的部分是我的导入和我的cabal文件。以下是我将如何使用有问题的导入(Database.CQL.IO.Log)的导入和演示。

module FDS.Database.Cassandra where

import           Prelude                         hiding(init)
import           Database.CQL.IO                 as Client hiding(Logger)
import           Database.CQL.IO.Log             as CQLLog
import qualified Database.CQL.Protocol           as CQL
import           Numeric.Natural
import           System.Logger                   (Logger)

cqlLogger :: Logger -> CQLLog.Logger
cqlLogger logger = undefined

但是,我收到错误:

src/FDS/Database/Cassandra.hs:7:1: error:                                                                                              
    Could not load module `Database.CQL.IO.Log'                                                                                                                                    
    It is a member of the hidden package `cql-io-1.1.0'.                                                                                                                           
    Perhaps you need to add `cql-io' to the build-depends in your .cabal file.                                                                                                     
    Use -v to see a list of the files searched for.                                                                                                                                
  |                                                                                                                                                                                
7 | import           Database.CQL.IO.Log             as CQLLog                                                                                                                     
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                                                     

但正如我们从cabal文件中看到的那样,它存在于:

library
  ghc-options:    -Wall -Wtabs -Wincomplete-record-updates
  default-extensions:
      OverloadedStrings

  exposed-modules:
    FDS
    , FDS.Config.Core
    , FDS.Config.Dhall
    , FDS.Data.Util
    , FDS.Database.Cassandra

  other-modules:
    FDS.Data.Hobo.Defs

  build-depends:
    prelude
    , base-noprelude    ^>=4.12
    , bytestring        ^>=0.10.8.2
    , conduit           ^>=1.3.1
    , containers        ^>=0.6
    , cql               ^>=4.0.1
    , cql-io            ^>=1.1.0

有一点需要注意,我在extra-depsstack.yaml中有cql-io,因为最新版本还没有在LTS中。

来自评论的问答

问您的cabal文件中是否还有其他组件(例如可执行文件,基准测试,测试套件)?

是的

问他们是否也使用FDS.Database.Cassandra(但可能不依赖于cql-io)?

A尚未,但计划稍后。所以我还没有触及其他组件。

问:构建工具选择的cql-io版本是否仍然导出Database.CQL.IO.Log?

A它seems to do so

问:当您看到错误时,您运行的确切命令是什么?

一个stack --nix build --nix正在做的唯一有趣的一点(AFAIK)是拉入所需的系统包,例如OpenSSL。

haskell haskell-stack
1个回答
0
投票

上述评论对该问题的一般情况非常有见地(如所提出的);答案是,最近由cabal支持的子库可能没有声明visibility: true

但在我的具体案例中,答案是看看有问题的图书馆的再出口。我可以解决这个问题,因为cql-io作者从主库中重新导出了Logger (..)LogLevel(..)

这样我就可以编写代码了。

一个更好的答案是非常具体的我的情况,因为我试图使用TinyLog,是有is a library已经...来自该库的here is the code演示如何解决问题(并完全解决了我的问题) ,因为我现在不应该写任何代码)。

以下是相关摘录:

module Database.CQL.IO.Tinylog (mkLogger) where

import Data.ByteString.Builder
import Data.ByteString.Lazy (ByteString)
import Database.CQL.IO (Logger (..), LogLevel (..))
import Database.CQL.IO.Hexdump

import qualified Data.ByteString.Lazy as L
import qualified System.Logger        as Tiny

-- | Create a cql-io 'Logger' that delegates log messages to
-- the given tinylog 'Tiny.Logger'. Requests and responses are
-- logged on 'Tiny.Trace' level.
mkLogger :: Tiny.Logger -> Logger
mkLogger l = Logger
    { logMessage  = tinylogMessage  l
    , logRequest  = tinylogRequest  l
    , logResponse = tinylogResponse l
    }

以下是我在上面的示例中调整我的导入以确认并让GHC满意的方法(尽管我现在要废弃这个以支持使用cql-io-tinylog):

import           Prelude                         hiding(init, log)
import           Database.CQL.IO                 hiding(Logger)
import qualified Database.CQL.IO                 as CQLIO
import qualified Database.CQL.Protocol           as CQL
import           Numeric.Natural
import           System.Logger                   hiding(defSettings)
© www.soinside.com 2019 - 2024. All rights reserved.