REPRO-ENV(1)

πŸ’… repro-env β€” Dependency lockfiles for reproducible build environments πŸŽ€

okay bestie, so repro-env(1) is a General Commands Manual situation and honestly? she's iconic. let me tell you everything ✨


πŸ¦‹ SYNOPSIS πŸ¦‹

repro-env update
repro-env build -- [COMMAND]

literally that's it. two commands. no cap.


🌸 DESCRIPTION 🌸

so the whole vibe here is two files. one is the dream, one is the receipts. let me explain 🫢

repro-env.toml tracks a description of a desired state β€” like, for example, the latest version of some official container image, with the latest patch level, plus the latest version of some additional packages. it's giving vision board energy πŸ’–

repro-env.lock tracks the resolved variant β€” the specific versions and checksums of the packages needed to set up the described environment (at the patch-level available at the time of writing). this is the one that actually did the thing πŸ”₯

so what's the point of each?

the purpose of repro-env.toml is to make it trivial to re-resolve the specification if new patches become available. it's read by repro-env update. easy. slay.

the purpose of repro-env.lock is to document which compiler versions have been used for the release binary associated with a given release. and ngl this part is serious ⚠️ β€” recording this information is essential for reproducible builds, and it allows future forensic investigation of the build environment. so don't skip it, bestie.

it can be either committed into the source-code repository or attached to a release as an artifact, along with the compiled binary. your call πŸ’…

this file is read by repro-env build. πŸ‘‘


⭐ GLOBAL OPTIONS ⭐

these are the ones that work everywhere, iykyk:

  • -v, --verbose β€” Increase logging output (can be used multiple times). yes queen, stack them, let her talk πŸ—£οΈ
  • *-C *path, --context path β€” Change the current directory to this path before executing the subcommand. like, get into position first πŸŽ€

πŸ’œ UPDATE πŸ’œ

This command resolves the environment described in repro-env.toml with the latest available updates and writes a repro-env.lock. You would use this command similar to how you would use cargo update. fr fr, same energy.

  • --no-pull β€” Do not attempt to pull the container tag from registry before resolving it. like, don't go to the store, just assume 🌈
  • -k, --keep β€” Do not delete the build container, wait for ctrl-c. she stays. you can go poke around in there πŸ’…

πŸ”₯ BUILD πŸ”₯

This command loads a repro-env.lock, sets up the environment it describes in a container, and mounts the current directory to /build inside of the container. then it runs the given COMMAND inside of this container. main character behavior honestly πŸ‘‘

  • *-f *path, --file path β€” The dependency lockfile to use. which receipts are we reading today πŸŽ€
  • -k, --keep β€” Do not delete the build container, wait for ctrl-c. yes, again, she's a keeper ✨
  • *-e *env, --env env β€” Pass environment variables into the build container (FOO=bar or just FOO to lookup the value) πŸ’–

🧚 PACKAGES: ARCH LINUX 🧚

Arch Linux hosts a comprehensive collection of recent compilers at https://archive.archlinux.org. iconic archive, no notes.

You can create a [packages] section in your repro-env.toml with system = "archlinux" to install additional packages with pacman. yup, pacman. the little yellow guy. πŸ“

# repro-env.toml
[container]
image = "docker.io/library/archlinux"

[packages]
system = "archlinux"
dependencies = ["rust-musl", "lua"]

🫢 PACKAGES: DEBIAN 🫢

Debian is a widely accepted choice and hosts an archive of all their packages at https://snapshot.debian.org/. very demure, very mindful.

You can create a [packages] section in your repro-env.toml with system = "debian" to install additional packages with apt-get. classic. reliable. ate. πŸ’œ

# repro-env.toml
[container]
image = "debian:bookworm"

[packages]
system = "debian"
dependencies = ["gcc", "libc6-dev"]

🌈 AUTHORS 🌈

repro-env is developed on github at https://github.com/kpcyrd/repro-env β€” go say hi, star the repo, be nice 🫢


πŸ’€ real talk bestie: the whole point of this tool is that the lockfile documents exactly which compiler versions built a release binary. that's not optional flavor text, that's the entire reproducibility thing. keep that file, commit it or attach it, and future you (and future forensics) will thank you πŸ™ˆ

and that's the page! πŸŽ€ this one landed in the General Commands Manual, dated 2026-08-17 β€” so like, whenever you're reading this, she's timestamped and ready. go build something reproducible, queen. periodt. πŸ’…βœ¨

πŸ“¦ where this page comes from