Guix shell: guix.scm vs manifest.scm and reproducible builds

In his video, guix shell: Overview, Andrew talks about guix.scm and manifest.scm files…

What’s the difference between these files? When would I use one over the other? They kinda seem like they do a similar thing…

Andrew says:

  • guix shell will try to automatically load guix.scm first and manifest.scm second
  • guix.scm should contain a definition which returns a package
  • manifest.scm contains a manifest with a few packages

The 7.1 Getting Started section of the cookbook mainly focuses guix.scm. However a manifest.scm is briefly mentioned in 7.6 Bonus: Build manifest. (Although, I’m not sure if this manifest is the same manifest Andrew talks about.)

Ultimately, my objective is to create a reproducible development environment. I’m testing/playing with a very simple “Hello, World” Go app. I want to share an environment that has Go and GNU Make installed. I would also like to pin the versions of these tools. (I think I need Inferiors for this?)

For reproducible environments, Andrew also mentions using guix time-machine in his video. However 3 years later, now in 2025, is this still the way to get reproducible environments? Or would this section be replaced with Inferiors? (Futurile also mentions time-machine approach here.)

Should I create a guix.scm or manifest.scm in my project root?

1 Like