Implementing stack support in Fay
Intro
This year started fenomenally: I became the fay
compiler maintainer.
I have a small side project built with ghc
, yesod
, stack
and fay
. And yesod-fay
. One day after migration to GHC 8 I corrupted .stack-work
and decided to recreate it. After that errors appeared from fay
side.
Could not find module
or even
ghc-pkg: Could not find package
Or something like that.
Investigation
In fay
wiki stated that it is necessary to set up HASKELL_PACKAGE_SANDBOX
variable. The point is that stack
usually takes care of it and rewrite your value with a new one.
stack path
Command above will give you a clue. It happened because there are several package databases.
- Global one which came with your system GHC and located somewhere in
~/.cabal
. - Another one which came with stack snapshot and located as you may understand somewhere in
~/.stack
. - And the local one (also handled by stack somewhere in
~/path/to/your/project/.stack-work
.
Before GHC 8 the main idea of how to avoid cabal-hell was cabal sandbox
. And it was reflected in fay
wiki. When stack
appeared, it takes management of local dependencies and even package database by itself.
Thus, during fay compilation stack
decided to switch from local package to its global. And lookup for dependent package was failed.
Since fay
does not have typechecker, it relies on GHC and uses ghc-paths
. Under the hood there was usage of ghc-pkg
and stack
package db. There was a mess.
I decided to implement checks for ghc-pkg
usage on both sides: fay
and yesod-fay
. Manual compilation should work in stack project. Compilation through the Fay API should work as well.
Conclusion
Finally I was able to fix two packages. And become maintainter of them and move on.
P.S.
With GHC 8.4 and further there is another approach to build packages: cabal new-build
or cabal v2-build
. And it seems that ghc-pkg
should be adopted again.