Rez介绍与使用指南

重新整理写了下

rez是什么

Rez是一个跨平台程序包管理器,它可以给程序配置独立的环境。
与其它程序包环境管理不同的是,所有的程序包的安装都在一个中央统一的位置,
每个独立环境只是引用了这些包。所以它的环境配置是轻量级的,

项目地址: https://github.com/AcademySoftwareFoundation/rez
官方帮助文档: https://rez.readthedocs.io/en/stable/
翻译后的中文文档: https://lingyunfx.com/00%20rez-wiki-cn/


rez最开始是Dr.D Studio于2011年用python写的依赖解算器,于2012年开源。
之后的V2版本几乎重写,变成一个完整的API。
具有跨平台,支持多种shell环境,基于python的包格式定义等特性。

它是针对视效工作室流程开发的工具:

  • 在项目中,配置不同版本的dcc软件,插件以及环境(并且可以灵活动态的进行增减)
  • 快速适应不同类型的部署工作(比如不同方案需要不同的渲染流程)
  • 在出现问题的时候,可以快速回溯到上一个流程环境
  • 能快速测试尚未投入生产的产品
  • Pipeline不受到迁移操作系统等事件的影响
  • 尽量减少开发人员对制作的时间占用

为什么要使用rez

作为TD需要对公司的生产环境进行统一配置和管理,以此确保所有制作人员都能在相同的条件下工作,从而减少因环境差异导致的问题和错误。

通过环境变量来对dcc软件设置是常用手段,比如:

  • 修改maya界面的语言,设置MAYA_UI_LANGUAGE变量
  • 让maya使用render setup,设置MAYA_ENABLE_LEGACY_RENDER_LAYERS变量
  • 让“Paint Effects”使用计算机上的多个处理器,设置MAYA_PAINT_EFFECTS_THREADS变量
  • 指定maya插件位置,设置MAYA_PLUG_IN_PATH变量
  • 等等..

设置好环境变量,这个时候启动maya就成了个“私人定制版”。


如何在启动maya前设置环境变量?

最简单的方式,是使用cmd命令行设置临时变量。
比如要设置maya界面为中文,输入

1
set MAYA_UI_LANGUAGE='zh_CN'

再启动maya

1
"C:\Program Files\Autodesk\Maya2018\bin\maya.exe"

而公司TD为方便制作人员使用,通常会写一个bat脚本,或是python程序来做这件事。

在没有rez之前,一个通用的方法是:
将需要设置的变量写到一个ymal文件中,然后使用python转换数据,最后使用subprocess加载环境。

yaml文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Software: Maya
Version: 2018
Exec: 'C:\Program Files\Autodesk\Maya2018\bin\maya.exe'

Env:
- name: MAYA_UI_LANGUAGE
value: en_US
mode: over

- name: PYTHONPATH
value: 'P:\ple\tools'
mode: pre

- name: MAYA_SCRIPT_PATH
value: 'P:\ple\script'
mode: post

- name: MAYA_MODULE_PATH
value: 'P:\ple\modules'
mode: pre

如果公司的项目配置较为复杂,不同的项目使用不同的渲染器,不同的maya版本对应不同的插件版本,又或是想要同时兼容windows和linux两个系统,那么使用rez可以灵活处理环境的管理问题。

安装rez

在这里下载源码
https://github.com/AcademySoftwareFoundation/rez/releases

下载后解压,进入文件夹进行安装
(安装前需在本地安装python解释器)

1
2
3
4
5
# 切换到rez源码目录
cd E:\local_test\rez-2.112.0

# 执行安装
python ./install.py

看到SUCCESS就代表安装成功了,安装位置默认在当前盘符的opt/rez路径下。

也可指定目录安装:

1
python ./install.py -v {目录路径}

根据提示把执行文件路径加入PATH环境变量中。

接下来,可以根据当前系统环境创建一些基础包,使用rez-bind命令。

注意,如果找不到rez-bind命令,查看是否已经将rez加入到PATH变量中,并重开cmd命令行。
安装最后一个python包时,需要使用管理员权限打开cmd命令行。

1
2
3
4
5
6
7
8
9
10
11
# 创建一个描述当前平台的包
rez-bind platform

# 创建一个描述当前架构的包
rez-bind arch

# 创建一个描述当前操作系统的包
rez-bind os

# 创建一个python软件包(需管理员权限)
rez-bind python

这里创建了4个package,默认放在C:\Users\{用户名}\packages下。

在使用rez-bind python前,我的系统默认为python3.10,所以创建的python包版本也是3.10。

使用rez-env可以根据定义的包,创建一个环境。

1
2
# 创建一个python环境
rez-env python

rez包是使用rez的核心,package.py是这个包的定义文件,它描述了这个包所需要的依赖,以及环境设置。每一个包可以当作一块积木,它们可以任意组合,以达到所需的环境配置。

每个包的目录结构大概是:

1
2
3
4
5
python (包名称)
- 3.10.9 (版本)
- package.py (包的描述文件)
- 2.7.5
- package.py

一个最简单的package.py内容如下:

1
2
3
4
5
6
name = 'python'    # 软件包名称
version = '2.7.5' # 版本

# 配置环境的函数
def commands():
env.PATH.append('{this.root}/bin')

配置

这里主要是配置一个rez package包存储路径,让rez-env解析时,能找到我们的包位置。

