Rez中文文档09 Ephemeral Packages

概述

于2.71.0版本中引入。

临时包(Ephemeral Packages)是对不存在的包的请求。
包名称以.开头,和其它的软件包请求类似,可以作为变体列表的一部分来请求,
或者直接用rez-env命令进行请求。
下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
]$ rez-env .foo-1
You are now in a rez-configured environment.

resolved by ajohns@turtle, on Tue Dec 22 08:17:00 2020, using Rez v2.70.0

requested packages:
.foo-1 (ephemeral)
~platform==linux (implicit)
~arch==x86_64 (implicit)
~os==Ubuntu-16.04 (implicit)

resolved packages:
.foo-1 (ephemeral)

在解析过程中,临时包会其它软件包一样工作,但是它不会和实际软件包相关联,
也不会运行执行任何配置。一个版本范围交集的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
]$ rez-env .foo-1 '.foo-1.5+'

You are now in a rez-configured environment.

resolved by ajohns@turtle, on Tue Dec 22 08:21:04 2020, using Rez v2.70.0

requested packages:
.foo-1 (ephemeral)
.foo-1.5+ (ephemeral)
~platform==linux (implicit)
~arch==x86_64 (implicit)
~os==Ubuntu-16.04 (implicit)

resolved packages:
.foo-1.5+<1_ (ephemeral)

一个会引发冲突的例子:

1
2
3
]$ rez-env .foo-1 .foo-2
The context failed to resolve:
The following package conflicts occurred: (.foo-1 <--!--> .foo-2)

环境变量

临时软件包不会以实际软件包的方式运行,但会设置一些环境变量:

  • REZ_USED_EPH_RESOLVE:列出所有解析的临时请求
  • REZ_EPH_(PKG)_REQUEST:标记已经解析完成的临时包。PKG为临时包名称,以大写形式表示,
    其中的点符号由下划线代替,并删除来名称最前面的.

以下例子:

1
2
3
4
5
6
]$ rez-env python .foo-1 .bah-2
...
]$ echo $REZ_EPH_FOO_REQUEST
1
]$ echo $REZ_USED_EPH_RESOLVE
.foo-1 .bah-2

自检

为了使软件包检查运行时存在的临时包,提供了一个ephemerals对象,类似于resolve对象。

通常使用intersects函数进行检查,如:

1
2
3
4
# in package.py
def commands()
if intersects(ephemerals.get_range('enable_tracking', '0'), '1'):
env.TRACKING_ENABLED = 1

在这个例子里,如果解析中出现了.enable_tracking-1(或.enable_tracking-1.2+)这样的临时包,
那么环境变量TRACKING_ENABLED则被标记为1。

注意:implied的包不会包含在ephemerals对象中。

由于ephemerals对象是一个类似dict的对象,所以它有一个get函数。如果key存在,该函数返回一个完整字符串,
因此使用get时,给予的默认值也应该是一个完整的字符串,而不是0这样的版本范围字符串。

临时包示例

为什么我们会需要用到临时包?下面有两个示例:

向包传递信息

临时包可以作为一种包的选择,或在解析中将信息传递给软件包的一种方式。如下:

1
2
3
4
5
name = 'bah'

def commands():
if intersects(ephemerals.get_range('bah.cli', '1'), '1'):
env.PATH.append('{root}/bin')

当检查到临时包bah.cli在运行时存在,bah包将不执行它自身的command。

临时包可以是任何东西,因此你可以决定将它们用作全局包选项。

下面的这个示例,引用了一个充当全局白名单的cli临时包:

1
2
3
4
5
name = 'bah'

def commands():
if intersects(ephemerals.get_range('cli', ''), 'bah'):
env.PATH.append('{root}/bin')

这里,如果没有在命令中指定.cli,则将激活所有cli包。否则它将作为一个白名单。

表示抽象包

有时一个包需要某种形式的抽象对象或功能,而不是一个实际的包。

例如你的软件包需要GPU在主机上存在,为此需要进行设置,让所有带有GPU主机上的implicits列表包含.gpu-1临时包。

1
2
3
4
5
6
name = 'pixxelator'

variants = [
['.gpu-0'], # renders via CPU
['.gpu-1'] # renders via GPU
]