Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何以编程方式检索GHC包信息?_Haskell_Ghc_Cabal_Hackage - Fatal编程技术网

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找到的所有的,以模仿它的行为。