Rez中文文档09 Ephemeral Packages
Rez中文文档09 Ephemeral Packages
lingyun概述
于2.71.0版本中引入。
临时包(Ephemeral Packages)是对不存在的包的请求。
包名称以.
开头,和其它的软件包请求类似,可以作为变体列表的一部分来请求,
或者直接用rez-env
命令进行请求。
下面是一个例子:
1 | rez-env .foo-1 |
在解析过程中,临时包会其它软件包一样工作,但是它不会和实际软件包相关联,
也不会运行执行任何配置。一个版本范围交集的例子:
1 | rez-env .foo-1 '.foo-1.5+' |
一个会引发冲突的例子:
1 | rez-env .foo-1 .foo-2 |
环境变量
临时软件包不会以实际软件包的方式运行,但会设置一些环境变量:
- REZ_USED_EPH_RESOLVE:列出所有解析的临时请求
- REZ_EPH_(PKG)_REQUEST:标记已经解析完成的临时包。PKG为临时包名称,以大写形式表示,
其中的点符号由下划线代替,并删除来名称最前面的.
以下例子:
1 | rez-env python .foo-1 .bah-2 |
自检
为了使软件包检查运行时存在的临时包,提供了一个ephemerals
对象,类似于resolve
对象。
通常使用intersects
函数进行检查,如:
1 | # in package.py |
在这个例子里,如果解析中出现了.enable_tracking-1(或.enable_tracking-1.2+)这样的临时包,
那么环境变量TRACKING_ENABLED则被标记为1。
注意:implied的包不会包含在ephemerals对象中。
由于ephemerals对象是一个类似dict的对象,所以它有一个get函数。如果key存在,该函数返回一个完整字符串,
因此使用get时,给予的默认值也应该是一个完整的字符串,而不是0
这样的版本范围字符串。
临时包示例
为什么我们会需要用到临时包?下面有两个示例:
向包传递信息
临时包可以作为一种包的选择,或在解析中将信息传递给软件包的一种方式。如下:
1 | name = 'bah' |
当检查到临时包bah.cli在运行时存在,bah包将不执行它自身的command。
临时包可以是任何东西,因此你可以决定将它们用作全局包选项。
下面的这个示例,引用了一个充当全局白名单的cli临时包:
1 | name = 'bah' |
这里,如果没有在命令中指定.cli,则将激活所有cli包。否则它将作为一个白名单。
表示抽象包
有时一个包需要某种形式的抽象对象或功能,而不是一个实际的包。
例如你的软件包需要GPU在主机上存在,为此需要进行设置,让所有带有GPU主机上的implicits
列表包含.gpu-1
临时包。
1 | name = 'pixxelator' |