Skip to content

Extensible snapshots #3249

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 72 commits into from
Jul 13, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
740a15c
Minor doc improvements
snoyberg Jun 26, 2017
6241653
Remove a bunch of unneeded info from BuildPlan
snoyberg Jun 26, 2017
7abbb18
Do not store core package info in build plan
snoyberg Jun 26, 2017
dec7759
Remove a few more unneeded fields
snoyberg Jun 26, 2017
475db27
Move towards SnapshotDef/ResolvedSnapshot
snoyberg Jun 26, 2017
286c8ce
Rename Resolved to Loaded
snoyberg Jun 26, 2017
32e18a5
Remove debugging lines
snoyberg Jun 26, 2017
c213a52
Able to load up SnapshotDef and begin LoadedSnapshot
snoyberg Jun 27, 2017
cc92bd6
Introduce PackageIdentifierRevision
snoyberg Jun 28, 2017
062db98
Move from GitSHA1 to SHA256
snoyberg Jun 28, 2017
6fb4aa6
A working loadResolver
snoyberg Jun 29, 2017
6a2b66d
Stack.Fetch: lookup with revision
snoyberg Jun 30, 2017
030f6c1
Implemented Stack.Snapshot
snoyberg Jun 30, 2017
52b8ac7
Compiles again
snoyberg Jun 30, 2017
87b2b14
Implement checkDepsMet
snoyberg Jun 30, 2017
1b8893b
Simple scripts work
snoyberg Jun 30, 2017
fcdbde1
Implement most of resolvePackageLocation
snoyberg Jun 30, 2017
fb535cc
Load snapshots that include non-index files (does not compile)
snoyberg Jun 30, 2017
a8976ce
Generalize a bit
snoyberg Jul 2, 2017
6047a31
Implement global hints
snoyberg Jul 2, 2017
0798dcb
Move some helpers to the top level
snoyberg Jul 2, 2017
cde461c
Begin moving SourceMap to Snapshot logic
snoyberg Jul 2, 2017
5c9bc50
IT BUILDS A PACKAGE!!!
snoyberg Jul 2, 2017
97c5a74
SinglePackageLocation
snoyberg Jul 2, 2017
63bfd37
Distinguish actual and wanted compiler at the type level
snoyberg Jul 2, 2017
0cc7205
More type safety for PackageLocation vs SinglePackageLocation funcs
snoyberg Jul 2, 2017
f9aaadd
Remove unneeded data type RemotePackageType
snoyberg Jul 3, 2017
0ad348e
MonadUnliftIO
snoyberg Jul 3, 2017
4f46ad9
Clean up LocalPackages
snoyberg Jul 3, 2017
546c360
Fix exception strictness
snoyberg Jul 3, 2017
a3dea33
Better Show instances for exception
snoyberg Jul 4, 2017
25ded52
Split off PackageLocationIndex
snoyberg Jul 4, 2017
f3fe186
unpackPackageIdent
snoyberg Jul 4, 2017
edba223
Clean up Stack.BuildPlan
snoyberg Jul 4, 2017
1f8b609
Implement getToolMap (fixes #595)
snoyberg Jul 4, 2017
f76a61b
Total overhaul of target parsing for extensible snapshots
snoyberg Jul 4, 2017
fddf58e
Fix a logic bug in upgrading packages
snoyberg Jul 4, 2017
4cc4807
Some dead code removal
snoyberg Jul 4, 2017
cb9e844
Clean up warnings and FIXMEs
snoyberg Jul 4, 2017
e7c9402
Test suite passes!
snoyberg Jul 4, 2017
4dce5a2
More warning and FIXME cleanup
snoyberg Jul 4, 2017
4b77dff
Defer an error to ConstructPlan
snoyberg Jul 4, 2017
714e548
Remove out-of-date FIXMEs
snoyberg Jul 4, 2017
6e94b77
A bunch of other FIXME cleanups
snoyberg Jul 4, 2017
6e3449d
Remove no longer relevant test module
snoyberg Jul 5, 2017
a4df29b
Fix a warning
snoyberg Jul 5, 2017
37eb826
Fix warnings and hlint errors
snoyberg Jul 5, 2017
1656964
subdirs should be optional
snoyberg Jul 5, 2017
368fa68
Custom snapshots: add back compiler: support
snoyberg Jul 5, 2017
2dd4e75
stack init: deal with possibly missing fields
snoyberg Jul 5, 2017
8ac537d
splitUnmetDeps for parent packages too
snoyberg Jul 5, 2017
a313a0b
Fix sdist
snoyberg Jul 5, 2017
7b9b0bd
Allow subdirs of filepaths (cuz why not?)
snoyberg Jul 5, 2017
30d3e86
Fix broken PackageIdentifierRevision display
snoyberg Jul 5, 2017
763d774
Better upgrade messages
snoyberg Jul 5, 2017
0781770
Fix integration test by bypassing Hackage revisions :(
snoyberg Jul 5, 2017
1a5ea3d
FIXME in changelog about extensible snapshots
snoyberg Jul 5, 2017
442e552
Include hash in custom snapshot cache file name
snoyberg Jul 5, 2017
9d139e2
Disallow PLFilePath in custom snapshots
snoyberg Jul 5, 2017
8170475
Fix compilation failure
snoyberg Jul 5, 2017
8108c1c
Clean up a warning
snoyberg Jul 5, 2017
08e996d
Fix some Haddock markup
snoyberg Jul 6, 2017
ae1441f
Move custom snapshot name inside the snapshot
snoyberg Jul 6, 2017
daf00fd
Remove lsResolver
snoyberg Jul 6, 2017
d5668d5
Allow overriding compiler in custom snapshot
snoyberg Jul 6, 2017
ffd1284
Merge remote-tracking branch 'origin/master' into extensible-snapshots
snoyberg Jul 9, 2017
bdafe1a
Replace error calls with proper exceptions
snoyberg Jul 9, 2017
a6de932
Resolve a bunch of FIXMEs
snoyberg Jul 9, 2017
e4a51da
Generalize type of runOnce
snoyberg Jul 9, 2017
731c1bb
Update YAML docs
snoyberg Jul 9, 2017
25f5366
Subdirs in HTTP; allow overriding hidden
snoyberg Jul 9, 2017
d7c6cdc
Avoid deleting local files (yeah, that is bad)
snoyberg Jul 12, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ Release notes:

Major changes:

* Complete overhaul of how snapshots are defined, the `packages` and
`extra-deps` fields, and a number of related items. For full
details, please see
[the writeup on these changes](https://www.fpcomplete.com/blog/2017/07/stacks-new-extensible-snapshots). [PR #3249](https://github.com/commercialhaskell/stack/pull/3249),
see the PR description for a number of related issues.

Behavior changes:

* `stack profile` and `stack trace` now add their extra RTS arguments for
Expand Down
122 changes: 40 additions & 82 deletions doc/custom_snapshot.md
Original file line number Diff line number Diff line change
@@ -1,29 +1,59 @@
# Custom Snapshots

Custom snapshots allow you to create your own snapshots, which provide a list of
specific hackage packages to use, along with flags and ghc-options. The
definition of a basic snapshot looks like the following:
Custom snapshots were totally reworked with the extensible snapshots
overhaul in Stack 1.6.0, see
[the writeup](https://www.fpcomplete.com/blog/2017/07/stacks-new-extensible-snapshots)
and
[PR #3249](https://github.com/commercialhaskell/stack/pull/3249)). This
documentation covers the new syntax only.

Custom snapshots allow you to create your own snapshots, which provide
a list of packages to use, along with flags, ghc-options, and a few
other settings. Custom snapshots may extend any other snapshot that
can be specified in a `resolver` field. The packages specified follow
the syntax of `extra-deps` in the `stack.yaml` file, with one
exception: to ensure reproducibility of snapshots, local directories
are not allowed for custom snapshots (as they are expected to change
regularly).

```yaml
resolver: ghc-8.0
resolver: lts-8.21 # Inherits GHC version and package set
compiler: ghc-8.0.1 # Overwrites GHC version in the resolver, optional

name: my-snapshot # User-friendly name

# Additional packages, follows extra-deps syntax
packages:
- unordered-containers-0.2.7.1
- hashable-1.2.4.0
- text-1.2.2.1
- unordered-containers-0.2.7.1
- hashable-1.2.4.0
- text-1.2.2.1

# Override flags, can also override flags in the parent snapshot
flags:
unordered-containers:
debug: true

# Packages from the parent snapshot to ignore
drop-packages:
- wai-extra

# Packages which should be hidden (affects script command's import
# parser
hidden:
wai: true
warp: false

# Set GHC options for specific packages
ghc-options:
warp:
- -O2
```

If you put this in a `snapshot.yaml` file in the same directory as your project,
you can now use the custom snapshot like this:

```yaml
resolver:
name: simple-snapshot # Human readable name for the snapshot
location: simple-snapshot.yaml
resolver: snapshot.yaml
```

This is an example of a custom snapshot stored in the filesystem. They are
Expand All @@ -38,24 +68,6 @@ For efficiency, URLs are treated differently. If I uploaded the snapshot to
`https://domain.org/snapshot-1.yaml`, it is expected to be immutable. If you
change that file, then you lose any reproducibility guarantees.

## Extending snapshots

The example custom snapshot above uses a compiler resolver, and so has few
packages. We can also extend existing snapshots, by using the usual
[resolver setting found in stack configurations](yaml_configuration.md#resolver).
All possible resolver choices are valid, so this means that custom snapshots can
even extend other custom snapshots.

Lets say that we want to use `lts-7.1`, but use a different version of `text`
than the one it comes with, `1.2.2.1`. To downgrade it to `1.2.2.0`, we need a
custom snapshot file with the following:

```yaml
resolver: lts-7.1
packages:
- text-1.2.2.0
```

### Overriding the compiler

The following snapshot specification will be identical to `lts-7.1`, but instead
Expand Down Expand Up @@ -117,57 +129,3 @@ ghc-options:
text:
developer: true
```

## YAML format

In summary, the YAML format of custom snapshots has the following fields which
are directly related to the same fields in the
[build configuration format](yaml_configuration.md):

* `resolver`, which specifies which snapshot to extend. It takes the same values
as the [`resolver` field in stack.yaml](yaml_configuration.md#resolver).

* `compiler`, which specifies or overrides the selection of compiler. If
`resolver` is absent, then a specification of `compiler` is required. Its
semantics are the same as the
[`compiler` field in stack.yaml](yaml_configuration.md#compiler).

Some fields look similar, but behave differently:

* `flags` specifies which cabal flags to use with each package. In order to
specify a flag for a package, it *must* be listed in the `packages` list.

* `ghc-options`, which specifies which cabal flags to use with each package. In
order to specify ghc-options for a package, it *must* be listed in the
`packages` list. The `*` member of the map specifies flags that apply to every
package in the `packages` list.

There are two fields which work differently than in the build configuration
format:

* `packages`, which specifies a list of hackage package versions. Note that
when a package version is overridden, no `flags` or `ghc-options` are taken
from the snapshot that is being extended. If you want the same options as the
snapshot being extended, they must be re-specified.

* `drop-packages`, which specifies a list of packages to drop from the snapshot
being overridden.

## Future enhancements

We plan to enhance extensible snapshots in several ways in the future. See
[issue #1265, about "implicit snapshots"](https://github.com/commercialhaskell/stack/issues/1265).
In summary, in the future:

1) It will be possible to use a specific git repository + commit hash in the
`packages` list, like in regular stack.yaml configuration. Currently, custom
snapshots only work with packages on hackage.

2) `stack.yaml` configurations will implicitly create a snapshot. This means
that the non-local packages will get shared between your projects, so there is
less redundant compilation!

3) `flags` and `ghc-options` for packages which are not listed in `packages` are
silently ignored. See
[#2654](https://github.com/commercialhaskell/stack/issues/2654) for the current
status of this.
Loading