2017-06-23 2 views
1

Je suis principalement intéressé par ce problème pour les projets construits sur la base de la pile .Comment transitif obtenir une liste de bibliothèques dont un certain projet dépend?

j'ai réussi à résoudre ce problème en écrivant un script qui analyse la sortie de la commande comme ghc-pkg field SOMEPKG hs-libraries etc.

Mais cette approche est plutôt lent, principalement en raison de l'utilisation de pile commande pour obtenir des informations d'extrait un projet.

Existe-t-il un autre moyen de résoudre ce problème sans utiliser beaucoup d'outils?


EDIT


Ce projet est de script.

main = do 
    pkgSet <- newIORef . asHashSet $ mempty 
    libSet <- newIORef . asHashSet $ mempty 
    let proc ghcId pkgId = do 
      guard =<< (liftIO . map (pkgId `notMember`) . readIORef $ pkgSet) 
      liftIO . modifyIORef pkgSet $ insertSet pkgId 

      libDir1 <- lineToText <$> inproc "ghc-pkg" 
       ["--simple-output", "field", pkgId, "dynamic-library-dirs"] 
       (pure "") 
      libDir2 <- lineToText <$> inproc "ghc-pkg" 
       ["--simple-output", "field", pkgId, "library-dirs"] (pure "") 
      libDir <- select . filter (not . null) $ [libDir1, libDir2] 
      lib <- select =<< (map (words . lineToText) $ inproc "ghc-pkg" 
       ["--simple-output", "field", pkgId, "hs-libraries"] (pure "")) 
      let libPath = asText . repack $ repack libDir 
         </> (shlibPrefix ++ repack lib ++ "-" ++ repack ghcId) 
         <.> shlibSuffix 

      guard =<< (liftIO . map (libPath `notMember`) . readIORef $ libSet) 
      guard =<< (liftIO . doesFileExist . repack $ libPath) 
      liftIO . modifyIORef libSet $ insertSet libPath 

      dep <- select =<< (map (words . lineToText) $ inproc "ghc-pkg" 
       ["--simple-output", "field", pkgId, "depends"] (pure "")) 
      proc ghcId dep 
    sh $ do 
     ghcPkgPath <- lineToText <$> inshell "stack path --ghc-package-path" (pure "") 
     export "GHC_PACKAGE_PATH" ghcPkgPath 

     ghcVer <- lineToText <$> inshell "stack exec -- ghc --numeric-version" (pure "") 
     let ghcId = "ghc" ++ ghcVer 

     [pkg, ver] <- words . lineToText <$> inshell "stack list-dependencies" (pure "") 
     let pkgId = pkg ++ "-" ++ ver 
     proc ghcId pkgId 
    -- processing libSet 

Répondre

0
$ stack list-dependencies 
MonadPrompt 1.0.0.5 
MonadRandom 0.4 
StateVar 1.1.0.1 
... 

Pour les projets de cabale essayer cabal freeze --help

+0

Tout d'abord, je dois à la fermeture de cet ensemble. Deuxièmement, je n'ai pas besoin de noms de paquets, j'ai besoin d'une liste de bibliothèques dans ces paquets avec des chemins d'accès. 'stack list-dependencies' c'est juste la première racine de mon script. – freestyle

+0

Les dépendances de liste de piles génèrent toutes les dépendances, il ne devrait donc pas être nécessaire de les recurcir. Vous aurez en effet besoin de consulter ghc-pkg pour le chemin de la bibliothèque. – mgsloan

+0

@freestyle alors on ne sait pas ce que vous demandez. "liste des bibliothèques dans ces paquets": voulez-vous dire la liste des modules? Chaque paquet a au plus une bibliothèque. Votre question ne mentionne pas du tout les chemins – jberryman