概述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/ ...
概述Bundle是一个包含context文件和程序包仓库的目录。
context中的所有包都在存储库中,这使得bundle是可移动和独立的。通过命令创建一个bundle:
12345]$ rez-env foo -o foo.rxt]$ rez-bundle foo.rxt ./mybundle# example of running a command from the bundled context]$ rez-env -i ./mybundle/context.rxt -- foo-tool
通过API创建bundle:
12345from rez.bundle_context import bundle_contextfrom rez.resolved_context import ResolvedContextc = ResolvedContext(["python-3+", "foo-1.2+<2"])bundle_context(c, "./mybundle")
结构一个bundle的层级结构:
1 ...
概述假设你希望为你的用户提供一些不同的工具,尽管这些工具需要在不同的环境中运行。
例如你希望工作室的艺术家能够从命令行运行maya和nuke,而不需要考虑它们的环境。
为了达到这样的需求,你会创建两个context:maya.rxt和nuke.rxt。
首先运行maya:
1]$ rez-env --input maya.rxt -- maya
然后你可以将这个命令包装在一个脚本中,而这个脚本被称为maya:
12#!/bin/bashrez-env --input maya.rxt -- maya $*
现在,你把它放在$PATH里,并对nuke也是同样的做法。
那么这个是你的用户就可以从输入maya这个命令来运行这些应用程序,而不需要直到这背后发生来什么。简而言之,这就是suites的意义,可以理解为包装,包含一组context以及运行工具的脚本。
rez-suite命令同样还是上述的例子,这里使用rez-suite工具来完成。
首先我们创建一个suite,命令将在当前工作目录下创建一个名为mysuite的文件夹。
1]$ rez-suite --create mysuite
...
概述rez包可以使用rez-build工具来构建和本地安装。这个工具有以下操作:
遍历一个包的变体
构建环境
在此环境中运行构建系统
每一个构建都来自构建的目录路径。(通常是构建的子目录或构建下的变体特定子目录)例如一个包含两个基本python变体的程序包:
12345+- package.py+- CMakeLists.txt (or other build file)+-build +-python-2.6 # build dir for python-2.6 variant +-python-2.7 # build dir for python-2.6 variant
在构建过程中,当前目录被视为构建路径。
构建环境构建环境是一个rez解析环境,它的需求列表是这样构造的:
首先使用程序包require列表
然后添加程序包的build_require列表。其它包的build_requires也会被使用
再然后追加程序包的private_build_requires
最后,如果包有变体,则追加变体的需求
构建时会创建一系列环境变量(REZ_BUILD_开头),在这里 ...