Skip to content

sol/tinc

Repository files navigation

tinc: A dependency manager for Haskell

tinc installs dependencies for a project that you work on into a sandbox. While doing so it caches installed packages (in ~/.tinc/cache). When a package with the same transitive dependencies is already in the cache, it reuses that cached package instead of building it again.

tinc uses an exact algorithm for determining reusability. This guarantees 100% cache reuse. A package with the same transitive dependencies is never built twice.

tinc does not take any cached packages into account when resolving dependencies. Running

$ tinc

gives you the exact same result as

$ cabal sandbox delete
$ cabal sandbox init
$ cabal install --only-dependencies --enable-tests

tinc is idempotent. It's safe to run tinc multiple times. Running tinc after changing the .cabal-file of a project or after running cabal update results in a new updated sandbox.

If tinc fails / terminates for some reason, it does not modify anything (neither the cache nor any existing sandboxes). Interrupting a running tinc build is always safe.

Optionally use Nix for package caching

By default, tinc maintains its own package cache under ~/.tinc/cache.

However, it can optionally use nixpkgs for package caching. If tinc is installed somewhere under /nix, this is the default.

To change the default, you can set the environment variable TINC_USE_NIX to either yes or no, specifically:

export TINC_USE_NIX=yes  # use nix, even if not installed under /nix
export TINC_USE_NIX=no   # do not use nix, even if installed under /nix

If you want to install tinc with nix-env you can do so by running

nix-env -i -f default.nix

inside this repository.

Enabling plug-ins

tinc comes with a number of useful plug-ins. To enable them symlink plugins to ~/.tinc/plugins:

mkdir -p ~/.tinc/ && ln -s `pwd`/plugins/ ~/.tinc/

Additional dependencies and dependencies from GitHub

You can specify additional dependencies in a file named tinc.yaml. These dependencies may be from a variety of sources:

dependencies:
  # additional dependency from Hackage
  - foo

  # override version constraint in package.yaml
  - foo == 0.1.0

  # dependency from GitHub
  - name: foo
    github: owner/repo
    ref: master
    subdir: some-dir # optional subdirectory

  # dependency from arbitrary Git repositories
  - name: foo
    git: http://...
    ref: master

  # local dependency (will use cabal sdist)
  - name: foo
    path: ../foo/

(Note: The accepted syntax for dependencies is the same as what is accepted in package.yaml.)

Dependencies from tinc.yaml will be added to your sandbox or can override existing dependencies from package.yaml.

You can also use tinc.yaml without any package.yaml file (or .cabal file) to create a sandbox with dependencies.