<div dir="ltr"><div>IMO, there are two different cases you need to care about:</div><div><br></div><div>1. If you're writing an application, keeping broad support for lots of compiler and library versions isn't vital. You can dictate exactly which versions of dependencies your application is compiled with. I use this for web applications I write and command line tools (including Stack), for example. In this case: pick an LTS snapshot, add extra-deps on demand if absolutely necessary, and then when you see a strong need (like upstream bug fixes), update your stack.yaml to a newer snapshot to get new GHC and library versions.</div><div>2. If you're writing a library that you expect others to be using, keep as broad a support base as possible. This is encouraged by things like the complex Travis config in the Stack docs[1], which build with many different LTS snapshots, as well as using many versions of GHC and cabal-install (to cover the dep solver case). This allows consumers of your library to more easily mix and match which versions of dependencies they want to put together.</div><div><br></div><div>When there is an upstream breaking change, it's tempting to just drop support for the old version, add a lower bound in your cabal file to say "I no longer support the old version," and move on. But IMO a nicer solution for your users is to introduce conditional compilation, e.g.:</div><div><br></div><div>#if MIN_VERSION_transformers(0, 5, 0)</div><div>-- use transformers 0.5 or later</div><div>#else</div><div>-- use transformers 0.4 or earlier</div><div>#endif</div><div><br></div><div>This definitely adds extra burden to you as a writer, but it helps others significantly. This is also strong motivation to try to avoid breaking backwards compatibility in your APIs, as every such breakage can cause a cascade of downstream pain[2].</div><div><br></div><div>I hope that answers your questions, let me know if you want me to clarify any points here.<br></div><div><br></div><div>[1] <a href="https://github.com/commercialhaskell/stack/blob/master/doc/travis-complex.yml">https://github.com/commercialhaskell/stack/blob/master/doc/travis-complex.yml</a><br></div><div>[2] In case anyone's wondering: this has nothing to do with bounds in your cabal file, I'm talking about actual code breakage<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Dec 12, 2017 at 5:25 PM, Baa <span dir="ltr"><<a href="mailto:aquagnu@gmail.com" target="_blank">aquagnu@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">@Michael, so my newbie's questions:<br>
<br>
- how Haskellers proceed in this case? Rewrites Template Haskells code<br>
  after every switch to new versions? Or it's not common practice to<br>
  switch projects from one GHC version to another? What about LTS? Do<br>
  you switch to new one often? Is there a practice to keep project on<br>
  one LTS/GHC versions and never to update them (I mean common, good<br>
  known, convenient practice in Haskell)? For example, no problem to<br>
  use out-of-date libraries in C/C++, in embedded development, etc, but<br>
  what about Haskell?<br>
