Stack auto-removes dependency from .cabal file following 'stack build'

1k Views Asked by At

I want to work on a new Haskell project using the threepenny-gui package.

The first thing I did was create a stack project via $ stack new threepennydemo. From here, here, I did the following:

  1. I edited the extra-deps section in my stack.yaml file from:
# extra-deps: []

to

extra-deps:
  - threepenny-gui-0.9.0.0
  1. I edited the .cabal file from:
library
  exposed-modules:
      Lib
  other-modules:
      Paths_threepennydemo
  hs-source-dirs:
      src
  build-depends:
      base >=4.7 && <5
  default-language: Haskell2010

executable threepennydemo-exe
  main-is: Main.hs
  other-modules:
      Paths_threepennydemo
  hs-source-dirs:
      app
  ghc-options: -threaded -rtsopts -with-rtsopts=-N
  build-depends:
      base >=4.7 && <5
    , threepennydemo
  default-language: Haskell2010

test-suite threepennydemo-test
  type: exitcode-stdio-1.0
  main-is: Spec.hs
  other-modules:
      Paths_threepennydemo
  hs-source-dirs:
      test
  ghc-options: -threaded -rtsopts -with-rtsopts=-N
  build-depends:
      base >=4.7 && <5
    , threepennydemo
  default-language: Haskell2010

to

library
  exposed-modules:
      Lib
  other-modules:
      Paths_threepennydemo
  hs-source-dirs:
      src
  build-depends:
      base >=4.7 && <5
    , threepenny-gui >= 0.9
  default-language: Haskell2010

executable threepennydemo-exe
  main-is: Main.hs
  other-modules:
      Paths_threepennydemo
  hs-source-dirs:
      app
  ghc-options: -threaded -rtsopts -with-rtsopts=-N
  build-depends:
      base >=4.7 && <5
    , threepennydemo
    , threepenny-gui >= 0.9
  default-language: Haskell2010

test-suite threepennydemo-test
  type: exitcode-stdio-1.0
  main-is: Spec.hs
  other-modules:
      Paths_threepennydemo
  hs-source-dirs:
      test
  ghc-options: -threaded -rtsopts -with-rtsopts=-N
  build-depends:
      base >=4.7 && <5
    , threepennydemo
    , threepenny-gui >= 0.9
  default-language: Haskell2010

  1. I edited the stock /app/Main.hs from:
module Main where

import Lib

main :: IO ()
main = someFunc

to

import Graphics.UI.Threepenny
main :: IO ()
main = do
 startGUI defaultConfig showMessage
showMessage :: Window -> UI ()
showMessage window = do
 getBody window #+ [string "Hello, world!"]
 return ()
  1. I enter the command $ stack build.

From here, I notice two things. The first is that I receive the following error:

Building all executables for `threepennydemo' once. After a successful build of all of them, only specified executables will be rebuilt.
threepennydemo> configure (lib + exe)
Configuring threepennydemo-0.1.0.0...
threepennydemo> build (lib + exe)
Preprocessing library for threepennydemo-0.1.0.0..
Building library for threepennydemo-0.1.0.0..
Preprocessing executable 'threepennydemo-exe' for threepennydemo-0.1.0.0..
Building executable 'threepennydemo-exe' for threepennydemo-0.1.0.0..
[1 of 2] Compiling Main

/Users/my_username/threepennydemo/app/Main.hs:1:1: error:
    Could not load module ‘Graphics.UI.Threepenny’
    It is a member of the hidden package ‘threepenny-gui-0.9.0.0’.
    Perhaps you need to add ‘threepenny-gui’ to the build-depends in your .cabal file.
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
1 | import Graphics.UI.Threepenny
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


--  While building package threepennydemo-0.1.0.0 using:
      /Users/my_username/.stack/setup-exe-cache/x86_64-osx/Cabal-simple_mPHDZzAJ_3.0.1.0_ghc-8.8.4 --builddir=.stack-work/dist/x86_64-osx/Cabal-3.0.1.0 build lib:threepennydemo exe:threepennydemo-exe --ghc-options " -fdiagnostics-color=always"
    Process exited with code: ExitFailure 1

The second is that my .cabal file, edited as mentioned in 2., has automatically removed the edits I made to the file.

What am I missing in order to be able to use a third party library when setting up a new stack project?

1

There are 1 best solutions below

1
Eoin Dowling On BEST ANSWER

My difficulty as the result of some confusion between stack.yaml and package.yaml. The latter being what generates the threepennydemo.cabal file. Hence, dependencies must also be specified to a package.yaml file. Adding this dependency to the package.yaml allowed $ stack build to complete without issue.