6  项目环境管理:Pixi

Modified

2026-05-08

6.1 背景

大毛刚开始做分析时,觉得装软件不就是“能用就行”。今天为了跑差异分析装一个R包,明天为了画图升级一下Python库,后天又跟着AI输一串命令装了几个依赖。结果没过几天,昨天还能运行的代码今天突然报错;这个项目需要旧版本,那个项目又要求新版本;服务器上还没有管理员权限,想装点东西处处碰壁。

他这才发现,做生信最怕的不是不会装软件,而是“装得一团乱”。如果每个项目都像一锅大杂烩,分析根本没法稳定复现。那有没有一种办法,能让不同项目各用各的环境,彼此互不打架?

6.2 简介

在生物信息学分析中,不同项目可能需要不同版本的R包和Python库。很多刚入门的同学可能会选择直接在全局环境中安装所需的包和库,但我不推荐这样做,因为:

  1. 依赖冲突:不同项目可能需要不同版本的同一包或库,直接安装在全局环境中可能导致版本冲突,影响项目的正常运行。
  2. 权限问题:如果您在服务器上工作,一般没有root权限,无法在全局环境中安装包和库。
  3. 可复现性差:直接在全局环境中安装包和库,难以记录和管理项目的依赖,影响分析结果的可复现性。

因此,我推荐使用环境管理工具来创建和管理隔离的项目环境。简单来说就是为每个项目单独安装所需的环境。这样,每个项目都有独立的环境,互不干扰,确保依赖的兼容性和可复现性。

环境管理工具有很多种,最常见的就是Conda/Mamba。除此之外,专门用于R的有renv,专门用于Python的有virtualenv和venv等。

在本章中,我们将重点介绍Pixi,这是一个以Conda/Mamba为基础的环境管理工具,可以同时安装R、Python等多种语言的包和库,并且速度很快,集成了以往环境管理工具的优点。Pixi有潜力成为下一代最佳的环境管理工具。

6.3 Conda、pip的基础知识

在学习Pixi之前,我们需要先了解一些背景知识。Pixi是基于Conda构建的,因此理解Conda和pip的基本概念对于使用Pixi很有帮助。

6.3.1 Conda和pip是什么

Conda是一个跨语言的包管理和环境管理系统。它不仅能管理Python包,还能管理R包、C库等二进制文件,非常适合生物信息学分析。Mamba是Conda的快速替代品,而Pixi则是基于Conda/Mamba的更现代化工具。

pip是Python官方的包管理工具,专门用于安装Python包。它从PyPI(Python Package Index)安装包,是Python生态中最常用的包管理器。

两者的主要区别:

  • Conda:多语言支持,处理系统依赖,适合复杂的科学计算和生物信息学环境
  • pip:仅Python包,速度快,包更新及时,但不处理系统级依赖
Tip混合使用Conda和pip

Pixi的另一个优势,就是可以让您无痛地同时使用conda和pip包:

  • 优先使用conda包(pixi add <package-name>)
  • 对于conda中找不到的包,使用pip(pixi add --pypi <package-name>)

6.3.2 Conda的频道(Channel)

Conda的频道(Channel)是存储和分发Conda包的仓库。最常用的频道有:

  • conda-forge:社区维护,包含最全面的包(20,000+),推荐优先使用
  • bioconda:专门用于生物信息学软件(9,000+工具)
  • defaults:Anaconda官方频道

在Pixi中,可以在pixi.toml文件中配置频道:

[project]
channels = ["conda-forge", "bioconda"]

6.3.3 如何搜索Conda包

在使用Pixi添加包之前,需要先确认包是否在Conda频道中,以及准确的包名。推荐的搜索方法:

Google搜索(最简单):

  • 搜索格式:<包名> conda
  • 例如:搜索DESeq2 conda,第一个结果通常就是Anaconda.org上的包页面

Anaconda.org网站:

命令行搜索:

pixi search <package-name>

6.4 安装和初始化Pixi

6.4.1 下载和安装Pixi

Pixi的安装非常简单,支持多种操作系统。根据您的系统选择相应的安装方法:

Linux和macOS:

