Library / SDK
AcademySoftwareFoundation/rez avatar
AcademySoftwareFoundation/rez

Rez: A Package Manager That Resolves Environments Without Installing Into Them

An integrated package configuration, build and deployment system for software

1,099 stars371 forksPythonApache-2.0

At a glance

What is it?
Rez is a cross-platform package manager for Python and other software that builds lightweight environments by resolving dependencies against a central repository instead of copying packages into each environment. This review covers its mechanism, setup, limits, and alternatives.
Who is it for?
Adopt Rez if you manage many interdependent software packages across a shared infrastructure, especially in studios or research groups where environments must be created quickly and reproducibly. Skip it if you need a simple per-project virtualenv or you are not prepared to install and maintain a central package repository and write package.py definitions for each tool.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • AcademySoftwareFoundation/rez1,099 ★ · +12
Star history
Repository2026-08-232026-11-14
AcademySoftwareFoundation/rez1.1k1.1k

12 Stars in the last 83 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

The Problem Rez Solves

The audience is not the typical Python developer who wants a quick virtualenv. It is for engineers who administer software for a group, where the same package version must be available to many projects and where environment creation speed matters. The README explicitly says any type of software is supported: compiled, Python, applications, and libraries. That breadth is the core value proposition.

How Rez Resolves Environments Dynamically

The mechanism is a dependency resolver plus a command evaluator. Each package has a package.py file that declares its name, version, dependencies, and commands. The commands section defines how the package configures an environment, for example by appending to PYTHONPATH. When you run rez-env with a set of requests, the resolver tracks requirements and produces a list of resolved packages. Then it concatenates the commands from all resolved packages and evaluates them to set environment variables. This is different from a system like conda that creates a new prefix with symlinks or copies. Rez does not install anything into the environment; it only computes the environment configuration. The README shows a resolved environment listing package paths like /software/ext/python/2.6.8, which are the central repository locations. The resolver can also save resolves to a file, and re-evaluating that file later reconstructs the same environment. That reproducibility is a key feature for production pipelines.

Getting Started: Install and Bind

Installation is not a typical pip install. The README instructs you to download the source and run python3 ./install.py -v DEST_DIR, with DEST_DIR as your install location. It warns that Rez is not a normal Python package and that you should not move the installation after it is done; to change paths, re-install to a new location. It also notes that you need separate installs for different operating systems. After installation, you must create essential Rez packages that describe your system. The rez-bind tool does this for platform, arch, os, and python. For example, you run rez-bind platform, rez-bind arch, rez-bind os, and rez-bind python. The README notes that binding Python may require administrative privileges. Once bound, you can create an environment with rez-env python -- which python, and it will point to the bound Python executable in your packages directory. This workflow is straightforward but requires that you treat Rez as a system-level tool, not a project-level dependency.

The package.py Definition File

The heart of Rez is the package.py file. It is a concise Python file that defines metadata and commands. The README gives an example for the requests library: name = "requests", version = "2.8.1", authors, requires = ["python-2.7+"], and a commands() function that appends {root}/python to PYTHONPATH. The {root} token refers to the package's install location. This design means that package definitions are code, which gives flexibility but also adds a learning curve. You are not just declaring dependencies; you are writing environment configuration logic. That is a trade-off: it allows complex setups like conditionally setting variables based on the platform, but it also means that a bug in a package.py can break an environment. The README does not describe a schema for more advanced features, but the example shows the pattern. For teams that already have a build system, this file becomes another thing to maintain.

Limitations and Failure Modes

One limitation is that Rez is not a drop-in replacement for pip or conda for individual developers. It requires a central repository and a set of bound packages, which is an operational overhead. If you do not have a shared infrastructure, the benefits shrink. Another failure mode is the version range syntax. The README shows requests like "pymongo-0+<2.7" and "!java-1.8+", where the exclamation mark likely denotes an exclusion. If you are not familiar with this syntax, you can easily write a range that resolves to nothing or to an unexpected version. The README does not document the full syntax, so you must consult the docs. Also, because Rez does not install packages into environments, the environment is only as good as the central repository. If a package is missing or its commands are wrong, the environment fails at resolution time, but the error messages may be cryptic for a new user. The README does not mention a rollback mechanism, so a bad package update can affect all environments that reference it.

Comparing Rez to Virtualenv and Conda

