Rez介绍(使用篇)
Rez介绍(使用篇)
lingyun前言
这篇文章讲下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 | 写入环境变量 |
然后我们要将包存储库放在共享的服务器上,以便于任何一台PC机都可以访问它。
下面是对rezconfig.py
文件的修改:
1 | packages_path = [ |
对比默认的配置,这里在列表后面添加了四个路径,
分别存放DCC软件包,DCC插件包,第三方库,和自定义工具包。
设置完成后执行rez-config packages_path
查看是否配置已经更新。
使用
使用rez-env {package name}
进行环境构建。
它的工作原理是,从包存储库搜索需要的包,
从这些包的定义文件package.py
中解析依赖,
然后生成一个sh文件并构建环境。所以在使用前必须配置好所需的包与定义。
一个基本的包层级结构如下:
1 | {Your Repository Path} |
软件包定义
先来创建一个maya软件包,用package.py文件定义它。/Library/smb_server/dcc/maya/2018/package.py
写入内容:
1 | name = "maya" |
这里定义了包的名称,版本,设置了几个环境变量,并为maya程序声明了一个别名。
回到终端,输入rez-env maya
,这个时候就有了一个最简单的maya环境。
对于DCC软件包大多使用引用的方式,不会真的将程序放在存储仓库中。
(同上述例子一样,只用在对应的包中定义一个package.py文件)
对于插件和一些脚本工具,可以直接放在仓库中。
package定义文件可以是这样:
1 | name = 'mtoa' |
这里用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 | name = 'shotgun api' |
定义好后,在终端中输入命令测试看看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 | name = 'TST' |
这样就可以直接执行rez-env TST
构建这样一个项目的环境需求了。
如果之后因为一些原因,要更换为redshift渲染器,只需要新建一个1.1的版本,修改requires参数即可。
rez-env TST
命令不指定包版本的情况,默认是获取最新版本。
如果要回溯到上一个版本的话:rez-env TST-1
。
在实际生产中,我们通常会先本地测试,再发布测试版本,通过测试后发布一个正式版本。
这些步骤可以参考rez-test
,rez-build
,rez-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 | name = "Arnold" |
验证它试试:
1 | >>> rez-env maya Arnold -- echo '$REZ_ARNOLD_ROOT' |
API
上述的所有操作都可以通过python api来实现。
1 | import subprocess |
可以用python写一个交互UI,让制作人员能更直观的进行操作。
总结
对rez的使用介绍差不多就到这里,自己也是刚接触不久。
这篇文章是自己对rez的一些理解,要真正投入到生产环境中,
最好还是多阅读官方文档。
文章如果对你有帮助,可以关注一下这个公众号: