Rez介绍(使用篇)

前言

这篇文章讲下rez的使用,根据最近所得谈谈自己的理解。
开始之前补充一些rez工具的背景和特性。

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

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

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

以上资料来自Open Source Day中关于rez的一期:
https://youtu.be/y5VSPeeqJbM

配置

rez是跨平台的,为了方便这里用macOS进行演示。
(类UNIX系统命令行操作友好一些)

安装的部分就跳过了,开始基本的配置。
默认配置文件的位置是rez安装目录下rezconfig.py文件。
为了能够进行统一设置,这个配置文件最好也是在服务器上,所以首先更改rez配置文件路径。
官方推荐的方式是设置REZ_CONFIG_FILE环境变量指向配置文件路径。

1
2
3
4
5
6
# 写入环境变量
ehco "export REZ_CONFIG_FILE=`/Library/smb_server/rezconfig.py`">>.bash_profile
source .bash_profile

# 验证是否返回了正确的路径
echo $REZ_CONFIG_FILE

然后我们要将包存储库放在共享的服务器上,以便于任何一台PC机都可以访问它。
下面是对rezconfig.py文件的修改:

1
2
3
4
5
6
7
8
9
packages_path = [
"~/packages", # locally installed pkgs, not yet deployed
"~/.rez/packages/int", # internally developed pkgs, deployed
"~/.rez/packages/ext", # external (3rd party) pkgs, such as houdini, boost
"/Library/smb_server/dcc",
"/Library/smb_server/plug-ins",
"/Library/smb_server/third-lib",
"/Library/smb_server/tools",
]

对比默认的配置,这里在列表后面添加了四个路径,
分别存放DCC软件包,DCC插件包,第三方库,和自定义工具包。

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

使用

使用rez-env {package name}进行环境构建。
它的工作原理是,从包存储库搜索需要的包,
从这些包的定义文件package.py中解析依赖,
然后生成一个sh文件并构建环境。所以在使用前必须配置好所需的包与定义

一个基本的包层级结构如下:

1
2
3
4
{Your Repository Path}
- {package Name}
- {Version}
- package.py

软件包定义

先来创建一个maya软件包,用package.py文件定义它。
/Library/smb_server/dcc/maya/2018/package.py

写入内容:

1
2
3
4
5
6
7
8
name = "maya"

version = "2018"

def commands():
env.MAYA_DISABLE_CLIC_IPM = 1
env.MAYA_UI_LANGUAGE = 'en_US'
alias("maya2018", r"/Applications/Autodesk/maya2018/Maya.app/Contents/MacOS/Maya")

这里定义了包的名称,版本,设置了几个环境变量,并为maya程序声明了一个别名。
回到终端,输入rez-env maya,这个时候就有了一个最简单的maya环境。


对于DCC软件包大多使用引用的方式,不会真的将程序放在存储仓库中。
(同上述例子一样,只用在对应的包中定义一个package.py文件)

对于插件和一些脚本工具,可以直接放在仓库中。


package定义文件可以是这样:

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

version = '4.1.0'

requires = [
"~maya-2018+<2021",
"~houdini-18.5.351+"
]

def commands():
env.SOLIDANGLE_LICENSE = "5053@localhost"

if 'maya' in request:
env.MAYA_MODULE_PATH.append("{this.root}/maya/mod")
if 'houdini' in request:
env.PATH.append("{this.root}/houdini/scripts/bin")
env.HOUDINI_PATH.append("{this.root}/houdini")

这里用requires参数限制了dcc软件版本的有效范围,
使用weak reference符号~,为了不对没有请求的包进行搜索。

比如使用rez-env maya-2018 mtoa构建环境时,这里没有对houdini请求,rez则不会去搜索它。
(如果不使用weak reference符,在请求mtoa时,requires列表中的所有包都会被代入环境)
commands的部分为其添加环境变量,{this.root}代表这个包的当前目录。

对于一些python第三方库,可以通过rez-pip直接进行安装(自动生成package.py文件)。
比如需要一个PyQt5,并将它安装到指定的目录的话,可以执行:
rez pip -p /Library/smb_server/third-lib --python-version python-2.7 -i PyQt5

或者直接拷贝第三方模块到路径下,同样用package.py定义这个包。
这里以shotgun_api为例:

1
2
3
4
5
6
7
8
9
10
name = 'shotgun api'

version = '3.0'

requires = [
'python'
]

def commands():
env.PYTHONPATH.append("{root}/python")

定义好后,在终端中输入命令测试看看rez-env shotgun_api maya

包的灵活运用

可以将包理解为一块积木,要怎么组合和运用完全取决于你自己的需要。

举一个例子,比如在一个名为TST的项目中,有这样的要求:

  • Maya2018
  • 插件mGear要求版本大于2.0
  • 最新版本的xgen插件
  • Arnold4.1.0渲染器
  • 一个自己的工具脚本库my_maya_tools
  • Nuke12.1v2
  • Cryptomatte 1.2.8

构建它的环境命令可能会变得很长:

1
rez-env maya-2018 mGear-2+ mtoa-4.1.0 xgen my_maya_tools nuke12.1.2 cryptomatte-1.2.8

如果再加上例如其它houdini,katana等软件需求,每次输入这么长一串命令会很繁琐。
避免这样繁琐的方法很多,这里为了说明包的灵活性,我们将一个项目比作一个包。

新建一个目录为/Library/smb_server/show,添加到package_path配置中。


定义的文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
name = 'TST'

version = '1.0'

requires = [
"maya-2018",
"mGear-2+",
"mtoa-4.1.0",
"xgen",
"my_maya_tools",
"nuke-12.1.2",
"cryptomatte-1.2.8"
]

这样就可以直接执行rez-env TST构建这样一个项目的环境需求了。
如果之后因为一些原因,要更换为redshift渲染器,只需要新建一个1.1的版本,修改requires参数即可。

rez-env TST命令不指定包版本的情况,默认是获取最新版本。
如果要回溯到上一个版本的话:rez-env TST-1

在实际生产中,我们通常会先本地测试,再发布测试版本,通过测试后发布一个正式版本。
这些步骤可以参考rez-testrez-buildrez-release(作者暂时没有太去深究整个流程)

一些扩展

这些扩展就简单说明一下,因篇幅有限(码字码累了),
具体的概念和使用可以参照文档。

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,会根据不同的系统平台和不同的软件产生多个分支(如下图):

当我们请求rez-env maya Arnold的时候,为了能让rez找到符合当前系统平台的分支,
就需要在定义文件中定义variants。

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-win", "maya"],
["platform-win", "houdini"]
]


def commands():
env.PATH.append("{root}/bin")

验证它试试:

1
2
>>> rez-env maya Arnold -- echo '$REZ_ARNOLD_ROOT'
/Library/smb_server/plug-ins/Arnold/v1.0/platform-osx/maya

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,让制作人员能更直观的进行操作。

总结

对rez的使用介绍差不多就到这里,自己也是刚接触不久。
这篇文章是自己对rez的一些理解,要真正投入到生产环境中,
最好还是多阅读官方文档。

文章如果对你有帮助,可以关注一下这个公众号: