抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

SylensHub

吃饭, 睡觉, 打游戏!

之前我写过一篇博客,记录了我用pixi的tasks功能来修复Bioconductor包(如GenomeInfoDbDataBSgenome.Hsapiens.UCSC.hg38等)安装后缺依赖的问题。当时我只知道问题存在,但并不清楚根因,只是提供了一个不太理想的解决方案。

但是最近在AI的回答中,我搞清楚了真正的原因——这一切都源于Conda生态中的 post-link 脚本机制

问题回顾

在使用pixi管理生物信息学环境时,安装Seuratmaftools等依赖Bioconductor基因组注释包的R包后,即使通过pixi显式声明了这些依赖,实际加载时仍然会报错说包不存在。

典型的报错信息类似于:Error: package 'GenomeInfoDbData' is not installed

但实际上,从生成的 pixi.lock 中能看到 bioconductor-GenomeInfoDbData 等相关包已被安装。

在Conda生态中,这样的基因组注释包,为了减小包本身的体积,通常只包含元数据,真正的数据库文件(如SQLite文件)是在安装时通过 post-link 脚本 在本地动态下载并解压构建的。

post-link 脚本是 Conda 包安装生命周期的一部分——当一个包被安装后,Conda 会执行该包内预置的 post-link.sh(Linux/macOS)或 post-link.bat(Windows)脚本,来完成一些安装后配置工作,比如:

  • 下载大型数据文件(基因组数据库、模型权重等)
  • 编译本地代码
  • 创建额外的目录结构
  • 设置环境变量

然而,Pixi 在默认情况下为了安全性和确定性,是禁用(或者说不会主动执行)Conda 包的 post-link 脚本的。这就导致了:

  1. 安装显示顺利结束 ✅
  2. 包的元数据确实存在 ✅
  3. 但核心数据文件没有下载 ❌
  4. R 语言调用时自然找不到对应的数据包 ❌

这正是我之前遇到的”已安装但找不到包”问题的真正根源。并且在按安装这些包的时候,其实 Pixi 就会给出一个提示,说有些包的 post-link 脚本因为默认设置无法执行,你可以自行修改设置。

相关的内容在 Pixi 的文档中其实有说明。

真正的解决方案:启用 pixi 的 post-link 支持

官方文档给出了两种方式,一种是直接运行pixi config set --local run-post-link-scripts,来允许执行这些脚本。

另外一种本质上是一样的,只不过是去手动在配置文件内添加相关的变量。

这个设置只对之后安装的包起效,如果环境已经完成配置,需要 pixi clean 之后,再次 pixi install -a,同时你会发现在 Pixi 的进度条满后,日志会停留比较长的时候无进一步输出,其实就是在执行 post-link。

对比之前的方案

其实在之前博客中提到的 [方案] 也不失为一种方案,但是直接通过 R 自己的依赖体系进行包安装毕竟会破坏 conda 的依赖体系,给后续的依赖修改埋雷,所以这次描述的方案才是最佳的选择。

评论

留下友善的评论吧~