我认为唯一有趣的位是我的进口和我的阴谋。这是我将如何使用有问题的导入的导入和演示(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
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
但是,正如我们从阴谋上看到的那样,它在那里:
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
要注意的一件事,我在stack.yaml
中的extra-deps
中确实有CQL-IO,因为最新版本尚未在LTS中。
q& a来自注释
q 您的阴谋集中是否还有其他组件(例如可执行文件,基准,测试套件)?
a 是
q 他们是否还使用fds.database.cassandra(但也许不取决于CQL-IO)?
a 尚未,而是计划以后。所以我还没有触摸其他组件。
q 您的构建工具选择的CQL-IO版本是否仍然导出数据库。cql.io.log?
a 它似乎是这样做的。
q 看到该错误时您正在运行的确切命令是什么?
a stack --nix build
--nix
正在使用的唯一有趣的位(afaik)正在拉动所需的系统软件包,例如OpenSSL。
上面的评论对问题的一般情况非常有见地(如提出);答案是,Cabal最近支持的子图案可能没有声明visibility: true
。
但是,在我的具体情况下,答案是查看有问题的库的重新出口。我可以解决这个问题,因为CQL-IO作者从主库重新出口了Logger (..)
和LogLevel(..)
。
这样就可以允许我编写我的代码。
当我试图使用tinylog时,一个更好的答案是我的情况非常具体的,就是已经有一个库...这是该库中的代码,证明了如何解决问题(并完全解决我的问题,因为我现在不必编写任何代码)。
这是相关摘录:
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)