@AlanSill @easybuild Spack already does this; it was designed with air gaps in mind.

* `spack fetch` will download what you need to install and env or package and cache it in a local mirror: https://spack.readthedocs.io/en/latest/command_index.html#spack-fetch
* you can also create a mirror for multiple packages or for an env: https://spack.readthedocs.io/en/latest/mirrors.html#spack-mirror
* Special instructions for bootstrapping in an airgapped env: https://spack.readthedocs.io/en/latest/bootstrapping.html#creating-a-mirror-for-air-gapped-systems

Command Reference - Spack 1.2.0.dev0 documentation

@spack @AlanSill Likewise for EasyBuild, pretty much.

EasyBuild "caches" source downloads, so it only downloads once.

You can use “eb --fetch" to download sources for a bunch of easyconfigs (incl. dependencies if you also use --robot).

See also https://docs.easybuild.io/partial-installations/#partial_installation_fetch

Partial installations - EasyBuild - building software with ease