跳转至

流程管理工具(Workflow & Environment Management)


一句话说明

流程管理工具确保分析的可复现性和可维护性,是从"能跑通"到"工程化"的关键能力。面试官通过这类问题判断你是否具备工程化思维。


2. 核心知识点

2.1 Conda环境管理(重点)

基本概念

Conda是一个跨平台的包管理和环境管理工具,核心功能: 1. 环境隔离:不同项目可以用不同版本的软件,互不干扰 2. 依赖解析:自动处理软件包之间的依赖关系 3. 跨平台:Linux/macOS/Windows通用

核心命令

操作 命令 说明
创建环境 conda create -n env_name python=3.9 指定环境名和Python版本
激活环境 conda activate env_name 进入环境
退出环境 conda deactivate 退出当前环境
安装包 conda install -c bioconda fastqc 从bioconda频道安装
列出环境 conda env list 查看所有环境
列出包 conda list 查看当前环境的包
导出环境 conda env export > environment.yml 导出环境配置
还原环境 conda env create -f environment.yml 从配置文件还原
删除环境 conda env remove -n env_name 删除整个环境
搜索包 conda search kraken2 搜索可用版本

Channels(频道)优先级

# 推荐的频道配置顺序(~/.condarc)
channels:
  - conda-forge      # 最大的社区频道,优先级最高
  - bioconda         # 生信专用频道(FastQC, Kraken2, Bowtie2等)
  - defaults         # Anaconda官方频道

📌 面试关键点:bioconda几乎包含了所有常用生信工具,是生信人必须配置的频道。

Mamba加速

# Mamba 是 Conda 的 C++ 加速替代品,解析依赖快 10-50 倍
conda install -n base -c conda-forge mamba

# 用法和 conda 完全一致,只是把 conda 换成 mamba
mamba create -n metagenome python=3.9
mamba install -c bioconda kraken2 bracken bowtie2

常见问题:依赖冲突

# 场景:安装 A 需要 libgcc=12,但 B 需要 libgcc=11

# 解决方案1:创建独立环境(最推荐)
conda create -n tool_a -c bioconda tool_a
conda create -n tool_b -c bioconda tool_b

# 解决方案2:用 mamba 替代 conda(更快的依赖解析)
mamba install -c bioconda tool_a tool_b

# 解决方案3:指定版本
conda install tool_a=2.1 tool_b=1.3

# 最佳实践:一个分析流程一个环境,不要把所有工具装在一个环境里

environment.yml 模板

# environment.yml - 肠道宏基因组分析流程环境
name: metagenome_pipeline
channels:
  - conda-forge
  - bioconda
  - defaults
dependencies:
  - python=3.9
  - fastqc=0.12.1
  - multiqc=1.14
  - fastp=0.23.4
  - bowtie2=2.5.1
  - kraken2=2.1.3
  - bracken=2.8
  - samtools=1.17
  - pip:
    - pandas==2.0.3
    - scipy==1.11.1
    - matplotlib==3.7.2

2.2 Snakemake基础(重点)

核心概念

Snakemake是一个基于Python的工作流管理系统,核心思想: - 声明式:你定义"要什么"(rule的output),Snakemake自动推断"怎么做" - DAG驱动:根据input/output依赖关系自动构建有向无环图(DAG) - 增量计算:只重跑需要更新的步骤(通过文件时间戳判断)

Rule定义

# Snakefile 基本结构

rule rule_name:
    input:
        "path/to/input_file"           # 输入文件
    output:
        "path/to/output_file"          # 输出文件
    params:
        extra="--threads 4"            # 额外参数
    threads: 4                         # CPU线程数
    log:
        "logs/rule_name.log"           # 日志文件
    shell:
        """
        some_command {input} {output} {params.extra} 2> {log}
        """

DAG有向无环图

# Snakemake 自动根据 input/output 依赖构建执行图
# 例如:

rule all → rule diversity_analysis → rule kraken2 → rule bowtie2 → rule fastp → rule fastqc
                                                                              ↑
                                                                          原始FASTQ

