我认为唯一有趣的部分是我的导入和我的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-deps
的stack.yaml
中有cql-io,因为最新版本还没有在LTS中。
来自评论的问答
问您的cabal文件中是否还有其他组件(例如可执行文件,基准测试,测试套件)?
是的
问他们是否也使用FDS.Database.Cassandra(但可能不依赖于cql-io)?
A尚未,但计划稍后。所以我还没有触及其他组件。
问:构建工具选择的cql-io版本是否仍然导出Database.CQL.IO.Log?
问:当您看到错误时,您运行的确切命令是什么?
一个stack --nix build
--nix
正在做的唯一有趣的一点(AFAIK)是拉入所需的系统包,例如OpenSSL。
上述评论对该问题的一般情况非常有见地(如所提出的);答案是,最近由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)