概览
Overview
为了将 conda 包的构建与 Pixi 解耦,我们提供了所谓的构建后端。 这些本质上是遵循特定协议的可执行文件,为 Pixi 和构建后端实现。 这还允许将构建后端与其清单规范解耦。
可用的后端#
| Backend | Use Case |
|---|---|
pixi-build-cmake |
使用 CMake 的项目 |
pixi-build-python |
构建 Python 包 |
pixi-build-rattler-build |
使用 recipe.yaml 直接构建,完全控制 |
pixi-build-ros |
ROS(机器人操作系统)包 |
pixi-build-r |
使用 R CMD INSTALL 的 R 包 |
pixi-build-rust |
基于 Cargo 的 Rust 应用程序和库 |
pixi-build-mojo |
Mojo 应用程序和包 |
所有后端均可通过 conda-forge conda 通道(channel)获取,并支持多个平台(Linux、macOS、Windows)。 对于最新版本的后端,您可以在通道列表前添加 prefix.dev/pixi-build-backends conda 通道(channel)。
关键概念#
- 编译器 - pixi-build 如何与 conda-forge 的编译器基础设施集成
安装#
通过将构建后端添加到项目清单(manifest)文件的 package.build 部分来安装特定的构建后端:
[package.build.backend]
channels = ["https://prefix.dev/conda-forge"]
name = "pixi-build-python"
version = "0.*"
对于自定义后端通道(channel),您可以将通道(channel)添加到项目清单(manifest)文件的 channels 部分:
[package.build]
backend = { name = "pixi-build-python", version = "0.*" }
channels = ["https://prefix.dev/conda-forge"]
覆盖构建后端#
有时您想覆盖 Pixi 使用的构建后端。意思是覆盖在 [package.build] 中指定的后端。我们目前有两个环境变量允许这样做:
PIXI_BUILD_BACKEND_OVERRIDE:此环境变量允许覆盖一个或多个后端。使用{name}={path}指定映射到路径的后端名称,并使用,分隔多个后端。 例如:pixi-build-cmake=/path/to/bin,pixi-build-python将:- 用位于
/path/to/bin的可执行文件覆盖pixi-build-cmake后端 - 并将使用 PATH 中的
pixi-build-python后端
- 用位于
PIXI_BUILD_BACKEND_OVERRIDE_ALL:如果此环境变量设置为某个值,例如1或true,它将不会单独安装任何后端,并假定所有后端都已被覆盖并在 PATH 中可用。这对于开发目的很有用。例如PIXI_BUILD_BACKEND_OVERRIDE_ALL=1 pixi install
故障排除#
重新构建生成的食谱#
当您使用 pixi build 构建包时,构建后端会生成一个完整的 rattler-build 食谱,存储在项目的构建目录中。这对于调试构建问题或准确了解包的构建方式很有用。
食谱位置#
构建后端在两个位置生成食谱:
1. 通用食谱(所有输出)#
此目录包含:
recipe.yaml- 可构建所有包输出的通用食谱variants.yaml- 包的所有变体配置
2. 特定于变体的食谱(单个输出)#
此目录包含:
recipe.yaml- 构建后端生成的完整 rattler-build 食谱variants.yaml- 用于此特定构建的变体配置
重新构建包#
要使用相同配置调试或重新构建包,您有两个选择:
选项 1:导航到食谱目录#
-
导航到食谱目录:
-
使用
rattler-build重新构建包:
选项 2:指向食谱目录#
使用 --recipe 标志在不更改目录的情况下构建:
这允许您:
- 检查生成的准确食谱
- 使用直接访问
rattler-build调试构建失败 - 了解构建后端如何将您的项目模型(
pixi.toml)转换
Tip
<variant_hash> 确保每个唯一的变体组合都有其自己的食谱目录,让您可以轻松比较不同的构建配置。
调试 JSON-RPC#
您可以在同一目录中找到项目模型和请求/响应的 JSON 版本以及 recipe.yaml。
我们存储:
- 项目模型:
project_model.json - 请求:
*_params.json - 响应:
*_response.json