我主要对基于堆栈构建的项目的这个问题感兴趣。
我通过编写一个脚本来解决这个问题,该脚本分析命令的输出,如ghc-pkg field SOMEPKG hs-libraries等。
但是这种方法相当慢,主要是因为使用堆栈命令从项目中提取信息。
有没有其他方法可以不用很多工具来解决这个问题呢?
编辑
这是剧本草稿。
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发布于 2017-06-23 20:52:06
$ stack list-dependencies
MonadPrompt 1.0.0.5
MonadRandom 0.4
StateVar 1.1.0.1
...对于阴谋项目,请尝试cabal freeze --help
https://stackoverflow.com/questions/44729092
复制相似问题