📌 面试关键点:Snakemake不是按rule的书写顺序执行,而是从rule all的output反向推导整个DAG。

关键参数

参数 说明
--cores N / -j N 使用N个CPU核心
--dryrun / -n 预演模式(不实际执行,检查流程)
--rerun-incomplete 重新运行未完成的任务
--forceall 强制重跑所有步骤
--configfile config.yaml 指定配置文件
--cluster "qsub ..." 集群投递(PBS/SLURM)
--dag \| dot -Tpdf > dag.pdf 可视化DAG

2.3 Nextflow基础(了解)

概念 说明
process 类似Snakemake的rule,定义一个分析步骤
channel 数据流通道,连接process之间的输入输出
workflow 定义process的执行顺序和数据流
DSL2 Nextflow的模块化语法(推荐)

Snakemake vs Nextflow

对比项 Snakemake Nextflow
语言基础 Python Groovy (JVM)
学习曲线 较低(Python基础即可) 较高(需学Groovy语法)
社区流程 Snakemake Workflow Catalog nf-core(更丰富)
云平台支持 基础 原生支持(AWS/GCP)
HPC集群 --cluster 原生executor
推荐场景 个人项目、学术研究 生产环境、企业级

nf-core:一个高质量的Nextflow社区流程集合,包含100+预构建流程: - nf-core/ampliseq —— 16S/ITS扩增子分析 - nf-core/mag —— 宏基因组组装和binning - nf-core/taxprofiler —— 物种分类注释 - nf-core/rnaseq —— RNA-seq分析

2.4 Docker/Singularity(了解)

容器概念

概念 类比 说明
镜像(Image) 安装光盘 只读模板,包含操作系统+软件+配置
容器(Container) 运行中的虚拟机 从镜像启动的运行实例
Dockerfile 安装说明书 定义如何构建镜像的文本文件
仓库(Registry) 应用商店 Docker Hub / Biocontainers

Docker vs Conda

对比项 Docker Conda
隔离层级 操作系统级(包含OS+依赖) 包级(共享OS)
可移植性 极高("在我机器上能跑=在所有机器上能跑") 一般(不同OS可能有差异)
体积 较大(几百MB到几GB) 较小
HPC支持 需root权限,HPC通常不允许 无需root
推荐 生产环境、云平台 日常开发、HPC

Singularity在HPC上的使用

# HPC不允许Docker(需root权限),用Singularity替代
# Singularity可以直接使用Docker镜像

# 拉取Docker镜像转为Singularity格式
singularity pull kraken2.sif docker://staphb/kraken2:2.1.3

# 运行容器
singularity exec kraken2.sif kraken2 --version

# 绑定数据目录(让容器内能访问外部数据)
singularity exec --bind /data:/data kraken2.sif kraken2 \
    --db /data/kraken2_db \
    --output /data/output.txt \
    /data/sample.fastq

📌 面试关键点:HPC集群通常用Singularity而非Docker,因为Docker需要root权限,存在安全隐患。

为什么生信需要容器?

  1. 环境一致性:解决"在我机器上能跑"的问题
  2. 版本锁定:工具版本固定,结果可复现
  3. 快速部署:新人入职/换机器,一条命令搭好环境
  4. 发表要求:越来越多期刊要求提供容器化环境

2.5 Git版本控制(重点)

基本概念

Git是分布式版本控制系统,记录代码的每一次更改,可以随时回退、分支、合并。

概念 类比 说明
repository 项目文件夹 Git管理的项目
commit 存档点 一次代码提交
branch 平行宇宙 独立开发线
remote 云端备份 GitHub/GitLab
staging area 待提交清单 add后、commit前的暂存区

基本操作

操作 命令 说明
初始化 git init 在当前目录创建Git仓库
查看状态 git status 查看哪些文件被修改
添加暂存 git add file.py 将修改加入暂存区
添加全部 git add . 添加所有修改
提交 git commit -m "message" 提交暂存区的更改
查看历史 git log --oneline 查看提交记录
推送 git push origin main 推送到远程仓库
拉取 git pull origin main 从远程拉取更新
创建分支 git branch feature 创建新分支
切换分支 git checkout feature 切换到指定分支
查看差异 git diff 查看未暂存的修改

