Haskell 如何以编程方式检索GHC包信息?
更具体地说,给定任意包名,我需要检索相同的Haskell 如何以编程方式检索GHC包信息?,haskell,ghc,cabal,hackage,Haskell,Ghc,Cabal,Hackage,更具体地说,给定任意包名,我需要检索相同的library dirs字段,该字段可以通过运行的Haskell程序内部的ghc pkg descripe命令获得。如果您使用cabal配置和构建程序/库,则可以使用自动生成的路径模块 例如,如果您有一个foo.cabal文件,cabal将生成一个Paths\u foo模块(请参见dist/build/autogen下的源代码),您可以导入该模块。此模块导出一个函数getLibDir::IO FilePath,该函数具有您要查找的值。如果您使用cabal
library dirs
字段,该字段可以通过运行的Haskell程序内部的ghc pkg descripe
命令获得。如果您使用cabal配置和构建程序/库,则可以使用自动生成的路径模块
例如,如果您有一个
foo.cabal
文件,cabal将生成一个Paths\u foo
模块(请参见dist/build/autogen
下的源代码),您可以导入该模块。此模块导出一个函数getLibDir::IO FilePath
,该函数具有您要查找的值。如果您使用cabal配置和构建程序/库,则可以使用自动生成的路径模块
例如,如果您有一个
foo.cabal
文件,cabal将生成一个Paths\u foo
模块(请参见dist/build/autogen
下的源代码),您可以导入该模块。此模块导出一个函数getLibDir::IO FilePath
,该函数具有您要查找的值。已安装软件包数据库的格式为
import Distribution.InstalledPackageInfo
导入分发包
导入分发文本
导入GHC路径
导入系统
导入System.FilePath
main=do
名称:\安装的软件包数据库的格式为
import Distribution.InstalledPackageInfo
导入分发包
导入分发文本
导入GHC路径
导入系统
导入System.FilePath
main=do
姓名:\询问哈斯克尔咖啡馆@或阴谋集团邮件列表上的邓肯·库茨。(我是认真的。对于阴谋集团的问题,这是一个比堆栈溢出更好的论坛)
有时候,你只需要把人们指向不同的论坛。在haskell cafe@或cabal邮件列表上询问Duncan Coutts。(我是认真的。对于阴谋集团的问题,这是一个比堆栈溢出更好的论坛)
有时候,你只需要把人们引向另一个论坛。以下是我可以通过查看ghc pkg
源代码得出的结论
getPkgInfos
函数返回所有已安装软件包(希望包括用户安装的软件包)的软件包定义。有了它,您可以检索库目录和其他包信息。有关详细信息,请参阅
GHC_PKGCONF
变量需要指向系统的全局包配置文件,该文件不在通常的位置<代码>ghc pkg
通过Ubuntu中的包装器脚本接收命令行标志来解决这个问题
import qualified Config
import qualified System.Info
import Data.List
import Distribution.InstalledPackageInfo
import GHC.Paths
import System.Directory
import System.Environment
import System.FilePath
import System.IO.Error
getPkgInfos :: IO [InstalledPackageInfo]
getPkgInfos = do
global_conf <-
catch (getEnv "GHC_PKGCONF")
(\err -> if isDoesNotExistError err
then do let dir = takeDirectory $ takeDirectory ghc_pkg
path1 = dir </> "package.conf"
path2 = dir </> ".." </> ".." </> ".."
</> "inplace-datadir"
</> "package.conf"
exists1 <- doesFileExist path1
exists2 <- doesFileExist path2
if exists1 then return path1
else if exists2 then return path2
else ioError $ userError "Can't find package.conf"
else ioError err)
let global_conf_dir = global_conf ++ ".d"
global_conf_dir_exists <- doesDirectoryExist global_conf_dir
global_confs <-
if global_conf_dir_exists
then do files <- getDirectoryContents global_conf_dir
return [ global_conf_dir ++ '/' : file
| file <- files
, isSuffixOf ".conf" file]
else return []
user_conf <-
try (getAppUserDataDirectory "ghc") >>= either
(\_ -> return [])
(\appdir -> do
let subdir = currentArch ++ '-':currentOS ++ '-':ghcVersion
user_conf = appdir </> subdir </> "package.conf"
user_exists <- doesFileExist user_conf
return (if user_exists then [user_conf] else []))
let pkg_dbs = user_conf ++ global_confs ++ [global_conf]
return.concat =<< mapM ((>>= return.read).readFile) pkg_dbs
currentArch = System.Info.arch
currentOS = System.Info.os
ghcVersion = Config.cProjectVersion
导入限定配置
导入合格的系统信息
导入数据。列表
导入Distribution.InstalledPackageInfo
导入GHC路径
导入系统目录
导入系统。环境
导入System.FilePath
导入系统IO错误
getPkgInfos::IO[InstalledPackageInfo]
getPkgInfos=do
如果ISDOESNOTEXTISTERROR错误,则为全局配置
然后让dir=takeDirectory$takeDirectory ghc_pkg
path1=dir“package.conf”
路径2=目录“.”“…”
“就地数据目录”
“package.conf”
exists1以下是我可以通过查看ghc pkg
源代码得出的结论
getPkgInfos
函数返回所有已安装软件包(希望包括用户安装的软件包)的软件包定义。有了它,您可以检索库目录和其他包信息。有关详细信息,请参阅
GHC_PKGCONF
变量需要指向系统的全局包配置文件,该文件不在通常的位置<代码>ghc pkg
通过Ubuntu中的包装器脚本接收命令行标志来解决这个问题
import qualified Config
import qualified System.Info
import Data.List
import Distribution.InstalledPackageInfo
import GHC.Paths
import System.Directory
import System.Environment
import System.FilePath
import System.IO.Error
getPkgInfos :: IO [InstalledPackageInfo]
getPkgInfos = do
global_conf <-
catch (getEnv "GHC_PKGCONF")
(\err -> if isDoesNotExistError err
then do let dir = takeDirectory $ takeDirectory ghc_pkg
path1 = dir </> "package.conf"
path2 = dir </> ".." </> ".." </> ".."
</> "inplace-datadir"
</> "package.conf"
exists1 <- doesFileExist path1
exists2 <- doesFileExist path2
if exists1 then return path1
else if exists2 then return path2
else ioError $ userError "Can't find package.conf"
else ioError err)
let global_conf_dir = global_conf ++ ".d"
global_conf_dir_exists <- doesDirectoryExist global_conf_dir
global_confs <-
if global_conf_dir_exists
then do files <- getDirectoryContents global_conf_dir
return [ global_conf_dir ++ '/' : file
| file <- files
, isSuffixOf ".conf" file]
else return []
user_conf <-
try (getAppUserDataDirectory "ghc") >>= either
(\_ -> return [])
(\appdir -> do
let subdir = currentArch ++ '-':currentOS ++ '-':ghcVersion
user_conf = appdir </> subdir </> "package.conf"
user_exists <- doesFileExist user_conf
return (if user_exists then [user_conf] else []))
let pkg_dbs = user_conf ++ global_confs ++ [global_conf]
return.concat =<< mapM ((>>= return.read).readFile) pkg_dbs
currentArch = System.Info.arch
currentOS = System.Info.os
ghcVersion = Config.cProjectVersion
导入限定配置
导入合格的系统信息
导入数据。列表
导入Distribution.InstalledPackageInfo
导入GHC路径
导入系统目录
导入系统。环境
导入System.FilePath
导入系统IO错误
getPkgInfos::IO[InstalledPackageInfo]
getPkgInfos=do
如果ISDOESNOTEXTISTERROR错误,则为全局配置
然后让dir=takeDirectory$takeDirectory ghc_pkg
path1=dir“package.conf”
路径2=目录“.”“…”
“就地数据目录”
“package.conf”
谢谢你的回答,但这不是我想要的。我需要检索其他已安装软件包的lib dirs,而不是我自己的。谢谢你的回答,但这不是我想要的。我需要检索其他已安装软件包的lib dirs,而不是我自己的。是的,这基本上是我编写的更全面的版本——而不是只使用一个硬编码的%GHC_ROOT%/package.conf
,,我想你已经找到了所有常用的。为了模仿ghc pkg的行为,我试图找到所有ghc pkg找到的。是的,这基本上是我所写内容的一个更全面的版本——而不是只使用一个硬编码的%ghc_ROOT%/package.conf
,我想你已经找到了所有常用的。我试着找到了ghc pkg找到的所有的,以模仿它的行为。