Announcing Yackage: Your personal Hackage server for testing

December 27, 2010

GravatarMichael Snoyman

I was speaking with my coworker Yitz about a project he's working on. Basically, he's going to end up with about 16 cabal packages that are not going to be deployed to Hackage, and wanted us to set up a Hackage server for our company to deploy these kinds of things. However, getting all the pieces of Hackage aligned properly for such a simple use case seemed a bit overkill.

I then realized that I had the exact same problem during Yesod development: before I make a major release, I usually end up with about 10-15 packages that are not yet live on Hackage. It gets to be a real pain when suddenly wai-extra is depending on network 2.3 and authenticate requires network 2.2, and suddenly I need to manually recompile 10 packages.

So I decided to write up a simple web service to act as a local Hackage server. It has no security (anyone with access can upload a package), doesn't build haddocks, doesn't show package descriptions, etc. All it does is:

  • Show a list of uploaded packages/versions
  • Links to the tarballs
  • Allows you to upload new versions, which will automatically overwrite existing packages
  • Provides the 00-index.tar.gz file needed by cabal-install, as well as the tarballs for all the packages

In order to use this, just do the following:

  • cabal install yackage
  • run "yackage"
  • Upload your packages
  • Add remote-repo: yackage:http://localhost:3500/ to your ~/.cabal/config file
  • cabal update
  • Install your packages are usual

You'll need to leave yackage running whenever you want to run an update or download new packages. A few other usage notes:

  • If you overwrite a package, your cache folder will still have the old version. You might want to just wipe our your cache folder on each usage.
  • Running cabal update will download the update for both yackage and the main hackage server; the latter can be a long process depending on your internet connection.

Here's a little shell script that will disable the Hackage repo, wipe our the Yackage cache, update and re-enable the Hackage repo:

#!/bin/sh

CABAL_DIR=~/.cabal

cp $CABAL_DIR/config $CABAL_DIR/config.sav
sed 's/^remote-repo: hackage/--remote-repo: hackage/' < $CABAL_DIR/config.sav > $CABAL_DIR/config
rm -rf $CABAL_DIR/packages/yackage
cabal update
cp $CABAL_DIR/config.sav $CABAL_DIR/config

I hope others find this tool useful.

Comments

comments powered by Disqus

Archives