2013-03-03 4 views
48

Dato un insieme di pacchetti di cabali, esiste un modo per calcolare automaticamente un sottoinsieme di pacchetti indipendenti? In altre parole, sottoinsieme di pacchetti che saranno sufficienti per installarli tutti.Sottoinsieme indipendente di pacchetti di cabine impostati

Per [network,parsec] la risposta è [network] perché network dipende parsec.

Per [network,containers] la risposta è [network,containers] perché:

  • network non dipende containers
  • tutti network s dipendenze non dipende containers
  • containers non dipende network
  • tutti containers s le dipendenze non dipendono da network

Non è difficile trovare la risposta per 2 pacchetti. La cosa veramente interessante è scoprire il set indipendente per [containers, directory, filepath, lens, xml, http-conduit, regex-posix, monad-control, unordered-containers, glib, hashable, hspec, split, aeson, attoparsec, stm, QuickCheck].


Dalla risposta mi aspetto qualche funzione basato sulla libreria cabala come ∷ [Packages] → IO [Packages].

+2

Sembra che "Distribution.Client.PackageIndex.dependencyClosure" sia ciò di cui hai bisogno. –

+0

Intendi ['Distribution.Simple.PackageIndex.dependencyClosure'] (http://hackage.haskell.org/packages/archive/Cabal/latest/doc/html/Distribution-Simple-PackageIndex.html#v:dependencyClosure) ? –

+1

La versione Git di cabal-install ('Distribution.Client. *') È ora anche una libreria. –

risposta

1

La cabala si sta spostando verso un modello più simile a NPM, che renderà la risoluzione delle dipendenze molto più semplice. Ogni pacchetto installato manterrà una copia locale delle sue dipendenze, scambiando un po 'di spazio su disco per il mal di testa dell'installazione di più pacchetti globali con richieste di versioning dei pacchetti mutuamente esclusive.

Sotto questo modello, il sottoinsieme di pacchetti necessari per installare un set di pacchetti == impostati. Sebbene uno possa essere una dipendenza dell'altro, ogni copia installata manterrà la propria copia locale delle sue dipendenze, quindi Cabal non considererà più la dipendenza installata in quel modo.

+0

Dove (a -> b) significa 'a' dipende da' b'. Cosa succede quando installi 'a' dove (a -> b-0.9) e' d' dove (d -> b-1.5).'a' e' d' entrambi espongono i tipi da b, ma i tipi sono cambiati da b-0.9 a b-1.5? So come ghc lo gestisce ora, semplicemente non interagiscono poiché sono di diverso tipo, in realtà anche quando sono implementati lo stesso ghc rimane al sicuro e li tratta come diversi poiché provengono da versioni diverse. In che modo NPM gestisce questo problema? – Davorak

+0

Si spera che le classi di tipi Haskell/Node.js coinvolte siano utilizzate solo da dipendenze di basso livello, non dall'app in generale. In Node.js, le classi possono essere definite localmente, quindi questo non dovrebbe essere un problema a meno che l'app non provi a comunicare oggetti con librerie diverse con definizioni di classi differenti. Lo stesso vale per Haskell, credo. – mcandre

Problemi correlati