Как диагностировать «Возможно, вам нужно добавить xxx в build-зависит от вашего файла .cabal», когда он уже находится в файле cabal? - PullRequest
0 голосов
/ 15 февраля 2019

Я думаю, что единственные интересные биты - это мой импорт и мой файл клики.Вот импорт и демонстрация того, как я бы использовал проблемный импорт (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

Стоит отметить, что у меня есть cql-io в моем extra-deps в stack.yaml, так как последняя версия еще не была в LTS.

Вопросы и ответы из комментариев

Q Есть ли другие компоненты в вашем файле cabal (например, исполняемые файлы, тесты производительности, наборы тестов)?

A Да

Q Они также используют FDS.Database.Cassandra (но, возможно, независимо от cql-io)?

A Пока нет, но планирую позже.Поэтому я еще не коснулся других компонентов.

Q Версия cql-io, выбранная вашим инструментом сборки, все еще экспортирует Database.CQL.IO.Log?

A Кажется, что делает это .

Q Какую команду вы выполняете, когда видите, чтоошибка?

A stack --nix build Единственный интересный бит, который делает --nix (AFAIK), это получение необходимых системных пакетов, например, OpenSSL.

1 Ответ

0 голосов
/ 15 февраля 2019

Комментарии выше были очень проницательными для общего случая вопроса (в том виде, как он был поставлен);ответ заключается в том, что для библиотек, которые недавно были поддержаны 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)
...