hkgr: Simple Hackage release workflow for package maintainers

[ gpl, program, util ] [ Propose Tags ]

Hkgr (pronouced Hackager) is a tool to help make new releases of Haskell packages, with commands for git tagging, pristine sdist, and uploading to Hackage.

[Skip to Readme]


Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


Versions [RSS] 0.0, 0.1, 0.2, 0.2.1, 0.2.2, 0.2.3,,,, 0.2.4,, 0.2.5,,, 0.2.6,, 0.2.7, 0.3, 0.4, 0.4.1, 0.4.2, 0.4.3,, (info)
Change log
Dependencies base (<5), directory (>=, filepath, semigroups, simple-cabal, simple-cmd (>=0.2.0), simple-cmd-args [details]
License GPL-3.0-only
Copyright 2019 Jens Petersen
Author Jens Petersen
Category Util
Home page
Bug tracker
Source repo head: git clone
Uploaded by JensPetersen at 2019-07-06T18:40:03Z
Distributions LTSHaskell:, NixOS:, Stackage:
Executables hkgr
Downloads 5751 total (82 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs not available [build log]
Last success reported on 2019-07-06 [all 2 reports]

Readme for hkgr-0.2.2

[back to package description]


Hackage GPL-3 license Build status

hkgr (pronounced "hackager") is a tool for making releases of Haskell packages on Hackage.


$ hkgr
Hackage Release tool

Usage: hkgr [--version] COMMAND
  'Hackager' is a tool for easy Hackage package release workflow

Available options:
  -h,--help                Show this help text
  --version                Show version

Available commands:
  tagdist                  'git tag' version and 'cabal sdist' tarball
  upload                   'cabal upload' candidate tarball to Hackage
  publish                  Publish to Hackage ('cabal upload --publish')
  upload-haddock           Upload candidate documentation to Hackage
  publish-haddock          Publish documentation to Hackage
  version                  Show the package version from .cabal file


You are preparing for a release...

So you commit changes to your package and push them to check CI results:

$ git commit -m "new release"
$ git push


Now you want to make a dist tarball, which is done from a git tag:

$ hkgr tagdist

The tagdist command first reads the current package version (from the .cabal file in the current directory), and uses that to git tag. It then runs cabal sdist from a temporary pristine checkout of the tag to generate the dist tarball.

If the tag already exists (eg if you already ran tagdist earlier), and you need to add commits to the release you can use --force to move the tag to the latest commit and generate a new tarball off that, otherwise tagdist refuses to run again to prevent accidently overwriting the tag and dist tarball.

One should not be able to tagdist on an already published (ie released) version.

(If sdist fails for some reason then hkgr tries to reset the tag.)


If all is good, it's time for a candidate release:

$ hkgr upload

This uploads a candidate dist tarball to Hackage: this can be repeated.

Haddock draft documentation can also be uploaded if desired:

$ hkgr upload-haddock


Once you are happy, you can release to Hackage:

$ hkgr publish

If it succeeds then hkgr creates a "published lockfile" in dist/, and the git tag is pushed to origin.

(Then hkgr will refuse to do further commands on the released version.)

Optionally one can publish haddock docs:

$ hkgr publish-haddock


hkgr uses cabal-install, git, and also hlint if available.