So, in Spack, you write a package.py file (like say the one for gromacs: https://github.com/spack/spack/blob/develop/var/spack/repos/...), and you can build that package with any of the versions/options/dependencies/etc. expressed in the package.
With Easybuild, someone (maybe you?) has to write a specific configuration (easyconfig) for every build you want to do. Want to tweak a version? Write a new easyconfig. The dependencies point at specific versions, too, so now write configs for all the dependencies, and so on. There is a lot of copying/tweaking of file trees in the EB workflow.
Aside from that:
- Spack has a package database and allows you to query what is installed.
- EB does not have "uninstall", just `rm -rf`
- Spack builds from source and also handles binary packages (no binaries in EB)
- Spack supports environments via `spack.yaml` / `spack.lock`; EB doesn't have that.
- Spack doesn't require Lmod to work -- you can just `spack load` or `spack env activate` to use packages.
- Spack builds with RPATH by default (much like Nix does) -- dependency libraries are found automatically even if you run an executable straight from its directory.
There's more but Spack is a package manager, while EB is really set up to automate a certain type of installation common in HPC.