Rez configuration and plugins
One-sentence summary: configuration is layered (each source overrides, not replaces, the previous), and everything extensible — shells, build systems, repositories, release hooks — is a plugin discovered either by
rezpluginsdirectory layout or by Python entry points.
Skill scope: configuration and plugins. For resolve behavior see rez-resolve; for the CLI see
rez-cli.
Configuration precedence
Lowest to highest. Later sources win.
rezconfig.pyshipped in the rez installation (defaults + documentation for every setting)- File pointed at by
REZ_CONFIG_FILE— can be a path-like list to read several files $HOME/.rezconfigor$HOME/.rezconfig.pyREZ_<SETTING>_JSONenvironment variable — value must be JSON-encodedREZ_<SETTING>environment variable — e.g.REZ_PACKAGES_PATHoverridespackages_path. Takes precedence over the_JSONform when both are present.- (build/release only) the package's own
configsection viascope("config")
Related: REZ_DISABLE_HOME_CONFIG skips the home config.
Verify what actually took effect:
rez-config # dump all settings
rez-config packages_path # one setting
Merge rules
Sources merge; they do not replace wholesale.
- Dicts are merged recursively.
- Non-dicts override the previous value.
To append/prepend to a list setting instead of replacing it, use ModifyList:
release_hooks = ModifyList(append=["custom_release_notify"])
prepend=[...] is also supported.
File formats
Both YAML (.rezconfig) and Python (.rezconfig.py) are supported. Choose Python when settings
must vary by platform. You only need to list settings that differ from the defaults.
String expansion
Applied to all configuration settings:
- Environment variables:
${HOME} systemobject properties:{system.platform},{system.arch},{system.os}
DelayLoad
Keep a large setting out of the main config and load it only when referenced (YAML or JSON):
default_relocatable_per_package = DelayLoad('/svr/configs/rez_relocs.yaml')
Settings that matter most
| Setting | Default | Purpose |
|---|---|---|
packages_path |
see install | package search path |
local_packages_path |
~/packages |
where rez-build --install lands |
release_packages_path |
~/.rez/packages/int |
where rez-release deploys |
cache_packages_path |
None |
package cache location |
implicit_packages |
~platform=={system.platform}, ~arch=={system.arch}, ~os=={system.os} |
weak system constraints |
variant_select_mode |
version_priority |
variant preference strategy |
plugin_path |
[] |
where to find rezplugins |
package_filter |
None |
hide packages from resolves |
package_definition_python_path |
None |
extra import path for package.py |
resolve_caching |
True |
cache resolves |
cache_package_files / cache_listdir |
True |
filesystem caches |
default_cachable |
False |
whether packages may be cached |
memcached_uri |
[] |
back the caches with memcached |
error_on_missing_variant_requires |
True |
fail on incomplete variant requirements |
pathed_env_vars |
any var ending in PATH |
which vars get path-normalized |
rez_1_environment_variables |
False |
legacy variable naming |
warn_old_commands / error_old_commands |
True / False |
old-style commands detection |
The full, authoritative list with documentation lives in src/rez/rezconfig.py in the rez source.
Plugins
Plugin types and their base classes:
| Type | Base class | Top-level settings |
|---|---|---|
build_process |
rez.build_process.BuildProcess or BuildProcessHelper |
No |
build_system |
rez.build_system.BuildSystem |
No |
command |
rez.command.Command |
Yes |
package_repository |
rez.package_repository.PackageRepository + 3 package_resources classes |
No |
release_hook |
rez.release_hook.ReleaseHook |
Yes |
release_vcs |
rez.release_vcs.ReleaseVCS |
Yes |
shell |
rez.shells.Shell |
No |
Built-ins live in src/rezplugins. New plugins are encouraged out-of-tree.
List what is installed and its load status:
rez -i
Example output — note release vcs / svn / FAILED: No module named 'pysvn', i.e. rez -i is the
quickest way to see a plugin that failed to import.
Configuring plugins
plugins = {
"package_repository": {
"filesystem": {}
}
}
Discovery mechanism 1 — rezplugins directory layout
Point plugin_path (or REZ_PLUGIN_PATH) at the directory above your rezplugins dir:
rezplugins/
├── __init__.py
└── <plugin_type>/
├── __init__.py
└── <plugin name>.py
The
rezpluginsdirectory name is not optional, and your sparse copy must be onREZ_PLUGIN_PATHonly — not onPYTHONPATH. That ordering guarantees rez's own copy ofrezpluginsis found first.
Discovery mechanism 2 — entry points (rez 3.3.0+)
One entry point per plugin type:
rez.plugins.build_processrez.plugins.build_systemrez.plugins.commandrez.plugins.package_repositoryrez.plugins.release_hookrez.plugins.release_vcsrez.plugins.shell
This is the more flexible option: no special file layout, and one package can ship several plugins of different types.
Default settings for a plugin
Ship a rezconfig.py or rezconfig.yml beside the plugin module; rez loads it automatically.
top_level_setting = "value"
plugin_name = {
"setting_1": "value1"
}
plugin_name settings arrive as self.settings; top_level_setting as
self.type_settings.top_level_setting. Only the types marked "Yes" in the table above support
top-level settings.
Overriding built-ins
Install a plugin with the same name and type as a built-in and rez prefers yours. This is the supported way to modify built-in behavior without patching rez source.
Troubleshooting
| Symptom | Check |
|---|---|
| Setting not taking effect | walk the precedence list; REZ_<SETTING> beats the _JSON form and beats files |
| Home config interfering | REZ_DISABLE_HOME_CONFIG, or inspect with rez-config |
| List setting got replaced not extended | use ModifyList(append=[...]) |
| Plugin not found | rez -i; confirm REZ_PLUGIN_PATH points above rezplugins |
| Plugin import error | rez -i shows FAILED: <error> in the status column |
| Packages silently missing from resolves | package_filter, rez-pkg-ignore, packages_path order |
| Resolves look stale | resolve_caching; retest with rez-env --no-cache |
Agent workflow
- Confirm the effective value with
rez-config <setting>before changing anything. - Prefer environment variables for one-off overrides,
REZ_CONFIG_FILEfor site-wide policy. - Use
ModifyListwhenever you mean "add to" rather than "replace". - Check
rez -ibefore debugging a plugin by hand. - Put new plugins in entry-point packages unless you specifically need the directory layout.