curl -fsSL https://pixi.sh/install.sh | bash

安装完成后,重启终端或运行 source ~/.bashrc(Linux)或 source ~/.zshrc(macOS)使配置生效。

Windows:

在PowerShell中运行:

iwr -useb https://pixi.sh/install.ps1 | iex

验证安装:

安装完成后,运行以下命令验证:

pixi --version

如果显示版本号,说明安装成功。

Tip更新Pixi

Pixi可以自我更新,运行以下命令即可更新到最新版本:

pixi self-update

6.4.2 初始化Pixi项目

安装好Pixi后,我们来创建第一个项目环境。在您的项目目录中运行:

# 创建并进入项目目录
mkdir my-bioinfo-project
cd my-bioinfo-project

# 初始化Pixi项目
pixi init

运行pixi init后,Pixi会在当前目录下创建一个pixi.toml配置文件。这个文件是Pixi项目的核心,记录了项目的所有依赖和配置。

6.4.3 理解pixi.toml配置文件

让我们看看pixi.toml文件的基本结构:

[project]
name = "my-bioinfo-project"
version = "0.1.0"
description = "Add a short description here"
authors = ["Your Name <your.email@example.com>"]
channels = ["conda-forge"]
platforms = ["linux-64"]

[tasks]

[dependencies]

主要配置项说明:

  • project:项目的基本信息(名称、版本、描述、作者)
  • channels:指定从哪些Conda频道获取软件包
  • platforms:指定支持的平台(如linux-64、osx-64、win-64)
  • dependencies:项目依赖的软件包列表
  • tasks:自定义的任务命令(可选)

6.4.4 添加bioconda频道

对于生物信息学项目,我们通常需要添加bioconda频道。编辑pixi.toml文件,修改channels配置:

channels = ["conda-forge", "bioconda"]  # 添加bioconda

或者使用命令行添加:

pixi project channel add bioconda
Note频道顺序很重要

在channels列表中,频道的顺序决定了包的搜索优先级。列表中靠前的频道优先级更高。推荐的顺序是:

channels = ["conda-forge", "bioconda"]

这样可以确保从最全面的conda-forge和生物信息学专用的bioconda中获取包。

6.4.5 跨平台支持

如果您的项目需要在多个平台上运行(比如在Linux服务器和本地macOS上),可以在platforms中添加多个平台:

platforms = ["linux-64", "osx-64", "osx-arm64"]

这样Pixi会为每个平台解析合适的依赖版本。

6.5 使用Pixi添加包

因为Pixi是基于Conda/Mamba的,所以当我们想要安装某个包时,我们首先需要确认这个包是否在Conda的频道中发行。如前所述,我们常用的频道有两个,conda-forge和bioconda。conda-forge中包括了绝大多数CRAN和PyPI中的包,而bioconda中则包含了大量生物信息学相关的软件包。也就是说,在大多数情况下,我们可以直接从这两个频道中找到我们需要的包。

例如,我们想要安装R包DESeq2,这是一个非常常用的差异表达分析包。我们需要:

  1. 在谷歌中搜索DESeq2 conda,第一个结果就是Bioconductor Deseq2 | Anaconda.org
  2. 我们点进去,看到这个包在bioconda频道中发行,它的包名是bioconductor-deseq2。
  3. 然后我们就可以使用Pixi来安装它了。在终端中进入我们的项目目录,运行pixi add bioconductor-deseq2,而后Pixi会解析环境依赖,并将其添加到pixi.toml文件中。
  4. 注意,此时这个包只是被添加到了环境配置文件中,并没有真正安装。如果您还有其他包需要添加,可以继续使用pixi add <package-name>命令添加。等您把所有需要的包都添加完后,再运行pixi install命令,Pixi才会根据pixi.toml文件中的配置,真正安装所有的包到项目环境中。
ImportantImportant

需要注意的是,Conda中的包名通常和CRAN或PyPI中的包名有所不同,通常会有一些前缀或后缀。例如,我们在R中安装DESeq2,只需要运行install.packages("DESeq2"),但在Conda中,我们需要安装bioconductor-deseq2。因此,在使用Pixi添加包时,一定要先确认包名。

