GHC.PackageDb
| Авторские права | (c) Университет Глазго 2009, Данкан Каутс 2014 |
|---|---|
| Поддержка | ghc-devs@haskell.org |
| Переносимость | переносимый |
| Безопасный Haskell | Нет |
| Язык | Haskell2010 |
Описание
Этот модуль предоставляет представление базы данных зарегистрированных пакетов GHC, которое используется как компилятором/библиотекой GHC, так и программой ghc-pkg. Он определяет формат базы данных, используемый GHC и ghc-pkg.
Формат базы данных и эта библиотека построены таким образом, чтобы GHC не зависел от библиотеки Cabal. Программа ghc-pkg выступает в качестве шлюза между внешним форматом пакета (определяемым Cabal) и внутренним форматом пакета, специализированным для GHC.
Компилятор GHC нуждается только в части информации о зарегистрированных пакетах, такой как имена модулей, различные пути и т. д. С другой стороны, ghc-pkg должен сохранять всю информацию из пакетов Cabal и уметь её предоставлять пользователям и другим инструментам.
Первый трюк заключается в дублировании некоторых данных в базе данных пакетов. По сути, в одном файле хранятся две версии базы данных: одна, используемая только ghc-pkg, которая содержит полную информацию (используя сериализованную форму типа InstalledPackageInfo, определённого библиотекой Cabal); и вторая версия, созданная ghc-pkg и используемая GHC, которая содержит только подмножество необходимой GHC информации.
Второй трюк заключается в том, что этот модуль подробно описывает только формат второй версии — часть, используемую GHC — а часть, управляемая ghc-pkg, хранится в файле, но здесь она рассматривается как нечитаемый блок данных. Таким образом, эта библиотека избегает зависимости от Cabal.
тип InstalledPackageInfo instpkgid srcpkgid srcpkgname pkgkey modulename Источник
Это подмножество InstalledPackageInfo Cabal, содержащее только те части, которые интересуют GHC.
Конструкторы
| InstalledPackageInfo | |
Поля
| |
Примеры
| (Eq instpkgid, Eq srcpkgid, Eq srcpkgname, Eq pkgkey, Eq modulename) => Eq (InstalledPackageInfo instpkgid srcpkgid srcpkgname pkgkey modulename) | |
| (Show instpkgid, Show srcpkgid, Show srcpkgname, Show pkgkey, Show modulename) => Show (InstalledPackageInfo instpkgid srcpkgid srcpkgname pkgkey modulename) | |
| (BinaryStringRep a, BinaryStringRep b, BinaryStringRep c, BinaryStringRep d, BinaryStringRep e) => Binary (InstalledPackageInfo a b c d e) |
тип ExposedModule instpkgid modulename Источник
Представляет имя модуля, экспортируемого пакетом, хранящееся в поле exposedModules. Экспорт модуля может быть реэкспортом (в этом случае exposedReexport содержит исходный источник модуля), и может быть сигнатурой (в этом случае 'exposedSignature содержит, с чем была скомпилирована сигнатура). Таким образом:
-
ExposedModule n Nothing Nothingпредставляет экспортированный модульn, который был определён в этом пакете. -
ExposedModule n (Just o) Nothingпредставляет реэкспортированный модульn, который был первоначально определён вo. -
ExposedModule n Nothing (Just s)представляет экспортированную сигнатуруn, которая была скомпилирована с реализациейs. -
ExposedModule n (Just o) (Just s)представляет реэкспортированную сигнатуру, которая была первоначально определена вoи была скомпилирована с реализациейs.
Мы используем два типа данных Maybe вместо ADT с четырьмя ветвями или четырьмя полями, потому что это представление позволяет нам единообразно обрабатывать реэкспорт/сигнатуры.
Конструкторы
| ExposedModule | |
Поля
| |
Примеры
| (Eq instpkgid, Eq modulename) => Eq (ExposedModule instpkgid modulename) | |
| (Show instpkgid, Show modulename) => Show (ExposedModule instpkgid modulename) | |
| (BinaryStringRep a, BinaryStringRep b) => Binary (ExposedModule a b) |
тип OriginalModule instpkgid modulename Источник
Исходный модуль — это полное имя модуля (идентификатор установленного пакета плюс имя модуля), представляющее, где модуль был *первоначально* определён (т. е., поле exposedReexport записи исходного ExposedModule должно быть Nothing). Инвариант: OriginalModule никогда не указывает на реэкспорт.
Конструкторы
| OriginalModule | |
Поля
| |
Экземпляры
| (Eq instpkgid, Eq modulename) => Eq (OriginalModule instpkgid modulename) | |
| (Show instpkgid, Show modulename) => Show (OriginalModule instpkgid modulename) | |
| (BinaryStringRep a, BinaryStringRep b) => Binary (OriginalModule a b) |
class BinaryStringRep a where Source
emptyInstalledPackageInfo :: (BinaryStringRep a, BinaryStringRep b, BinaryStringRep c, BinaryStringRep d) => InstalledPackageInfo a b c d e Source
readPackageDbForGhc :: (BinaryStringRep a, BinaryStringRep b, BinaryStringRep c, BinaryStringRep d, BinaryStringRep e) => FilePath -> IO [InstalledPackageInfo a b c d e] Source
Чтение части базы данных пакетов, необходимой GHC.
readPackageDbForGhcPkg :: Binary pkgs => FilePath -> IO pkgs Source
Чтение части базы данных пакетов, необходимой ghc-pkg.
Обратите внимание, что экземпляр Binary для представления пакетов ghc-pkg не определён в этом пакете. Это связано с тем, что ghc-pkg использует типы Cabal (и экземпляры Binary для них), от которых этот пакет не зависит.
writePackageDb :: (Binary pkgs, BinaryStringRep a, BinaryStringRep b, BinaryStringRep c, BinaryStringRep d, BinaryStringRep e) => FilePath -> [InstalledPackageInfo a b c d e] -> pkgs -> IO () Source
Запись всей базы данных пакетов, обеих её частей.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/bin-package-db-0.0.0.0/GHC-PackageDb.html