rez - 一个跨平台的打包系统,可以构建和安装多个版本的包,并在运行时动态配置解析的环境。

2026-01-11 23:03:02 职业攻略

什么是雷兹?

基础知识

例子

快速开始

构建你的第一个包

特征

什么是雷兹?

Rez 是一个与众不同的跨平台包管理器。使用 Rez,您可以创建为一组给定包配置的独立环境。但是,与许多其他包管理器不同,包不会安装到这些独立环境中。相反,所有包版本都安装到中央存储库中,并且独立环境引用这些现有包。这意味着配置的环境是轻量级的,并且创建速度非常快,尽管包含数百个包,但通常只需几秒钟即可完成配置。

有关完整文档,请参阅wiki。

典型的包管理器将包安装到环境中

Rez 安装一次软件包,并动态配置环境

Rez 获取包请求列表,并构建目标环境,解决所有必要的包依赖关系。支持任何类型的软件包 - 已编译、python、应用程序和库。

基础知识

包存储在磁盘上的存储库中。每个包都有一个简洁的定义文件(package.py),它定义了它的依赖关系、它的命令(它如何配置包含它的环境)和其他元数据。例如,下面是流行的requests python 模块的包定义文件:

name = "requests"

version = "2.8.1"

authors = ["Kenneth Reitz"]

requires = [

"python-2.7+"

]

def commands():

env.PYTHONPATH.append("{root}/python")

这个包需要 python-2.7 或更高版本。使用时,其安装位置中的“python”子目录将附加到 PYTHONPATH 环境变量中。

当使用 rez API 或rez-env工具创建环境时,依赖解析算法会跟踪包需求并解析为所需包的列表。这些包中的命令被连接和评估,从而形成一个配置的环境。Rez 能够配置包含数百个包的环境,通常在几秒钟内完成。解析也可以保存到文件中,稍后重新评估时将再次重建相同的环境。

例子

此示例使用rez-env工具将用户放入包含请求包的已解析 shell :

]$ rez-env requests-2.2+ python-2.6 'pymongo-0+<2.7'

You are now in a rez-configured environment.

resolved by ajohns@nn188.somewhere.com, on Wed Feb 26 15:56:20 2014, using Rez v2.0.0

requested packages:

requests-2.2+

python-2.6

pymongo-0+<2.7

resolved packages:

python-2.6.8 /software/ext/python/2.6.8

platform-linux /software/ext/platform/linux

requests-2.2.1 /software/ext/requests/2.2.1/python-2.6

pymongo-2.6.3 /software/ext/pymongo/2.6.3

arch-x86_64 /software/ext/arch/x86_64

> ]$ _

此示例创建一个包含 12.5 或更高版本的包“houdini”的环境,并在该环境中运行命令“hescape -h”:

]$ rez-env houdini-12.5+ -- hescape -h

Usage: hescape [-foreground] [-s editor] [filename ...]

-h: output this usage message

-s: specify starting desktop by name

-foreground: starts process in foreground

解析的环境也可以通过 API 创建:

>>> import subprocess

>>> from rez.resolved_context import ResolvedContext

>>>

>>> r = ResolvedContext(["houdini-12.5+", "houdini-0+<13", "java", "!java-1.8+"])

>>> p = r.execute_shell(command='which hescape', stdout=subprocess.PIPE)

>>> out, err = p.communicate()

>>>

>>> print(out)

'/software/ext/houdini/12.5.562/bin/hescape'

快速开始

首先,安装 Rez。下载源代码,然后从源目录运行(将 DEST_DIR 替换为您的安装位置):

]$ python ./install.py -v DEST_DIR

这将安装 Rez 命令行工具。安装完成后,它将在末尾打印一条消息,告诉您如何使用 Rez。Rez 不是一个普通的 Python 包,因此您通常不会使用 pip 或 setup.py 安装它。不要移动安装 - 如果要更改安装路径,请重新安装到新位置。如果要为多个操作系统安装 rez,请为每个系统执行单独的安装。

接下来,您需要创建一些基本的 Rez 包。rez-bind工具创建基于已安装在系统上的软件的 Rez 包。尝试绑定以下软件包列表(请注意,对于 Python,您可能需要管理权限):

]$ rez-bind platform

]$ rez-bind arch

]$ rez-bind os

]$ rez-bind python

现在您应该能够创建一个包含 Python 的环境。尝试这个:

]$ rez-env python -- which python

/home/ajohns/packages/python-2.7.8/platform-linux/arch-x86_64/os-Ubuntu-12.04/bin/python

构建你的第一个包

rez-build工具用于构建包并在本地安装它们(通常到$ HOME/packages)。完成后,您可以通过rez-env使用它们,就像任何其他包一样:

]$ cd example_packages/hello_world

]$ rez-build --install

...

]$ rez-env hello_world -- hello

Hello world!

特征

支持Linux、OSX和Windows;

允许快速高效的构建-安装-测试周期;

创建类型的外壳:bash、tcsh、其他(外壳可以作为插件添加);

包含一个支持 git、mercurial 和 svn(作为插件)的部署系统;

环境解析可以保存到磁盘并在以后重用(有点像 VirtualEnv);

高度可插拔,支持五种不同的插件类型,从添加新的 shell 类型到添加新的构建系统;

包含版本解析算法,用于避免版本冲突;

在渲染的点图中可视化已解决的环境;

在搜索路径中找到包,因此可以将不同的包部署到不同的位置;

支持字母数字版本号;

具有强大的版本需求语法,能够描述任何版本范围,以及拒绝版本范围的冲突算子;

包“变体”——一种定义同一包版本的不同风格的方法,例如为宿主应用程序的多个版本构建的插件;

可以将自定义发布挂钩(例如发布后操作)添加为插件;

具有时间锁定功能,允许重新创建旧的解析(忽略较新的包);

包定义是一个单一的、简洁的文件;

包使用专用的 Python API 以与平台和外壳无关的方式定义它们对环境的影响(添加到 PATH 等);

拥有基于memcached的缓存系统,用于缓存环境解析;

具有包过滤功能,允许分阶段发布包,例如 alpha 和 beta 包。

已知问题和限制

目前 CMake 构建在带有 Rez 的 Windows 上无法运行,并且相关测试被跳过。修复需要路线图上的多项更改。用户已经成功实现了在 Windows 下通过 Rez 使用 CMake 的变通方法,但目标是在未来在任何平台上提供无缝体验。有关详细信息,请参阅此问题