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
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
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
@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