2014-05-07 3 views
25

Recentemente mi sono imbattuto in un problema "cabal hell" che sono riuscito a risolvere solo installando manualmente transformers-compat con il flag -f transformers3 nella mia sandbox cabal prima di eseguire cabal install per il mio progetto.C'è un modo per definire i flag per le dipendenze cabal?

C'è un modo per indicare nel file .cabal della mia applicazione che dipende da una libreria in modo che sia costruita con lo specifico flag di compilazione?

+2

Sembra che non sia possibile. 'buiildDepends' è definito come' [dipendenza] ', dove' Dipendenza dei dati = Dipendenza PackageName VersionRange'. Puoi usare 'cabal install --constraint =" transformers-compat + transformers3 "', comunque. –

+0

A prima vista, sembra che i trasformatori-compat si suppone che siano uno spessore utilizzato per vecchi progetti con vecchie dipendenze. È possibile aggiornare il pacchetto in modo che dipenda dalla versione più recente dei trasformatori? –

+1

Guardando il file 'transformers-compat.cabal', penso che il risolutore dovrebbe essere in grado di capire l'assegnazione di flag corretta se si limita la dipendenza dai' transformers 'in modo appropriato. Per esempio. 'build-depends: transformers> = 0.3 && <0.4' dovrebbe forzare il risolutore a scegliere' transformers-compat + transformers3'. Se questo non funziona, potrebbe essere un bug nel risolutore. –

risposta

7

Il modo moderno per farlo è utilizzare Stack.Modificare la stack.yaml per includere

flags: 
    transformers-compat: 
    transformers3: true 

Vedi anche la sezione flags.

+0

che ha salvato il giorno – nicolas

-1

Ci sono un paio di modi per vincolare la versione per l'installazione.

  1. Aggiungere limiti inferiore e superiore per confezionare versioni nel file cabala come Mikhail di cui sopra, example of such a file here

  2. Inoltre, è possibile ignorare le impostazioni nel file .cabal con il flag cabal install --constraint="bar-2.1"

Per rimuovere una versione specifica di un pacchetto:

  • In una sandbox è possibile annullare la registrazione di una versione con cabal sandbox hc-pkg unregister bar-2.1
  • l'annullamento della registrazione globale può essere fatto con questo comando al di fuori della sandbox ghc-pkg unregister bar-2.1
13

[Copiato dalla sezione commenti.]

sembra che sia non è possibile specificare tale dipendenza tramite il campo build-depends nel file .cabal. buildDepends is defined as [Dependency], dove data Dependency = Dependency PackageName VersionRange. È possibile utilizzare cabal install --constraint="transformers-compat +transformers3", tuttavia.

Guardando il file transformers-compat.cabal, penso che il risolutore dovrebbe essere in grado di capire l'assegnazione di flag corretta se si limita la dipendenza su transformers in modo appropriato. Per esempio. build-depends: transformers >= 0.3 && < 0.4 dovrebbe forzare il risolutore a scegliere transformers-compat +transformers3. Se questo non funziona, potrebbe essere un bug nel risolutore.

A parte: chiamare qualsiasi tipo di problema tecnico con Cabal "Cabal hell" non è molto informativo. Sarebbe più semplice aiutarti se hai descritto il messaggio di errore che stavi ricevendo.

7

Ho anche faticato a lungo per trovare una soluzione a questo problema. L'ho appena trovato! Devi modificare il file di configurazione della cabala globale su ~/.cabal/config. Aggiungere una linea come questa alla sezione iniziale del file:

vincoli: hmatrix + openblas

In questo modo la bandiera openblas per il pacchetto hmatrix. Sarà usato automaticamente la volta successiva che il pacchetto è installato. Se esiste un modo per impostare localmente tale flag per una sandbox, non riesco a trovarlo.

+3

L'ultima versione di Cabal sembra utilizzare la parola chiave 'constraints' (notare il plurale). –