<br>
IMHO it's better to update due to bug fixing, new features, but it's<br>
interesting common practice in Haskell projects.<br>
<br>
===<br>
Best regards, Paul<br>
<div class="HOEnZb"><div class="h5"><br>
> That's right, the template-haskell API frequently changes between<br>
> major releases of GHC.<br>
><br>
> On Tue, Dec 12, 2017, 4:35 PM Baa <<a href="mailto:aquagnu@gmail.com">aquagnu@gmail.com</a>> wrote:<br>
><br>
> > @Michael Snoyman:<br>
> ><br>
> > I returned back all .cabal-files and added compiler: ghc-8.2.2,<br>
> > `stack build`<br>
> > printed out this:<br>
> ><br>
> > ---cut---<br>
> >   Error: While constructing the build plan, the following<br>
> > exceptions were encountered:<br>
> ><br>
> >   In the dependencies for Cabal-1.24.2.0:<br>
> >       process-1.6.1.0 from stack configuration does not match<br>
> > >=1.1.0.1 && <1.5 (latest matching version is 1.4.3.0)<br>
> >   needed due to my-common-utils-0.2.0.0 -> Cabal-1.24.2.0<br>
> ><br>
> >   In the dependencies for versions-3.1.1:<br>
> >       base-4.10.1.0 from stack configuration does not match >=4.8<br>
> > && <4.10 (latest matching version is 4.9.1.0)<br>
> >   needed due to my-common-utils-0.2.0.0 -> versions-3.1.1<br>
> ><br>
> >   Some potential ways to resolve this:<br>
> ><br>
> >     * Recommended action: try adding the following to your<br>
> > extra-deps in /home/pavel/prj/automation/<wbr>revcompl-mon/stack.yaml:<br>
> ><br>
> >   - base-4.9.1.0<br>
> >   - process-1.4.3.0<br>
> ><br>
> >     * Set 'allow-newer: true' to ignore all version constraints and<br>
> > build anyway.<br>
> ><br>
> >     * You may also want to try using the 'stack solver' command.<br>
> ><br>
> >   Plan construction failed.<br>
> > ---cut---<br>
> ><br>
> > After adding "allow-newer: true" build process starts, all looked<br>
> > fine until:<br>
> ><br>
> >    .../SimpleTagging.hs:281:51: error:<br>
> >         • Couldn't match type ‘Type’ with ‘DerivClause’<br>
> >           Expected type: [DerivClause]<br>
> >             Actual type: [Type]<br>
> >         • In the sixth argument of ‘DataD’, namely ‘derivs'’<br>
> >           In the expression: DataD [] ty' tyVars Nothing newCs<br>
> > derivs' In the first argument of ‘(++)’, namely<br>
> >             ‘[DataD [] ty' tyVars Nothing newCs derivs']’<br>
> >         |<br>
> >     281 |       return $ [DataD [] ty' tyVars Nothing newCs<br>
> > derivs'] ++ showInst<br>
> >         |                                                   ^^^^^^^<br>
> ><br>
> > which IMHO means that TemplateHaskell ("API") was changed from<br>
> > 8.0.2 to 8.2.2 because the same code is compiling with old GHC<br>
> > 8.0.2.<br>
> ><br>
> ><br>
> > > Hi Paul,<br>
> > ><br>
> > > A Stackage snapshot specifies both a GHC version and a set of<br>
> > > packages. Stackage snapshots are built and tested to ensure that<br>
> > > the packages are compatible. While you could tell Stack to use a<br>
> > > different GHC version with a snapshot[1], this is unlikely to<br>
> > > work, since GHC major releases usually break some packages.<br>
> > ><br>
> > > I think everyone who's trying to help you (both with Cabal and<br>
> > > Stack workflows) would be able to do so better if you explain<br>
> > > which package you're trying to use which is no longer available<br>
> > > in Stackage Nightly. In some cases, you can simply add it as an<br>
> > > extra dependencies for Stack (e.g., `extra-deps:<br>
> > > [acme-missiles-0.3]`), while in others there is some inherent<br>
> > > incompatibility.<br>
> > ><br>
> > > Right now, you'll just be getting guesses about how to<br>
> > > theoretically get some unknown package to build with a bunch of<br>
> > > others.<br>
> > ><br>
> > > Michael<br>
> > ><br>
> > > [1] Using a setting like `compiler: ghc-8.2.2`<br>
> > ><br>
> > > On Tue, Dec 12, 2017 at 3:43 PM, Baa <<a href="mailto:aquagnu@gmail.com">aquagnu@gmail.com</a>> wrote:<br>
> > ><br>
> > > > @David: I tried to switch to nightly but in project's .yaml<br>
> > > > file and got error about missing of some library (as I<br>
> > > > understand, it is missing in last nightly). So, if I try to do<br>
> > > > it through .yaml file then how to use new GHC (8.2.2) but with<br>
> > > > LTS for 8.0.2? Is it possible? I need last stable LTS where all<br>
> > > > libraries (using in the projects) exist, but with new GHC 8.2.2<br>
> > > > which is too new for stable LTS. As I read somewhere, GHC<br>
> > > > version and Stackage version are linked together hardly in<br>
> > > > stack tool, or?<br>
> > > > > You can see how to configure stack here:<br>
> > > > > <a href="https://github.com/commercialhaskell/stack/blob/release/doc/yaml_" rel="noreferrer" target="_blank">https://github.com/<wbr>commercialhaskell/stack/blob/<wbr>release/doc/yaml_</a><br>
> > > > <a href="http://configuration.md" rel="noreferrer" target="_blank">configuration.md</a><br>
> > > > ><br>
> > > > > The short of it is that to have stack ghci choose a particular<br>
> > > > > version of ghc, you probably need to modify<br>
> > > > > ~/.stack/global/stack.yaml, change resolver to something here<br>
> > > > > <a href="https://www.stackage.org/snapshots" rel="noreferrer" target="_blank">https://www.stackage.org/<wbr>snapshots</a> that has your version of<br>
> > > > > ghc and dependencies similar to what your project wants.  For<br>
> > > > > example 'nightly-2017-12-10'.<br>
> > > > ><br>
> > > > > On Tue, Dec 12, 2017 at 7:53 AM, Baa <<a href="mailto:aquagnu@gmail.com">aquagnu@gmail.com</a>><br>
> > > > > wrote:<br>
> > > > > > @Francesco: unfortunately nightly misses some package. So, I<br>
> > > > > > tried:<br>
> > > > > ><br>
> > > > > >   $ stack --resolver=ghc-8.2.2 setup --reinstall<br>
> > > > > >   Preparing to install GHC (tinfo6) to an isolated location.<br>
> > > > > > This will not interfere with any system-level installation.<br>
> > > > > > Already downloaded. Installed GHC.<br>
> > > > > ><br>
> > > > > >   stack will use a sandboxed GHC it installed<br>
> > > > > >   For more information on paths, see 'stack path' and 'stack<br>
> > > > > > exec env' To use this GHC and packages outside of a project,<br>
> > > > > > consider using: stack ghc, stack ghci, stack runghc, or<br>
> > > > > > stack exec<br>
> > > > > ><br>
> > > > > > So seems that 8.2.2 was installed, right? But how to build<br>
> > > > > > the project with new GHC now? I never used cabal before,<br>
> > > > > > `stack ghci` still runs 8.0.2 instead of 8.2.2. Installed<br>
> > > > > > GHC 8.2.2 does not correspond to .yaml file LTS - maybe<br>
> > > > > > this is a reason why old 8.0.2 is stil used...<br>
> > > > > ><br>
> > > > > > When I try cabal build/new-build/repl I get:<br>
> > > > > ><br>
> > > > > >   cabal: The program 'ghc' version >=6.4 is required but it<br>
> > > > > > could not be found.<br>
> > > > > ><br>
> > > > > > So, cabal does not know about installed GHC versions (at<br>
> > > > > > least 8.0.2, used by stack). I tried --require-sandbox but<br>
> > > > > > without success.<br>
> > > > > ><br>
> > > > > ><br>
> > > > > > > On Tue, Dec 12, 2017 at 01:56:03PM +0200, Baa wrote:<br>
> > > > > > > > Would somebody explain me what is wrong here and how I<br>
> > > > > > > > can test a project with new 8.2.2 GHC?<br>
> > > > > > ><br>
> > > > > > > Hello Paul, I don't think stack lts has 8.2.2 just yet.<br>
> > > > > > > Use a nightly or download/install ghc from here and<br>
> > > > > > > compile your project with the new `cabal new-build`.<br>
> > > > > > ><br>
> > > > > > > [1]<br>
> > > > > > > <a href="https://www.haskell.org/ghc/download_ghc_8_2_2.html#binaries" rel="noreferrer" target="_blank">https://www.haskell.org/ghc/<wbr>download_ghc_8_2_2.html#<wbr>binaries</a><br>
> > > > > > ><br>
> > > > > > ><br>
> > > > > > > ______________________________<wbr>_________________<br>
> > > > > > > Beginners mailing list<br>
> > > > > > > <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
> > > > > > > <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
> > > > > ><br>
> > > > > > ______________________________<wbr>_________________<br>
> > > > > > Beginners mailing list<br>
> > > > > > <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
> > > > > > <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
> > > > > ><br>
> > > ><br>
> > > > ______________________________<wbr>_________________<br>
> > > > Beginners mailing list<br>
> > > > <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
> > > > <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
> > > ><br>
> ><br>
> > ______________________________<wbr>_________________<br>
> > Beginners mailing list<br>
> > <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
> > <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
> ><br>
<br>
______________________________<wbr>_________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
</div></div></blockquote></div><br></div>