'Haskell Stack install package dependency from github

Is it possible to install a version of a package from github using Haskell stack?

e.g. in a .cabal or a stack.yaml file, how can I point a dependency at a git repo/branch/revision?



Solution 1:[1]

For stack <1.11:

The documentation for the stack.yaml packages section gives examples of referring to more complex package locations.

packages:
- location: .
- location: dir1/dir2
- location: https://example.com/foo/bar/baz-0.0.2.tar.gz
- location: http://github.com/yesodweb/wai/archive/2f8a8e1b771829f4a8a77c0111352ce45a14c30f.zip
- location:
    git: [email protected]:commercialhaskell/stack.git
    commit: 6a86ee32e5b869a877151f74064572225e1a0398
- location:
    hg: https://example.com/hg/repo
    commit: da39a3ee5e6b4b0d3255bfef95601890afd80709

Then add extra-dep: true to the package entry just to tell stack not to treat the code it pulls in as something you're developing on (e.g., don't load it in GHCi).

Solution 2:[2]

New syntax for Stack >1.7.1

As @Flip commented, the docs at docs.haskellstack.org clarify the new syntax for your stack.yaml is: (note the full commit hash needs to be used)

extra-deps:
- github: apolishch/prime_table
  commit: a510622a824af999a809191e8c959b8ea5fa8bdb
- github: apolishch/reactive-banana
  commit: 74bac0f86ed172f95bb6f6a31041992fc161cf79
  subdirs: reactive-banana

To be clear: dependencies in your stack.yaml make sure that the packages (which are not in Stackage) are available would some .cabal file in your project want them, just in case.

You still have to specify the name of the package in build-depends in your .cabal file to say you actually depend on the package.

Note it doesn't matter what branch the commit is on, and repos can be forks. When a package is in a subdirectory, you can specify it, otherwise it will default to top-level.

Syntax for Stack >1.6.0

extra-deps:
- github: [email protected]:apolishch/prime_table.git
  commit: a510622a824af999a809191e8c959b8ea5fa8bdb

[Edit] I have found that sometimes the syntax from 1.7.1 fails with error message

C:\Users\username\AppData\Local\Programs\stack\x86_64-windows\ghc-8.4.3\lib/../mingw/bin\ar.exe: .stack-work\dist\7d103d30\build\objs-10648\libHSpackagename-0.1.0.0-DlGXqyeqb9MDn2z8KhgjVb.a: No such file or directory

and I solved that by using the 1.6.0 syntax, even though I was using Stack 1.7.1. When using Travis, that will fail because Travis can't clone via SSH without your SSH keys of course. But you can still use the https link as

extra-deps:
- github: https://github.com/apolishch/prime_table.git
  commit: a510622a824af999a809191e8c959b8ea5fa8bdb

Solution 3:[3]

In my case i wanted to depend on a fork of pandoc, specifying a precise commit. It worked by adding the following to stack.yml:

extra-deps: - archive: https://github.com/italia/pandoc/archive/1327c564cccf5dfa387a2956443990d9854c85cd.zip

This would work with any branch-like URL on Git. I found my url by browsing the files at the commit and copying the URL from the "Download ZIP" button.

Note that my branch has a specific version, higher than any version Stack could fetch from the resolver. I pinpoint the version in the Cabal dependencies. If the version on that branch would overlap with one available in the resolver's index, i'm not sure about which one would be picked

Solution 4:[4]

Looks like this has changed. Now one has to do:

packages:
- '.'

extra-deps: 
  - git: https://github.com/haskell/network.git
    commit: 63fb8601003cad1ade959ffcf7be9689fe866421

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Chris Stryczynski
Solution 2
Solution 3 danza
Solution 4 Stéphane Laurent