2015-12-07 17 views
5

Sto usando Haskell versione 7.8.4 su (X) Ubuntu 15.10, con Cabal-Install 1.18 entrambi installati tramite apt. Non ho tentato di installare nulla di Haskell a mano su questa macchina. Ho impostato una sandbox cabal, ho recuperato e installato un modulo solo per scoprire che lo ghc non sembra essere in ripresa. ghc -v sembra suggerire che ho due versioni della libreria cabal che si ombreggiano reciprocamente. Come funziona?GHC non trova il modulo nella sandbox cabale

Sto iniziando con una directory vuota /tmp/haskell-example

poi faccio un cabal sandbox init.

$ cabal sandbox init 
Writing a default package environment file to 
/tmp/haskell-example/cabal.sandbox.config 
Creating a new sandbox at /tmp/haskell-example/.cabal-sandbox 

poi installo natural-numbers perché voglio utilizzare il modulo Data.Natural in un programma. Questa operazione ha successo.

$ cabal install natural-numbers 
Resolving dependencies... 
Notice: installing into a sandbox located at 
/tmp/haskell-example/.cabal-sandbox 
Configuring natural-numbers-0.1.2.0... 
Building natural-numbers-0.1.2.0... 
Installed natural-numbers-0.1.2.0 

posso verificare che il modulo Data.Natural ha infatti stato installato alla sandbox cabala.

$ ls /tmp/haskell-example/.cabal-sandbox/lib/x86_64-linux-ghc-7.8.4/natural-numbers-0.1.2.0 
Data 
libHSnatural-numbers-0.1.2.0.a 
libHSnatural-numbers-0.1.2.0-ghc7.8.4.so 
$ ls /tmp/haskell-example/.cabal-sandbox/lib/x86_64-linux-ghc-7.8.4/natural-numbers-0.1.2.0/Data 
Natural.dyn_hi 
Natural.hi 

poi creare un semplice file Main.hs che importa Data.Natural ma non la usa.

module Main where 

import Data.Natural 

main = putStrLn "Hello World" 

Quando provo a ghc Main.hs compaiono i seguenti:

$ ghc Main.hs 
Main.hs:3:8: 
    Could not find module ‘Data.Natural’ 
    Use -v to see a list of the files searched for. 

Con la bandiera verbose abilitato, sembra come se la mia cabala è sempre ombreggiato da una cabala più tardi, che è a sua volta shadowing del prima cabala. Perché sta succedendo?

$ ghc -v Main.hs 
Glasgow Haskell Compiler, Version 7.8.4, stage 2 booted by GHC version 7.8.4 
Using binary package database: /usr/lib/ghc/package.conf.d/package.cache 
hiding package Cabal-1.18.1.5 to avoid conflict with later version Cabal-1.22.1.1 
wired-in package ghc-prim mapped to ghc-prim-0.3.1.0-ec14d2f6075975a2ce9112eae431c8e1 
wired-in package integer-gmp mapped to integer-gmp-0.5.1.0-de4898ebdc5ab81cedce89121ae9ac84 
wired-in package base mapped to base-4.7.0.2-5ef1e7e809bc3b18d74efc783356e209 
wired-in package rts mapped to builtin_rts 
wired-in package template-haskell mapped to template-haskell-2.9.0.0-c1976a420ad8b9b589eee08844c59ba2 
wired-in package dph-seq not found. 
wired-in package dph-par not found. 
Hsc static flags: 
hiding package Cabal-1.18.1.5 to avoid conflict with later version Cabal-1.22.1.1 
wired-in package ghc-prim mapped to ghc-prim-0.3.1.0-ec14d2f6075975a2ce9112eae431c8e1 
wired-in package integer-gmp mapped to integer-gmp-0.5.1.0-de4898ebdc5ab81cedce89121ae9ac84 
wired-in package base mapped to base-4.7.0.2-5ef1e7e809bc3b18d74efc783356e209 
wired-in package rts mapped to builtin_rts 
wired-in package template-haskell mapped to template-haskell-2.9.0.0-c1976a420ad8b9b589eee08844c59ba2 
wired-in package dph-seq not found. 
wired-in package dph-par not found. 
*** Chasing dependencies: 
Chasing modules from: *Main.hs 

Main.hs:3:8: 
    Could not find module ‘Data.Natural’ 
    Locations searched: 
    Data/Natural.hs 
    Data/Natural.lhs 
*** Deleting temp files: 
Deleting: 
*** Deleting temp dirs: 
Deleting: 
+0

hai aggiornato il tuo file .cabal? – Sigrlami

+0

@ Sigrlami, ho paura di non capire. Ho una directory chiamata '$ HOME/.cabal' e'/tmp/haskell-example/.cabal-sandbox', ma nessun file '.cabal'. Cosa dovrei fare per aggiornarlo? –

+0

Quando usi il comando 'cabal init' all'interno del tuo progetto sta creando il file' foo.cabal' che descrive tutte le dipendenze necessarie, e devi aggiungerle manualmente. Supponendo che il nome del tuo progetto 'foo'.Ad esempio, https://github.com/sigrlami/pollock/blob/master/pollock.cabal – Sigrlami

risposta

6

Se siete in incisione manuale, è possibile passare a GHC posizione pkg db della sandbox, come ad esempio:

ghc Main.hs -package-db .cabal-sandbox/x86_64-linux-ghc-7.10.2-packages.conf.d/ 

Tuttavia il modo "normale" per usare sandbox è quello di compilare sempre utilizzando cabal build (o cabal install senza parametri) anziché eseguire direttamente ghc.

  1. Run cabal init, rispondere a domande come ti pare
  2. Modificare il conseguente foo.cabal di file (foo è il nome del pacchetto).
  3. Run cabal build o cabal install - questo eseguirà ghc per te.

Quando si modifica il file cabal, controllare che i moduli esportati (se è una lib) siano elencati e che il proprio src principale sia corretto. Assicurarsi inoltre che le dipendenze come siano elencate nella clausola build-depends:.

+1

Attendi un secondo. Penso che stavo pensando a 'cabal' completamente nel modo sbagliato. Mi aspettavo che una sandbox cabal si comportasse come un ambiente virtualenv o npm e alterasse il comportamento di ghc, ma sembra che l'unica somiglianza sia che reindirizza dove 'cabal install' installa le cose. Questo ha molto senso ora. –

Problemi correlati