关于配置更多了解查看Rez中文文档05 Configuring Rez

方式一 - 修改rezconfig

默认配置文件是rez安装目录下rezconfig.py文件。
为了能统一设置,可以新建一个rezconfig.py文件放在服务器上,然后使用环境变量REZ_CONFIG_FILE更改rez配置文件路径。

比如我们要统一设置rez包的存放位置,可以这样写:

1
2
3
4
5
6
packages_path = [
"~/packages", # locally installed pkgs, not yet deployed
"Z:/packages/plug-ins",
"Z:/packages/third-lib",
"Z:/packages/tools",
]

设置完成后执行rez-config packages_path查看是否配置已经更新。

方式二 - 指定环境变量

简单一些,只设置REZ_PACKAGES_PATH来指定rez包的存放位置。

比如

1
REZ_PACKAGES_PATH=Z:/packages/plug-ins;Z:/packages/third-lib;Z:/packages/tools

定义包

package包是rez的核心和基础,在包中定义好所需的环境变量,rez才能通过包解析来设置正确的软件环境。

新建一个简单的maya包
在本地的C:\Users\{用户名}\packages这个目录结构,新建一个名为maya的rez包。
层级结构如下
packages目录

  • maya
    • 2018
      • package.py

文件内容

1
2
3
4
5
6
7
8
9
10
11
12
name = 'maya'
version = '2018'

def commands():
# 设置一些环境变量
env.MAYA_UI_LANGUAGE = 'en_US'
env.MAYA_ENABLE_LEGACY_RENDER_LAYERS = 0
env.PYTHONPATH.append(r'E:/local_test')
env.MAYA_MODULE_PATH.append(r'P:/maya/modules')

# 起别名
alias('maya', r'"C:/Program Files/Autodesk/Maya2018/bin/maya.exe"')

打开cmd终端,输入

1
2
3
4
5
# 解析并创建maya环境
rez-env maya

# 打开maya
maya

打开maya后可以检查刚刚在package.py里设置的环境变量,是否设置成功。

然后我们可以再创建一个mtoa的包,package文件就是:

1
2
3
4
5
6
name = 'mtoa'
version = '5.3.5'

def commands():
env.solidangle_LICENSE.set('5053@127.0.0.1')
env.MAYA_MODULE_PATH.append('{root}/mod')

如果要在maya启动时,加载这个包,命令行运行

1
rez-env maya mtoa

一个项目可能会用到非常多的插件,和一些代码工具。
为它们创建package后,使用命令行调用可能会变得很长,就像:

1
rez-env maya-2023 mtoa shotgun_api ocio maya_umbrella

遇到这种情况,也可以将它们封装成一个项目包,比如
packages目录

  • TST
    • package.py

文件内容

1
2
3
4
5
6
name='TST'
version='1.0'
requires = ['maya-2023', 'mtoa', 'shotgun_api', 'ocio', 'maya_umbrella']

def commands():
pass

在命令行中只需要rez-env TST

rez包就像积木一样,定义好每一块积木后,想怎么搭建就怎么搭建。

关于包的定义还有非常的多特性,参考07 Package Definition Guide

一些扩展

context

rez支持将目标环境写入一个文件中,比如:
rez-env maya xgen --output test.rxt

然后通过读取文件的方式,构建环境:
rez-env --input test.rxt

bundle

也可以将rxt文件和它所需要的软件包进行打包。
rez-bundle test.rxt mybundle
打包后,软件包和rxt文件被放在了同一个目录:
(这使得bundle是可移动和独立的)

执行rez-env -i mybundle/context.rxt 进行构建环境。

variants

变体是一个非常有用的概念,这里用Arnold插件来举例。
Arnold插件支持Maya和Houdini,且跨平台,在Mac,Linux,Windows系统下都可以使用。
这样的话同一个版本的Arnold,会根据不同的系统平台和不同的软件产生多个分支,我们这样定义一个arnold包:

  • arnold
    • 1.0
      • package.py
      • platform-linux
        • houdini
        • maya
      • platform-osx
        • houdini
        • maya
      • platform-win
        • houdini
        • maya

package.py内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
name = 'arnold'

version = '1.0'


variants = [
['platform-linux', 'maya'],
['platform-linux', 'houdini'],
['platform-osx', 'maya'],
['platform-osx', 'houdini'],
['platform-windows', 'maya'],
['platform-windows', 'houdini']
]


def commands():
env.PATH.append('{root}')

当我们执行命令rez-env maya arnold,rez就能根据当前系统,以及请求的包,解析出正确的路径,并添加到PATH变量中。
打开Maya检查一下:
image.png

上述只是一个示例,正常生产环境中,不建议这样管理arnold插件,最好还是分mtoa,htoa,ktoa三个包,然后分版本进行构建。

API

上述的所有操作都可以使用python api来实现。

1
2
3
4
5
6
7
8
9
import subprocess
from rez.resolved_context import ResolvedContext

r = ResolvedContext(["houdini-12.5+", "houdini-0+<13", "java", "!java-1.8+"])
p = r.execute_shell(command='which hescape', stdout=subprocess.PIPE)
out, err = p.communicate()

print out
>>> '/software/ext/houdini/12.5.562/bin/hescape'

可以用python写一个交互UI,让制作人员能更直观的进行操作。