.gitignore 配置(生信项目)

# === 大数据文件(必须忽略!) ===
*.fastq
*.fastq.gz
*.fq
*.fq.gz
*.bam
*.sam
*.sra

# === 分析结果(可重新生成) ===
results/
output/
*.html     # MultiQC/FastQC报告

# === 数据库文件(太大) ===
*_db/
*.k2d

# === 临时文件 ===
*.tmp
*.log
__pycache__/
.ipynb_checkpoints/

# === 系统文件 ===
.DS_Store
Thumbs.db

# === 不忽略的(显式保留) ===
!environment.yml
!Snakefile
!scripts/*.sh
!scripts/*.py

📌 面试关键点:生信项目Git应该追踪脚本、配置文件、environment.yml,忽略原始数据、数据库、中间结果

生信项目Git最佳实践

project/
├── .git/                    # Git仓库(自动生成)
├── .gitignore               # 忽略规则
├── README.md                # 项目说明
├── environment.yml          # 环境配置(必须追踪)
├── software_versions.txt    # 软件版本记录
├── Snakefile                # 流程文件(必须追踪)
├── config.yaml              # 参数配置(必须追踪)
├── scripts/                 # 分析脚本(必须追踪)
│   ├── 01_qc.sh
│   ├── 02_trim.sh
│   └── ...
├── data/                    # 原始数据(.gitignore忽略)
├── results/                 # 分析结果(.gitignore忽略)
└── logs/                    # 运行日志(.gitignore忽略)

3. 实战命令

3.1 Conda环境创建和管理

#!/bin/bash
# conda_setup.sh - Conda环境管理全套命令
# 适用场景:从零搭建宏基因组分析环境

# === 1. 安装 Mamba(加速conda) ===
conda install -n base -c conda-forge mamba -y
# -n base: 安装到base环境
# -c conda-forge: 从conda-forge频道安装
# -y: 自动确认

# === 2. 创建分析环境 ===
mamba create -n metagenome python=3.9 -y
# -n metagenome: 环境名
# python=3.9: 指定Python版本

# === 3. 激活环境 ===
conda activate metagenome

# === 4. 安装生信工具 ===
# 质控工具
mamba install -c bioconda -c conda-forge fastqc=0.12.1 multiqc=1.14 fastp=0.23.4 -y

# 比对和物种注释
mamba install -c bioconda -c conda-forge bowtie2=2.5.1 kraken2=2.1.3 bracken=2.8 -y

# 辅助工具
mamba install -c bioconda -c conda-forge samtools=1.17 seqkit=2.5.1 -y

# Python包
pip install pandas==2.0.3 scipy==1.11.1 matplotlib==3.7.2 scikit-learn==1.3.0

# === 5. 验证安装 ===
fastqc --version        # FastQC v0.12.1
fastp --version          # fastp 0.23.4
bowtie2 --version        # bowtie2-2.5.1
kraken2 --version        # Kraken version 2.1.3
python --version         # Python 3.9.x

# === 6. 导出环境配置 ===
conda env export > environment.yml
# 这个文件要加入Git追踪!

# === 7. 记录软件版本 ===
echo "=== Software Versions ===" > software_versions.txt
fastqc --version >> software_versions.txt 2>&1
fastp --version >> software_versions.txt 2>&1
bowtie2 --version 2>&1 | head -1 >> software_versions.txt
kraken2 --version >> software_versions.txt 2>&1
python --version >> software_versions.txt 2>&1
date >> software_versions.txt
echo "版本记录完成: software_versions.txt"

# === 8. 从environment.yml还原环境(换电脑时) ===
# conda env create -f environment.yml
# conda activate metagenome

# === 9. 查看已有环境 ===
conda env list

# === 10. 删除环境(不再需要时) ===
# conda env remove -n metagenome

3.2 Snakemake简单流程示例

# Snakefile - 宏基因组分析流程(3个rule示例)
# 流程:fastp质控 → Bowtie2去宿主 → Kraken2物种注释

# === 配置 ===
configfile: "config.yaml"

# 从config.yaml读取样本列表和参数
SAMPLES = config["samples"]       # 样本名列表,如 ["sample1", "sample2"]
HOSTDB = config["host_db"]        # 宿主参考基因组路径
KRAKENDB = config["kraken2_db"]   # Kraken2数据库路径

# === rule all:定义最终目标文件 ===
# Snakemake从这里反向推导需要执行的所有rule
rule all:
    input:
        expand("results/kraken2/{sample}_report.txt", sample=SAMPLES)
        # expand() 会展开为:
        # results/kraken2/sample1_report.txt
        # results/kraken2/sample2_report.txt

# === Rule 1: fastp 质控 ===
rule fastp_trim:
    input:
        r1 = "data/raw/{sample}_R1.fastq.gz",       # 原始正向reads
        r2 = "data/raw/{sample}_R2.fastq.gz"        # 原始反向reads
    output:
        r1 = "results/clean/{sample}_clean_R1.fastq.gz",   # 质控后正向
        r2 = "results/clean/{sample}_clean_R2.fastq.gz",   # 质控后反向
        html = "results/qc/{sample}_fastp.html",            # 质控报告
        json = "results/qc/{sample}_fastp.json"
    threads: 4                                        # 使用4个线程
    log:
        "logs/fastp/{sample}.log"                    # 日志文件
    shell:
        """
        fastp \
            -i {input.r1} -I {input.r2} \
            -o {output.r1} -O {output.r2} \
            --html {output.html} --json {output.json} \
            --qualified_quality_phred 20 \
            --length_required 50 \
            --thread {threads} \
            2> {log}
        """

# === Rule 2: Bowtie2 去宿主 ===
rule bowtie2_remove_host:
    input:
        r1 = "results/clean/{sample}_clean_R1.fastq.gz",
        r2 = "results/clean/{sample}_clean_R2.fastq.gz"
    output:
        r1 = "results/host_removed/{sample}_nohost_R1.fastq.gz",
        r2 = "results/host_removed/{sample}_nohost_R2.fastq.gz"
    params:
        host_db = HOSTDB                              # 宿主基因组索引
    threads: 8
    log:
        "logs/bowtie2/{sample}.log"
    shell:
        """
        bowtie2 -x {params.host_db} \
            -1 {input.r1} -2 {input.r2} \
            --very-sensitive \
            --threads {threads} \
            --un-conc-gz results/host_removed/{wildcards.sample}_nohost_R%.fastq.gz \
            -S /dev/null \
            2> {log}
        """
        # --un-conc-gz: 输出未比对上宿主的reads(即非宿主reads)
        # -S /dev/null: 不保存SAM文件(我们只要未比对的reads)

# === Rule 3: Kraken2 物种注释 ===
rule kraken2_classify:
    input:
        r1 = "results/host_removed/{sample}_nohost_R1.fastq.gz",
        r2 = "results/host_removed/{sample}_nohost_R2.fastq.gz"
    output:
        report = "results/kraken2/{sample}_report.txt",     # 分类报告
        output = "results/kraken2/{sample}_output.txt"       # 详细输出
    params:
        db = KRAKENDB
    threads: 8
    log:
        "logs/kraken2/{sample}.log"
    shell:
        """
        kraken2 --db {params.db} \
            --paired {input.r1} {input.r2} \
            --threads {threads} \
            --report {output.report} \
            --output {output.output} \
            --confidence 0.2 \
            2> {log}
        """

配套的config.yaml:

# config.yaml - Snakemake配置文件

samples:
  - sample1
  - sample2
  - sample3

host_db: "/data/db/bowtie2/human_genome"
kraken2_db: "/data/db/kraken2/standard_db"

运行命令:

# 预演模式(不实际执行,检查流程是否正确)
snakemake -n -j 8

# 正式运行(使用8个核心)
snakemake -j 8

# 可视化DAG
snakemake --dag | dot -Tpdf > dag.pdf

# 断点续跑(之前中断的任务重新运行)
snakemake -j 8 --rerun-incomplete

# 集群投递(SLURM为例)
snakemake -j 100 --cluster "sbatch -p normal -n {threads} -o {log}"

3.3 Git基本工作流

#!/bin/bash
# git_workflow.sh - 生信项目Git工作流
# 从创建仓库到日常提交的完整流程

# === 1. 初始化仓库 ===
cd ~/projects/metagenome_pipeline   # 进入项目目录
git init                             # 初始化Git仓库
# 输出: Initialized empty Git repository

# === 2. 创建 .gitignore ===
cat > .gitignore << 'EOF'
# 大数据文件
*.fastq
*.fastq.gz
*.bam
*.sam
data/

# 分析结果(可重新生成)
results/
output/

# 数据库
*_db/

# 临时文件
*.tmp
*.log
__pycache__/
.ipynb_checkpoints/
EOF

# === 3. 首次提交 ===
git add .gitignore
git add environment.yml
git add software_versions.txt
git add Snakefile
git add config.yaml
git add scripts/
# 注意:不要 git add . 因为可能会把大文件加进去
# 只添加需要追踪的文件

git commit -m "feat: 初始化宏基因组分析流程

- 添加 environment.yml 环境配置
- 添加 Snakefile 流程定义
- 添加分析脚本 (scripts/)
- 配置 .gitignore 忽略数据文件"

# === 4. 连接远程仓库(GitHub) ===
git remote add origin https://github.com/username/metagenome_pipeline.git
git branch -M main                  # 重命名默认分支为main
git push -u origin main             # 首次推送(-u 设置上游分支)

# === 5. 日常工作流 ===
# 修改了脚本后:
git status                           # 查看修改了哪些文件
git diff scripts/03_kraken2.sh       # 查看具体修改内容
git add scripts/03_kraken2.sh        # 添加修改的文件
git commit -m "fix: 修复Kraken2 confidence参数"   # 提交
git push                             # 推送到远程

# === 6. 查看历史 ===
git log --oneline -10                # 查看最近10条提交记录
# 输出示例:
# a1b2c3d fix: 修复Kraken2 confidence参数
# e4f5g6h feat: 添加Shannon多样性分析脚本
# i7j8k9l feat: 初始化宏基因组分析流程

# === 7. 分支管理(添加新功能时) ===
git checkout -b feature/diversity    # 创建并切换到新分支
# ... 在新分支上开发 ...
git add scripts/diversity.py
git commit -m "feat: 添加多样性分析模块"
git checkout main                    # 切回主分支
git merge feature/diversity          # 合并新功能
git branch -d feature/diversity      # 删除已合并的分支

3.4 environment.yml 模板

# ============================================================
# environment.yml - 肠道宏基因组分析流程环境配置
# Gut Metagenome Analysis Pipeline Environment
# ============================================================
#
# 使用方法:
#   创建环境: conda env create -f environment.yml
#   激活环境: conda activate metagenome_pipeline
#   更新环境: conda env update -f environment.yml
#   导出环境: conda env export > environment.yml
#
# 作者: 彭文强
# 日期: 2026-04
# ============================================================

name: metagenome_pipeline

channels:
  - conda-forge       # 社区维护频道(优先级最高)
  - bioconda          # 生信工具专用频道
  - defaults           # Anaconda官方频道

dependencies:
  # --- Python ---
  - python=3.9.18

  # --- 质控工具 ---
  - fastqc=0.12.1     # reads质量评估
  - multiqc=1.14      # 汇总多个QC报告
  - fastp=0.23.4      # reads清洗和过滤

  # --- 比对工具 ---
  - bowtie2=2.5.1     # 短reads比对(去宿主)
  - samtools=1.17     # SAM/BAM文件处理

  # --- 物种注释 ---
  - kraken2=2.1.3     # k-mer物种分类
  - bracken=2.8       # Kraken2丰度估计校正

  # --- 辅助工具 ---
  - seqkit=2.5.1      # FASTA/FASTQ瑞士军刀
  - csvtk=0.27.2      # CSV/TSV处理

  # --- 流程管理 ---
  - snakemake-minimal=7.32.4  # 工作流管理

  # --- Python包(pip安装) ---
  - pip:
    - pandas==2.0.3          # 数据分析
    - scipy==1.11.1          # 科学计算
    - matplotlib==3.7.2      # 基础绘图
    - scikit-learn==1.3.0    # 机器学习
    - scikit-bio==0.5.9      # 生态多样性计算

4. 面试常问点

★ 你怎么管理分析环境?conda怎么用?

参考答案:我用Conda管理分析环境,具体做法是: 1. 一个项目一个环境:比如宏基因组分析用metagenome环境,16S分析用amplicon环境,避免依赖冲突 2. 创建环境conda create -n metagenome python=3.9,然后从bioconda频道安装生信工具 3. 导出环境:完成后用conda env export > environment.yml锁定所有软件版本 4. 加速安装:用Mamba替代Conda,解析依赖快10-50倍

💡 加分回答:在我的肠道宏基因组项目中,我配套了environment.ymlsoftware_versions.txt,保证换一台机器也能用conda env create -f environment.yml一条命令还原整个分析环境。

★ 如何保证分析流程可复现?

参考答案:我从三个层面保证可复现性: 1. 环境锁定environment.yml记录所有软件及其版本号 2. 流程脚本化:所有分析步骤写成Shell脚本或Snakemake流程,不手动执行命令 3. 版本记录software_versions.txt记录每个工具的版本,脚本加set -euo pipefail错误处理

💡 加分回答:在我的个人项目中,我的15个分析脚本都有编号和中文注释,配合environment.yml和运行日志,一键bash run_all.sh就能从FASTQ复现到最终结果。同时用Git追踪脚本的修改历史。

★ Snakemake的优势是什么?和直接写Shell脚本比?

参考答案

对比项 Shell脚本 Snakemake
断点续跑 需要手动处理 自动(通过文件时间戳判断)
并行执行 需要手动&wait 自动(通过DAG调度)
依赖管理 靠脚本顺序 显式声明(input/output)
集群投递 需要写投递脚本 一个--cluster参数搞定
扩展性 加样本要改脚本 expand()自动扩展

💡 加分回答:在实习中,我主要用Shell脚本批处理(因为百迈客有现成流程),但在个人项目中我了解了Snakemake,它的DAG驱动特别适合宏基因组这种多步骤、多样本的流程。如果中途某个样本的一步失败了,只需要snakemake --rerun-incomplete就能从断点继续。

★ Docker和Conda的区别?

参考答案: - Conda包级别的隔离:不同环境有不同版本的软件,但共享操作系统 - Docker操作系统级别的隔离:打包了整个运行环境(OS+依赖+软件),完全独立

打比方:Conda像是在同一个房子里隔出不同的房间,Docker像是给你一整栋独立的房子。

选择建议: - 日常开发和HPC集群用Conda(轻量、无需root) - 生产环境和发表用Docker/Singularity(完全可复现) - HPC上用Singularity代替Docker(不需要root权限)

★ 你用Git做什么?

参考答案:在我的个人项目中,我用Git做三件事: 1. 版本追踪:跟踪分析脚本、Snakefile、environment.yml的修改历史 2. 备份:推送到GitHub作为远程备份 3. 可复现:别人clone我的仓库,按README步骤就能复现分析

我的.gitignore配置了忽略大数据文件(.fastq.gz)和分析结果(results/),只追踪脚本和配置文件。

★ environment.yml包含什么内容?

参考答案:environment.yml是Conda环境的配置文件,包含四个部分: 1. name:环境名称(如metagenome_pipeline) 2. channels:软件来源频道(conda-forge, bioconda, defaults) 3. dependencies:所有安装的包及其精确版本号(如kraken2=2.1.3) 4. pip子项:通过pip安装的Python包(如pandas==2.0.3

conda env export > environment.yml导出,用conda env create -f environment.yml还原。

⚠️ 注意:建议手动编辑yml,只保留直接安装的包,去掉自动依赖,这样跨平台还原时不容易出冲突。


5. 易错/易混淆点

⚠️ conda activate vs source activate

# 新版Conda(4.6+)推荐用:
conda activate metagenome     # 推荐

# 旧版用法(可能在老服务器上遇到):
source activate metagenome    # 旧版

# 如果 conda activate 报错:
# CommandNotFoundError: Your shell has not been properly configured
# 需要先运行:
conda init bash
# 然后重启终端

⚠️ Snakemake的rule all作用

# rule all 不执行任何命令
# 它的作用是定义最终目标文件(告诉Snakemake"我要什么")

# 正确理解:
rule all:
    input:
        expand("results/{sample}_report.txt", sample=SAMPLES)
# Snakemake从这些目标文件反向推导需要执行哪些rule

# 常见错误:以为rule all会执行第一个
# 实际上:Snakemake是从output到input反向推导的

⚠️ Docker vs Singularity在HPC上的限制

Docker:
- 需要 root 权限(普通用户无法运行)
- 存在安全隐患(root权限可能影响整个集群)
- HPC管理员通常禁用Docker

Singularity:
- 不需要 root 权限(普通用户可直接使用)
- 可以直接使用 Docker 镜像(singularity pull docker://...)
- HPC集群的标准选择

结论:HPC上用Singularity,本地开发可以用Docker

⚠️ Git的.gitignore应该忽略什么

必须忽略(文件太大):
✗ 原始数据:*.fastq.gz, *.bam, *.sam
✗ 数据库文件:*_db/, *.k2d
✗ 分析结果:results/, output/

必须追踪(核心资产):
✓ 分析脚本:scripts/*.sh, scripts/*.py
✓ 流程文件:Snakefile, *.smk
✓ 环境配置:environment.yml
✓ 项目配置:config.yaml
✓ 版本记录:software_versions.txt
✓ 说明文档:README.md

常见错误:
✗ 把.fastq.gz加入Git → 仓库膨胀到几十GB
✗ 忘记追踪environment.yml → 环境不可复现

⚠️ Snakemake通配符 wildcards 理解

# {sample} 是通配符,Snakemake自动匹配
rule fastp:
    input:
        "data/{sample}_R1.fastq.gz"     # {sample} = sample1, sample2, ...
    output:
        "results/{sample}_clean.fastq.gz"

# 常见错误:在shell命令中直接写 {sample}
# 正确:用 {wildcards.sample}(在shell块中)或 {input}/{output}(引用文件)
    shell:
        "fastp -i {input} -o {output}"   # 正确
        # "fastp -i data/{sample}_R1.fastq.gz"  # 错误!shell中需要 {wildcards.sample}

6. 快速复习卡片

问题 一句话答案
Conda创建环境 conda create -n name python=3.9
Conda导出环境 conda env export > environment.yml
Conda还原环境 conda env create -f environment.yml
Mamba是什么 Conda的C++加速替代品,解析依赖快10-50倍
bioconda是什么 生信专用的Conda频道,包含几乎所有生信工具
Snakemake核心 声明式、DAG驱动、增量计算
rule all作用 定义最终目标文件,驱动反向推导
Snakemake断点续跑 snakemake --rerun-incomplete
Docker vs Conda Docker=OS级隔离,Conda=包级隔离
HPC用什么容器 Singularity(不需要root权限)
Git追踪什么 脚本、配置文件、environment.yml
Git忽略什么 原始数据、数据库、分析结果
nf-core是什么 Nextflow社区预构建流程集合(100+流程)
可复现三要素 environment.yml + 脚本化流程 + 版本记录

版本动态提示

面试前建议自行确认工具最新版本(conda search 工具名 或查看官方 GitHub),以下为编写时参考:

工具 参考版本 趋势
Snakemake v8+ v8 起引入插件化架构(存储/执行器可插件化),面试可提及
Conda/Mamba mamba 持续主流 bioconda/conda-forge 双频道仍是生信标配
QIIME2 持续更新 面试前查官网确认最新版本号

面试加分话术: - "Snakemake 新版引入了插件化架构,执行后端、存储后端都可以通过插件扩展,比早期版本更灵活" - "我日常用 mamba 替代 conda,依赖解析速度快 10-50 倍,特别是安装复杂的生信工具组合时效果很明显"