跳转至

依赖类型
Dependency Types

如果将包添加到特征的依赖表中,该依赖将在包含该特征的所有环境中可用。 正在构建的包的依赖粒度更细。 在这里您可以看到一个简单 C++ 包的三种依赖类型。

[package.build-dependencies]
cxx-compiler = "*"

[package.host-dependencies]
catch = "*"

[package.run-dependencies]
git = "*"

每个依赖在包构建过程的不同步骤中使用。 cxx-compiler 用于构建包,catch 将链接到包中,git 将在运行时可用。

让我们深入研究各种类型的包依赖及其在构建过程中的特定角色。

构建依赖(Build Dependencies)#

pixi-build-cmake

使用 pixi-build-cmake 后端时,您不需要将 cmake 或编译器指定为依赖项。 后端默认会安装 cmakeninja 和 C++ 编译器。

此表包含构建工作区所需的依赖项。 与依赖项和 host 依赖项不同,这些包是针对构建机器的架构安装的。 这支持从一种机器架构交叉编译到另一种机器架构。

典型的构建依赖示例包括:

  • 编译器在构建机器上调用,但它们为目标机器生成代码。 如果包是交叉编译的,构建和目标机器的架构可能不同。
  • cmake 在构建机器上调用以生成额外文件,然后将其包含在编译过程中。

Info

build 目标指的是将执行构建的机器。 这些依赖项安装的程序和库将在构建机器上执行。

例如,如果您在配备 Apple Silicon 芯片的 MacBook 上编译但针对 Linux x86_64,那么您的 build 平台是 osx-arm64,您的 host 平台是 linux-64

Host 依赖(Host Dependencies)#

Host 依赖是在构建/链接期间需要的、特定于宿主机器的依赖。 例如在交叉编译时,与构建依赖的区别就变得重要起来。 编译器是构建依赖项,因为它是您特定于您的机器。 相反,您链接的库是 host 依赖项,因为它们特定于 host 机器。 典型的 host 依赖示例包括:

  • 基础解释器:Python 包将在此处列出 python,R 包将列出 mro-baser-base
  • 您的包链接的库,如 opensslrapidjsonxtensor

Python 代码#

由于当前构建的方式,像 hatchlingpipuv 等依赖项是 host 依赖项。 否则,它会在构建过程中使用错误的 python 前缀。

这是一个技术限制,我们正在寻找方法来减少这种麻烦。 但现在,您需要将这些依赖项添加到 host-dependencies 部分。

例如,假设我们想使用 hatchlinguv 来构建 python 包。 您需要在项目清单(manifest)文件中使用类似这样的内容:

[host-dependencies]
hatchling = "*"
uv = "*"

本地代码#

在交叉编译时,您可能需要指定应该具有目标机器架构的 host 依赖项,并在构建过程中使用它们。 例如,在链接库时。 让我们回顾一下可以在此处找到的说明A Master Guide To Linux Cross-Compiling

  • build machine:构建代码的地方
  • host machine:运行构建代码的地方
  • target machine:构建代码输出的二进制文件运行的地方

假设我们使用 Linux PC (linux-64) 交叉编译一个名为 Awesome 的 CMake 应用程序,以在 Linux ARM 目标机器 (linux-aarch64) 上运行。 我们会得到下表:

Component Type Build Host Target
GCC Compiler x86_64 x86_64 aarch64
CMake Build tool x86_64 x86_64 N/A
Awesome Application x86_64 aarch64 N/A

所以如果我需要使用像 SDL2 这样的库,我需要将其添加到 host-dependencies 表中。 因为运行 Awesome 的机器的 host 架构与构建架构不同。

在您的项目清单(manifest)文件中给您类似这样的内容:

  # in our example these dependencies will use the aarch64 binaries
[host-dependencies]
sdl2 = "*"

运行导出(Run-Exports)#

Conda 包可以定义 run-exports,这些依赖项在 host-dependencies 部分指定时将隐式添加到 run-dependencies 部分。 这很有用,因为可以避免在两个部分中指定相同的依赖项。 因为 conda-forge 上的大多数包都定义了这些 run-exports。 使用 zlib 这样的东西,您只需要在 host-dependencies 部分指定它,它就会自动用作运行依赖项。

依赖项(运行依赖项)#

这些是运行包时需要的依赖项,它们是最常见的依赖项。 也是您在 workspace 中通常使用的。