一般的规律是,CRAN中的R包在Conda中通常会有r-前缀,如r-ggplot2;而Bioconductor中的R包通常会有bioconductor-前缀,如bioconductor-deseq2。Python包则通常和PyPI中的包名一致,但有时也会有一些差异。

6.6 Pixi常用命令

用于管理局部项目环境的Pixi常用命令:

  • pixi init:在当前目录下初始化一个新的Pixi项目,生成pixi.toml文件。
  • pixi add <package-name>:将指定的包添加到项目环境中,并更新pixi.toml文件。
  • pixi remove <package-name>:将指定的包从项目环境中移除,并更新pixi.toml文件。
  • pixi install:根据pixi.toml文件中的配置,安装所有的包到项目环境中。
  • pixi run <package-command>:在项目环境中运行指定的包命令。例如,当您在Pixi环境中安装了R后,可以使用pixi run R来启动R环境。

用于管理全局环境的Pixi常用命令:

  • pixi global install <package-name>:将指定的包安装到全局环境中。
  • pixi global uninstall <package-name>:将指定的包从全局环境中移除。
  • pixi global list:列出全局环境中已安装的包。

6.7 全局工具安装

在前面的章节中,我们学习了如何在项目环境中安装包。这些包只能在特定项目中使用,每个项目有独立的环境。但有些工具我们希望在任何地方都能使用,这时就需要全局安装。

6.7.1 何时选择全局安装

适合全局安装的工具:

  • 开发工具:如代码编辑器、终端复用器(zellij、tmux)、版本控制工具等
  • 通用命令行工具:如文件搜索工具(fd、ripgrep)、系统监控工具(htop、btop)等
  • 常用分析工具:如果某个工具在您的所有项目中都使用同一个版本,可以考虑全局安装
  • 项目管理工具:如pixi自身、mamba、ruff等

应该使用项目级安装的包:

  • 分析包和库:生物信息学分析包(如DESeq2、Seurat)、统计分析包等
  • 版本敏感的包:不同项目可能需要不同版本的包
  • 项目依赖:任何与特定项目分析流程相关的包
  • 数据处理工具:可能在不同项目中需要不同版本的工具
Tip判断原则

问自己两个问题:

  1. 这个工具在所有项目中都用相同版本吗? 如果是,考虑全局安装
  2. 这个工具是为了开发环境,还是分析流程? 开发工具全局安装,分析工具项目安装

当不确定时,优先选择项目级安装,这样更安全且可复现。

6.7.2 全局安装示例

安装终端复用器Zellij:

pixi global install zellij

安装多个工具:

pixi global install fd ripgrep bat

安装完成后,这些工具会自动添加到系统PATH中,您可以在任何目录直接使用。

查看已安装的全局工具:

pixi global list

卸载全局工具:

pixi global uninstall zellij
Note全局环境的存储位置

Pixi的全局工具安装在用户目录下的.pixi文件夹中,不会影响系统环境或其他用户。这意味着:

  • 不需要root权限
  • 不会污染系统环境
  • 每个用户有独立的全局环境
  • 可以随时完全删除(删除~/.pixi目录即可)

6.8 安装非Conda包

对于有些包,作者没有在Conda频道中发行。这时我们需要首先查看该包的GitHub页面,查看作者提供的官方安装方法。我们分为Python包和R包两种情况来讲解。

  • Python包:有一些包只能使用Pypi途径安装,尤其是需要使用cuda等GPU加速的深度学习包(如torch、tensorflow等)。这时我们可以使用Pixi的Pypi方式来安装,例如pixi add --feature scvi_cuda --pypi "scvi-tools[cuda]"
  • R包:有些R包只能通过CRAN或Bioconductor安装,这时我们可以使用打开Pixi安装的R环境,然后在R中使用install.packages()或BiocManager::install()来安装。但我更推荐使用Pak这个R包管理工具来安装,因为它可以简单地使用pak::pkg_install("package-name")来安装CRAN、Bioconductor和GitHub中的R包,并且能自动处理系统依赖问题。