什么是RezRez是一个跨平台程序包管理器,它可以给程序配置独立的环境。与其它程序包环境管理不同的是,所有的程序包的安装都在一个中央统一的位置,每个独立环境只是引用了这些包。所以它的环境配置是轻量级的,尽管有几百个包,通常也只需要几秒就可以进行配置。
基本原理Rez获取一个包的请求列表,然后构建目标环境,并解决所有包的依赖问题。支持任何软件包。(包括Python)每个软件包都有一个简洁的定义文件(package.py),这个文件用于定义其依赖项,命令,以及其它meatadata信息。
一个python的软件包定义文件:
123456789101112name = "requests"version = "2.8.1"authors = ["Kenneth Reitz"]requires = [ "python-2.7+"]def commands(): env.PYTHONPATH.append("{root}/python")
上述文件所表达的含 ...
下载Source code,然后打开终端进入rez-2.75.0目录中:python ./install.py
默认会安装到 /opt/rez 中,如果需要安装到其它位置,使用install.py -h查看如何安装。
安装成功提示:
12345SUCCESS! To activate Rez, add the following path to $PATH:/opt/rez/bin/rezYou may also want to source the completion script (for bash):source /opt/rez/completion/complete.sh
然后添加环境变量,将/opt/rez/bin/rez 添加到$PATH。对于linux系统,可以运行这个脚本使命令能自动补全:source /opt/rez/completion/complete.sh
文档中也提到可以用pip进行安装:pip install rez
不过这样的安装方式并不能很好的用在生产环境中,因为rez并不只是一个普通的python包。使用install脚本安装 ...
基本软件包安装完成后,需要创建一些基本的Rez软件包。使用rez-bind工具进行创建,这些软件包会引用系统上已经安装的软件。(—quickstart是以标准创建)
12345678910111213141516171819202122]$ rez-bind --quickstartBinding platform into /home/ajohns/packages...Binding arch into /home/ajohns/packages...Binding os into /home/ajohns/packages...Binding python into /home/ajohns/packages...Binding rez into /home/ajohns/packages...Binding rezgui into /home/ajohns/packages...Binding setuptools into /home/ajohns/packages...Binding pip into /home/ajohns/packages...Successfully ...
概述Rez管理软件包的过程:首先从rez请求一个软件包列表,rez会对包进行解析。如果解析没有成功,则系统会给出相关信息提示。当请求的软件包版本发生冲突的时候,Rez也会给出提示。
“…the latest version of houdini”
“…maya-2009.1”
“…the latest rv and the latest maya and houdini-11.something”
“…rv-3.something or greater”
“…the latest houdini which works with boost-1.37.0”
“…PyQt-2.2 or greater, but less than PyQt-4.5.3”
在本文许多示例中,我们会使用rez-env命令行工具。该工具获取软件包请求列表,并创建结果配置环境。exit命令即可退出环境。
版本Rez对版本号格式的支持:数字,字母,和下划线的任意组合,并用点或破折号分隔。
有效的格式:
1
1.0.0
3.2.build_13
4.rc1
10a-5
版本号遵循严格排序方式,区别大小写 ...
概述Rez具有大量可配置的设置。可以在这里找到设置的默认值和每个设置的释义。最终的设置通过以下方式确定:
首先在Rez安装文件中的rezconfig.py读取设置
如果REZ_CONFIG_FILE环境变量指向另一个文件,则设置被覆盖(变量也可以是一个文件夹路径,从而读取多个配置文件)
如果$HOME/.rezconfig中存在该设置,则进一步覆盖前面的设置
如果存在环境变量REZ_XXX,则该设置再次被覆盖。这里的”XXX”是设置键的大写版本,比如image_viewer将会被REZ_IMAGE_VIEWER覆盖。
一种特殊情况,仅在软件包生成或发布期间才生效。在这种情况下,如果程序包定义文件包含config部分,则会覆盖之前所有设置。
在一个文件中定义rez设置是常见的选择,然后为所有的用户更改环境变量REZ_CONFIG_FILE以指向这个文件。
Notes:无需在文件中设定所有的设置,只用修改所需的即可,其它没有设置的值则会从默认设置中获取。
合并规则当存在多个配置源时,这些设置会合并在一起。(一个配置文件不会替代前一个配置文件,而是通过值覆盖的方式)
遵循下面的 ...
概述程序包定义文件(package.py)通常定义命令的部分。这是一个例子,用于确定如何配置环境和软件包的Python函数:
123def commands(): env.PYTHONPATH.append("{root}/python") env.PATH.append("{root}/bin")
这是一个典型例子,程序包将其路径添加到PYTHONPATH,并将其工具添加到PATH。{root} 字符串代表软件包的安装目录。
配置rez环境后,解析列表中的每个软件包都将其命令部分解释并转换为shell代码。(bash或其它,这取决于系统平台。)shell代码是源代码,用于配置环境。在已配置的环境中,变量REZ_CONTEXT_FILE指向此shell代码文件,
然后命令rez-context-interper会对其进行打印输出。
在commands函数中使用的python API称为rex(rez执行语言)。你可以使用此API执行一些常见操作,包括设置环境变量。
注意:如果需要导 ...
概述软件包的定义来自文件(package.py),位于每个包安装的根目录下。比如包的存储位置为/packages/inhouse,则包”foo-1.0.0”的定义文件路径是:/packages/inhouse/foo/1.0.0/package.py
这里是一个定义文件的例子:
1234567891011121314151617181920212223name = 'sequence'version = '2.1.2'description = 'Sequence detection library.'authors = ['ajohns']tools = [ 'lsq', 'cpq']requires = [ 'python-2.6+<3', 'argparse']def commands(): env.PATH.append("{root}/bin" ...
概述rez的包可以包含不同的变体(variant),可以把它看作同一个包版本的不同变种。每个变体都有一个或多个相对于当前包不同的依赖关系。
假定一个场景来说明变体的使用:
有一个maya插件my_maya_plugin,公司有两个maya版本分别为2016-sp2和2017。如果你的插件已经编译,而你需要在每个不同的maya版本中构建它。(即使源代码是相同的)这个时候就可以使用变体来创建插件版本,像这样来定义插件的package文件:
123456789101112name = "my_maya_plugin"version = "1.0.0"requires = [ "openexr-2.2"]variants = [ ["maya-2016.sp2"], ["maya-2017"]]
当构建这个插件的时候,会根据当前maya版本选择相应的变体。(在给定的配置环境中,只会使用包的一种变体)每个变体条目都有一个依赖列表,与requires列表里的没有什么不同。第一个变 ...
概述于2.71.0版本中引入。
临时包(Ephemeral Packages)是对不存在的包的请求。包名称以.开头,和其它的软件包请求类似,可以作为变体列表的一部分来请求,或者直接用rez-env命令进行请求。下面是一个例子:
12345678910111213]$ rez-env .foo-1You are now in a rez-configured environment.resolved by ajohns@turtle, on Tue Dec 22 08:17:00 2020, using Rez v2.70.0requested packages:.foo-1 (ephemeral)~platform==linux (implicit)~arch==x86_64 (implicit)~os==Ubuntu-16.04 (implicit)resolved packages:.foo-1 (ephemeral)
在解析过程中,临时包会其它软件包一样工作,但是它不会和实际软件包相关联,也不会运行执行任何配置。一个版本范围交集的例 ...
概述当使用rez-env创建解析环境时,实际上是创建了一个称为context的东西。一个context存储的信息包括:
初始程序包请求列表
被选择的变体列表
一个直观显示解析的图表
context不存储解析到的程序包副本,而是为每个包存储一种句柄,它提供了足够的信息来知道从哪里获取完整的包定义和内容。
context本身非常小,以json格式存储在一个rxt文件中。当你使用rez-env时,它实际在磁盘上创建了一个临时的context文件,直到shell退出时这个文件就会被删除。
123456789101112131415161718]$ rez-env foo bahYou are now in a rez-configured environment.resolved by ajohns@14jun01.methodstudios.com, on Wed Oct 22 12:44:00 2014,using Rez v2.0.rc1.10requested packages:foobahresolved packages:eek-2.6 /packages/inhouse/ ...
