Upgrading Coinbase-Pro to ghc 8.8.3 From 8.6.5

Upgrading to a newer version of GHC is relatively painless when using stack to maintain the Haskell toolchain for a Haskell package. The workflow looks generally like this:

1) Change the resolver 2) Bump dependency version numbers 3) Make code modifications to account for breaking API changes (if any)

I'm going to demonstrate by upgrading the coinbase-pro package that I maintain.

Changing the resolver

First step is to change the resolver parameter in the project's stack.yaml. The latest lts for GHC 8.8.3 is lts-16.7, so that's what the new resolver should be:

stack.yaml:

resolver: lts-16.7

ghc-options:
  "$locals": -Wall

packages:
- .

extra-deps:
  - unagi-streams-0.2.6
  - unagi-chan-0.4.1.3

system-ghc: false

extra-include-dirs: ["/usr/local/opt/openssl/include"]
extra-lib-dirs: ["/usr/local/opt/openssl/lib"]

Now I can just stack build and have stack tell me what package dependencies I need to change. Here is the stack output I get after changing the resolver:

Error: While constructing the build plan, the following exceptions were encountered:

In the dependencies for coinbase-pro-0.8.0.0:
    network-3.1.1.1 from stack configuration does not match >=2.6 && <2.9  (latest matching version is 2.8.0.1)
    time-1.9.3 from stack configuration does not match ==1.8.*  (latest matching version is 1.8.0.4)
needed since coinbase-pro is a build target.

Some different approaches to resolving this:

  * Set 'allow-newer: true' in /home/mdunn/.stack/config.yaml to ignore all version constraints and build anyway.

  * Recommended action: try adding the following to your extra-deps in /home/mdunn/Code/coinbase-pro/stack.yaml:

- network-2.8.0.1@sha256:0f165dffa752d8cde30c2bde86f80609c4f1dc5eeb3182d593041f97839c5b3b,3011
- time-1.8.0.4@sha256:3f6eddf238b828eb4f82683acce1c3afe64784f0d20114239b738c123316c85c,5494

So stack is telling me that two packages can't be reconciled given the existing version bounds for the packages. Currently, I have the network and time package bounds set to:

  - network >= 2.6  && < 2.9
  - time >= 1.8  && < 1.9

This is problematic, considering the package versions that come packaged with lts-16.7 for network and time are 3.1.1.1 and 1.9.3 respectively. I'll need to increase the upper bounds of these two packages to allow for newer versions:

  - network >= 2.6  && < 3.2
  - time >= 1.8  && < 2

If you'll notice though, I'm attempting to upgrade the network library to a new major release (2.x vs 3.x), so I'll expect to have to make some code changes (and testing) to be sure that everything still works properly with the new network package. As for time, I can be sure that not much as changed considering it is just a minor version upgrade – but you can never be too careful!

Fix Compilation

Attempting to stack build now results in the following error:

/home/mdunn/Code/coinbase-pro/src/lib/CoinbasePro/Environment.hs:11:43: error:
    Module ‘Network.Socket.Internal’ does not export ‘PortNumber’
   |                          
11 | import           Network.Socket.Internal (PortNumber)
   |                                           ^^^^^^^^^^
                              

Ok, interesting, so it doesn't look like the network library doesn't expose PortNumber via Network.Socket.Internal. The latest docs show that PortNumber is just exposed through Network.Socket. It was probably a mistake to import Network.Socket.Internal in the first place; usually importing from modules with Internal namespace is a red flag!

The new import is as such:

import           Network.Socket (HostName, PortNumber)

Now I can finish my build.

Wrapping Up

After upgrading to the new lts, I'll increment the minor version of the package and push it up to github and make a new release! As you can see, using stack to help guide you through managing dependencies is a fairly straight-forward process.

Here is the changeset that was made in this post.

EDIT:

Here is the newest changeset after I realized that I migrated the code incorrectly the first time.