The most direct alternative is conda, which also manages dependencies and environments but installs packages into each environment. Conda creates a separate prefix per environment and copies or hardlinks packages there. That means environment creation is slower and uses more disk space, but each environment is self-contained and can be moved or deleted independently. Rez's approach is the opposite: environments are ephemeral configurations that reference a central pool. The README explicitly contrasts this with typical package managers. For a single developer, virtualenv is another alternative, but it only handles Python and does not resolve system-level dependencies. Rez's advantage is for multi-language, multi-version scenarios where you need to combine, say, Python 2.7, a compiled library, and an application like Houdini. Conda can do that too, but it creates heavy environments. Rez's lightweight environments are better suited for high-frequency context switching, such as in a render farm where each job might need a different environment. The trade-off is that Rez requires more upfront infrastructure.

Maintenance and Upgrade Costs

Rez is under active maintenance. The repository shows a default branch of main, recent releases including 3.4.0 in May 2026, and continuous integration workflows for tests, installation, and flake8. The license is Apache-2.0, which is permissive and does not impose copyleft obligations. Upgrading Rez itself is a matter of installing a new release, but you must be careful because package definitions and the resolver behavior may change between major versions. The README does not mention a migration guide, but the release notes likely cover breaking changes. The bigger maintenance cost is the package repository: every new software version you want to use must be added as a package, either by building it with rez-build or by binding an existing system install. That is an ongoing effort. If your team already has a configuration management system, you will need to integrate Rez with it, which adds complexity. The README does not describe any built-in support for remote repositories or caching, so you need to manage the central repository on shared storage.

Editorial conclusion

Adopt Rez if you manage many interdependent software packages across a shared infrastructure, especially in studios or research groups where environments must be created quickly and reproducibly. Skip it if you need a simple per-project virtualenv or you are not prepared to install and maintain a central package repository and write package.py definitions for each tool. Before adopting, verify that your target platforms are supported, that you can run rez-bind for your system Python, and that your package dependencies can be expressed as version ranges that the resolver can handle. Rez is Apache-2.0 licensed and actively maintained with regular releases, so the main cost is the operational overhead of curating a central repository, not the license.

Frequently asked questions

How does Rez differ from pip or conda?

Environments are not populated with installs. All package versions go into a central repository once, and standalone environments reference those existing packages, so configuring one is fast, often a few seconds, even when it contains hundreds of packages. The trade is that an environment is a view onto a repository rather than a self contained directory.

How do I install Rez, and can I use pip?

The documented path is Python 3.8 or newer, download the source, and run `python3 ./install.py -v DEST_DIR`. Rez is described as not a normal Python package, so it is not typically installed with pip or setup.py, and the install must not be moved: re-install to a new location instead, with separate installs per operating system.

What does a Rez package definition file contain?

One file, package.py, holding the name, version, authors, requirements and a commands function. In the requests example the commands function appends `{root}/python` to `env.PYTHONPATH`, so the python subdirectory of the install location is added to the path. The commands of every resolved package are concatenated and evaluated to build the environment.

Why do platform and arch appear as packages in a Rez resolve?

Because they are packages. The rez-bind tool creates Rez packages based on software already installed on the system, and you bind platform, arch, os and python after installing, with administrative privileges possibly needed for python. They then appear in resolves as entries such as platform-linux and arch-x86_64, which is what makes platform specific resolution possible.

Can I save a Rez resolve and reconstruct the same environment later?

Yes. Resolves can be saved to a file, and when they are re-evaluated later they reconstruct the same environment once more. Note that re-evaluating runs the commands functions of the resolved packages again, so the reconstruction depends on those package definitions still behaving as they did.

How current is Rez, and are the readme examples recent?

The releases are 3.4.0 on 2026-05-31, 3.3.0 on 2025-10-17 and 3.2.1 on 2024-10-27, and the default branch was last pushed on 2026-09-29 without being archived. The worked examples in the readme are much older: one session header is dated 2014 and reports Rez v2.0.0, and the sample output resolves Python 2.6 and 2.7 interpreters.

Official sources

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/academysoftwarefoundation-rez.svg)](https://hysenlabs.com/projects/academysoftwarefoundation-rez)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/academysoftwarefoundation-rez.svg)](https://hysenlabs.com/projects/academysoftwarefoundation-rez)

Was this useful?