# stack-all A CLI tool for building Haskell projects easily over several Stackage major versions. I use this to do Haskell build CI for projects locally with stack. ## Usage `stack-all` by default runs `stack build` over Stackage Nightly and LTS major versions (the current default range is nightly & major LTS versions back to lts-18) corresponding to latest major ghc minor versions, using appropriate stack `--resolver` options. Note that `stack` only works in a project if a `stack.yaml` file exists. If no `stack.yaml` file is found in a .cabal project, `stack-all` will create one if there is a .cabal or "package.yaml" file. Of course it may still fail to build, but this allows for quick attempts to build a package that does not include a stack.yaml file. Since 0.6, stack-all also works outside projects, like stack itself does. ### Help output `$ stack-all --version` ``` 0.6.3 ``` `$ stack-all --help` ``` Build project over Stackage major versions Usage: stack-all [--version] [-k|--keep-going] [-D|--debug] [--refresh-cache] [-n|--newest MAJOR] [(-o|--oldest MAJOR) | (-a|--all-lts)] [(-c|--create-config) | (-d|--default-resolver MAJOR) | (-u|--update-resolver) | (-s|--make-lts MAJOR) | [MAJORVER... COMMAND...]] https://github.com/juhp/stack-all#readme Available options: -h,--help Show this help text --version Show version -k,--keep-going Keep going even if an LTS fails -D,--debug Verbose stack build output on error --refresh-cache Force refresh of stackage snapshots.json cache -n,--newest MAJOR Newest LTS release to build from -o,--oldest MAJOR Oldest compatible LTS release -a,--all-lts Try to build back to LTS 1 even -c,--create-config Create a project .stack-all file -d,--default-resolver MAJOR Set stack.yaml resolver -u,--update-resolver Update stack.yaml resolver -s,--make-lts MAJOR Create a stack-ltsXX.yaml file ``` ### Overriding stack.yaml `stack-all` can use `stack-ltsXX.yaml` files to override the default `stack.yaml` file for particular Stackage major versions. Note that a `stack-ltsXX.yaml` file will also be used for older LTS major versions until another `stack-ltsYY.yaml` file is found. `stack-nightly.yaml` is also supported, but used only for nightly. For example if you have `stack-lts20.yaml` and `stack-lts18.yaml` files in your project, then `stack.yaml` will be used as normal to build nightly, lts-22 and lts-21, but `stack-lts20.yaml` will be used for building lts-20 and lts-19, and `stack-lts18.yaml` will be used for lts-18, lts-16 (and older). Since `stack-all` overrides the exact resolver with the latest minor snapshot, the exact minor Stackage version specified in the `stack*.yaml` files doesn't actually matter: `stack-all` always uses the latest published minor releases of Stackage major versions. `stack-ltsXX.yaml` files can be easily created using `stack-all --make-lts ltsXX` (or `-s ltsXX` for short). (Other versioned stack.yaml filenames like stack-ghc-8.8.yaml are not currently supported.) ### Specifying LTS versions You can abbreviate `lts-XX` args to `ltsXX` on the commandline. `lts` is also accepted and resolves to the latest major LTS version. You can also use ghc major version aliases: eg `ghc9.6` corresponds to `lts22` or `ghc-9.2` to `lts-20`. There are `--oldest` and `--newest` options to specify the range of lts versions to build over: You can specify the oldest major LTS to build for with eg `stack-all -o lts16`. Otherwise if not configured the default oldest LTS is currently `lts-18`. Similarly you can specify the newest LTS version to build from with eg `stack-all -n lts20`. (The default is to build from nightly.) Alternatively, one can give one or more explicit LTS major versions to build for as arguments: eg `stack-all lts19` if you only wish to build that version. ### Configuring the oldest and/or newest LTS to build You can configure the oldest working LTS major version for your project by running for example `stack-all -c -o lts-19` which generates a `.stack-all` project config file like this: ``` [versions] # lts-18 too old oldest = lts-19 ``` (the comment line can be used to document why the older LTS doesn't work). This specifies that the oldest LTS version to build for is lts-19. The newest LTS to build with stack-all can similarly be configured: `stack-all -c -n lts21` or setting `newest = lts-21`. ### Running other stack commands By default `stack-all` just runs the stack `build` command over Stackage major versions. You can also specify a stack command to run with options on the commandline: eg ``` $ stack-all test --no-rerun-tests ``` will run `stack test` over the LTS versions instead. Any stack command can be used, possibly outside a project, eg: `stack-all list aeson` Happy stack building! ## Install The project is released on Hackage. You can also build from a git clone with `stack install` or `cabal install`. ## Collaboration The project is hosted at https://github.com/juhp/stack-all under a BSD license.