Updated 2020-02-05
Getting Rez'd
This page is dedicated to learning Rez by example, utilising more of Rez's functionality as we go.
Basics
Let's start with the basics.
Shortest Possible Example
Create and use a new package from scratch in under 40 seconds.
mkdir mypackage # Name of your Git project cd mypackage # Rez definition @" name = "mypackage" # Rez package name version = "1.0" # Rez package version build_command = False # Called when building package "@ | Add-Content package.py rez build --install # Build package rez env mypackage # Use package > # A new environment with your package
mkdir mypackage # Name of your Git project cd mypackage # Rez definition echo name = "mypackage" >> package.py # Rez package name echo version = "1.0" >> package.py # Rez package version echo build_command = False >> package.py # Called when building package rez build --install # Build package rez env mypackage # Use package > # A new environment with your package
- The
>
symbol means you are in a Rez "context". - Type
exit
to exit the context.
Environment Variables
Most packages will modify their environment in some way.
package.py
name = "mypackage" version = "1.1" build_command = False def commands(): global env # Global variable available to `commands()` env["MYVARIABLE"] = "Yes"
This package will assign "Yes"
to MYVARIABLE.
env
A global Python variable representing the environmentenv["MYVARIABLE"]
- An environment variableenv.MYVARIABLE
- This is also OK
rez build --install rez env mypackage > $env:MYVARIABLE # Yes
rez build --install rez env mypackage > echo $MYVARIABLE # Yes
Environment Paths
A package can also modify paths, like PATH
and PYTHONPATH
, without removing what was there before.
package.py
name = "mypackage" version = "1.2" build_command = False def commands(): global env env["PYTHONPATH"].prepend("{root}") env["PYTHONPATH"].prepend("{root}/python")
This package will assign "{root}"
to PYTHONPATH
.
{root}
expands to the absolute path to the installed packageenv["PYTHONPATH"].prepend()
- Prepend a value to this variableenv["PYTHONPATH"].append()
- Append a value to this variable
rez build --install rez env mypackage > $env:PYTHONPATH # \\server\packages\mypackage\1.2;\\server\packages\int\mypackage\1.2\python
rez build --install rez env mypackage > echo $PYTHONPATH # \server\packages\mypackage\1.2:\server\packages\int\mypackage\1.2\python
Requirements
Most packages will depend on another package.
cd mypackage cd .. mkdir mypackage2 $null >> mypackage2/package.py
cd mypackage cd .. mkdir mypackage2 touch mypackage2/package.py
mypackage2/package.py
name = "mypackage2" version = "1.0" build_command = False requires = ["python-3", "mypackage-1.2"]
This package now requires python-3
and mypackage-1.2
.
rez build --install rez env mypackage2 # resolved by manima@toy, on Thu Jun 27 11:12:18 2019, using Rez v2.32.1 # # requested packages: # mypackage2 # ~platform==windows (implicit) # ~arch==AMD64 (implicit) # ~os==windows-10.0.18362.SP0 (implicit) # # resolved packages: # arch-AMD64 C:\Users\manima\packages\arch\AMD64 (local) # mypackage-1.3 C:\Users\manima\packages\mypackage\1.3 (local) # mypackage2-1.0 C:\Users\manima\packages\mypackage2\1.0 (local) # platform-windows C:\Users\manima\packages\platform\windows (local) # python-3.7.3 C:\Users\manima\packages\python\3.7.3\platform-windows\arch-AMD64 (local) >
Payload
Most packages will have additional files, such as Python modules. This is where build_command
comes in.
cd mypackage $null >> install.py # Additional script for build mkdir python # Payload directory cd python # "print('Hello World!')" | Add-Content mymodule.py # Python payload shipped alongside package
cd mypackage touch install.py # Additional script for build mkdir python # Payload directory cd python # echo print("Hello World!") >> mymodule.py # Python payload shipped alongside package
package.py
name = "mypackage" version = "1.3" build_command = "python {root}/install.py" # Run this command on `rez build` requires = ["python-3"] def commands(): global env env["PYTHONPATH"].prepend("{root}/python") # Add payload to environment
install.py
# This script is called on `rez build` import os import shutil print("Running install.py...") root = os.path.dirname(__file__) build_dir = os.environ["REZ_BUILD_PATH"] install_dir = os.environ["REZ_BUILD_INSTALL_PATH"] print("Copying payload to %s.." % build_dir) shutil.copytree( os.path.join(root, "python"), os.path.join(build_dir, "python"), ignore=shutil.ignore_patterns("*.pyc", "__pycache__") ) if int(os.getenv("REZ_BUILD_INSTALL")): # This part is called with `rez build --install` print("Installing payload to %s..." % install_dir) shutil.copytree( os.path.join(build_dir, "python"), os.path.join(install_dir, "python"), )
Now let's build it.
rez build --install
rez env mypackage
> python -m mymodule
# Hello World!