使包可重定位#
通常,构建 Conda 包最困难的事情是使其可重定位。可重定位意味着该包可以安装到任何前缀。否则,该包将只能在其构建的环境中使用。
Conda-build 自动执行以下操作以使包可重定位
使用 macOS 上的
install_name_tool
和 Linux 上的 patchelf 将二进制对象文件转换为使用相对路径。任何不包含 NULL 字节且包含构建前缀或占位符前缀
/opt/anaconda1anaconda2anaconda3
的文本文件将在包元数据中的info/has_prefix
文件中注册。当 Conda 安装该包时,info/has_prefix
中的任何文件都会将其注册的前缀替换为安装前缀。有关更多信息,请参阅 包元数据。任何包含构建前缀的二进制文件都可以使用
meta.yaml
中的build/detect_binary_files_with_prefix
自动注册到info/has_prefix
中。或者,可以列出meta.yaml
中的build/binary_has_prefix_files
来注册单个二进制文件。注册的文件将在安装时将其构建前缀替换为安装前缀。这是通过用空终止符填充安装前缀来实现的,这样二进制文件的长度保持不变。因此,构建前缀必须足够长,以适应任何合理的安装前缀。在 macOS 和 Linux 上,conda-build 通过在构建目录名称末尾追加_placehold
将构建前缀填充到 255 个字符。
注意
conda-build 2.0 中的前缀长度已从 80 个字符更改为 255 个字符。具有 80 个字符前缀的旧版包必须重建才能利用更长的前缀。
在某些情况下,conda 可能将文件识别为二进制文件,但需要将其构建前缀替换为文本文件,而不是用空终止符进行填充。此类文件可以在
meta.yaml
中的build/has_prefix_files
中列出。