Cabal-1.10.1.0: A framework for packaging Haskell software

Portability | portable
Maintainer | cabal-devel@haskell.org

Distribution.Package

Contents

- Package ids
- Installed package identifiers
- Package source dependencies
- Package classes

Description

Defines a package identifier along with a parser and pretty printer for it. `PackageIdentifier`s consist of a name and an exact version. It also defines a `Dependency` data type. A dependency is a package name and a version range, like `"foo >= 1.2 && < 2"`.

Synopsis

- newtype PackageName = PackageName String
- data PackageIdentifier = PackageIdentifier {
  - pkgName :: PackageName
  - pkgVersion :: Version
  }
- type PackageId = PackageIdentifier
- newtype InstalledPackageId = InstalledPackageId String
- data Dependency = Dependency PackageName VersionRange
- thisPackageVersion :: PackageIdentifier -> Dependency
- notThisPackageVersion :: PackageIdentifier -> Dependency
- simplifyDependency :: Dependency -> Dependency
- class Package pkg where
  - packageId :: pkg -> PackageIdentifier
- packageName :: Package pkg => pkg -> PackageName
- packageVersion :: Package pkg => pkg -> Version
- class Package pkg => PackageFixedDeps pkg where
  - depends :: pkg -> [PackageIdentifier]

# Package ids

newtype PackageName

Constructors

PackageName String |

Instances

Eq PackageName |
Ord PackageName |
Read PackageName |
Show PackageName |
Text PackageName |

data PackageIdentifier

The name and version of a package.

Constructors

PackageIdentifier |

Fields

pkgName :: PackageName

  The name of this package, eg. foo

pkgVersion :: Version

  the version of this package, eg 1.2

Instances

Eq PackageIdentifier |
Ord PackageIdentifier |
Read PackageIdentifier |
Show PackageIdentifier |
Text PackageIdentifier |
Package PackageIdentifier |

type PackageId = PackageIdentifier

Type alias so we can use the shorter name PackageId.

# Installed package identifiers

newtype InstalledPackageId

An InstalledPackageId uniquely identifies an instance of an installed package. There can be at most one package with a given `InstalledPackageId` in a package database, or overlay of databases.

Constructors

InstalledPackageId String |

Instances

Eq InstalledPackageId |
Ord InstalledPackageId |
Read InstalledPackageId |
Show InstalledPackageId |
Text InstalledPackageId |

# Package source dependencies

data Dependency

Describes a dependency on a source package (API)

Constructors

Dependency PackageName VersionRange |

Instances

Eq Dependency |
Read Dependency |
Show Dependency |
Text Dependency |

thisPackageVersion :: PackageIdentifier -> Dependency

notThisPackageVersion :: PackageIdentifier -> Dependency

simplifyDependency :: Dependency -> Dependency

Simplify the `VersionRange` expression in a `Dependency`. See `simplifyVersionRange`.

# Package classes

class Package pkg where

Class of things that have a `PackageIdentifier`

Types in this class are all notions of a package. This allows us to have different types for the different phases that packages go though, from simple name/id, package description, configured or installed packages.

Not all kinds of packages can be uniquely identified by a `PackageIdentifier`. In particular, installed packages cannot, there may be many installed instances of the same source package.

Methods

packageId :: pkg -> PackageIdentifier

Instances

Package PackageIdentifier |
Package GenericPackageDescription |
Package PackageDescription |
Package (InstalledPackageInfo_ str) |

packageName :: Package pkg => pkg -> PackageName

packageVersion :: Package pkg => pkg -> Version

class Package pkg => PackageFixedDeps pkg where

Subclass of packages that have specific versioned dependencies.

So for example a not-yet-configured package has dependencies on version ranges, not specific versions. A configured or an already installed package depends on exact versions. Some operations or data structures (like dependency graphs) only make sense on this subclass of package types.

Methods

depends :: pkg -> [PackageIdentifier]